我可以以编程方式创建新的节点修订版本,而新的修订版本不成为“当前”版本吗?


9

每当我的feed导入找到现有内容的新版本时,它都会为此节点创建一个新修订,而不是覆盖数据。

通常,新修订版立即成为“当前”修订版。我希望当前显示的修订版本保持不变,并让主持人稍后决定是否发布新版本。


1
您是否尝试过使用Workbench审核,工作流或执行相同功能的任何模块?
mpdonadio

我没有 我最初以为是因为我在代码中创建了节点,所以它们不适用。也许不是这样。
Letharion

Answers:


13

标准的Drupal安装不允许您创建“待定”修订。您有两种选择:

  1. 以编程方式创建一个新修订,但以编程方式还原为原始修订(这会创建一个更新的修订,但具有原始内容)
  2. (推荐)使用工作台审核,修订或工作流,它们是版本控制和/或访问控制的深思熟虑的解决方案。

对于选项1:您可以将此代码添加为新规则或在新模块中使用

<?php
  // Programatically load the existing revision and save it
  // Taken from http://api.drupal.org/api/drupal/modules!node!node.module/function/node_save/7
  // Load the revision
  $original_revision = node_load($nid);
  $original_revision->revision = 1;
  $original_revision->log = t('Copy of the revision from %date.', array('%date' => format_date($original_revision->revision_timestamp)));

  $new_revision = node_load($nid);
  // Make any changes to the new revision here...
  $new_revision->revision = 1;
  $new_revision->log = t('Summarize your changes here');

  // Save the new revision first
  node_save($new_revision);

  // Save the original one again so that it is still the current revision
  node_save($original_revision);

  watchdog('content', '@type: reverted %title revision %revision.', array('@type' => $node_revision->type, '%title' => $node_revision->title, '%revision' => $node_revision->vid));
  drupal_set_message(t('@type %title was saved with a new revision, but reverting to original revision from %revision-date.', array('@type' => node_type_get_name($node_revision), '%title' => $node_revision->title, '%revision-date' => format_date($node_revision->revision_timestamp))));
  drupal_goto('node/' . $node_revision->nid . '/revisions');
?>

对于选项2:我建议使用Workbench而不是Revisioning或Workflow,但根据您的需要,它们各不相同。Workbench是Revisioning的后继者,而Workflow不仅仅是版本控制,因此它可能无法满足您的需求。

这是关于Workbench和Workflow之间差异的快速细分


第一个选择很棒,但是我该如何还原呢?
Letharion 2012年

添加了选项1的代码,但实际上选项2可能是您最好的选择,因为它增加了处理当前版本的功能,而不是一遍又一遍地复制原始版本
Johnathan Elmore 2012年

链接已断开
digitgopher 2015年

在哪里写hook_form_alter?
KTM

链接固定。@IcecreamJelly,尝试hook_node_update。
Johnathan Elmore

2

这是一个猜测,但是我会给Workbench模块中的Workbench Moderation子模块一个镜头。我发现这比Workflow设置起来容易得多。

只要node_save()使用具有正确的内容类型设置的用户身份运行(使用节点API处理审核状态),您就无需在代码中创建节点这一事实就无关紧要。不过,这可能意味着您需要执行一些会话技巧,才能在Feeds运行时以适当的用户身份完成操作。


2
+1工作台审核是一个很棒的模块,我已经使用了一段时间了
Clive
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.