Могу ли я программно создать новую ревизию узла, чтобы новая ревизия не стала «текущей»?

9

Всякий раз, когда мой импорт фидов находит новую версию существующего фрагмента контента, он создает новую ревизию этого узла вместо перезаписи данных.

Обычно новая ревизия сразу становится «текущей». Я хотел бы, чтобы отображаемая в настоящее время ревизия осталась прежней, и пусть модератор решит позже, должна ли быть опубликована новая.

Letharion
источник
1
Вы пытались использовать модерацию Workbench, Workflow или любой из модулей, которые делают то же самое?
mpdonadio
У меня нет Я изначально предполагал, что, поскольку я создаю узел в коде, они не применяются. Возможно, это не тот случай.
Летарион

Ответы:

13

Стандартная установка Drupal не позволяет вам создать «ожидающую» ревизию. У вас есть два варианта:

  1. Программно создайте новую ревизию, но программно вернитесь к исходной ревизии (которая создает еще более новую ревизию, но имеет исходное содержимое)
  2. (Рекомендуется) Используйте модерацию, ревизию или рабочий процесс Workbench, которые являются хорошо продуманными решениями для контроля версий и / или контроля доступа.

Для варианта 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 over Revisioning или Workflow, но каждый из них отличается в зависимости от ваших потребностей. Workbench является своего рода преемником Revisioning, а Workflow - это намного больше, чем просто контроль версий, поэтому он может подходить или не соответствовать вашим потребностям.

Вот краткий обзор различий между Workbench и Workflow.

Джонатан Элмор
источник
Первый вариант был бы отличным, но как мне сделать возврат?
Летарион
Добавлен код для варианта 1, но на самом деле вариант 2 - это, вероятно, ваша лучшая ставка, поскольку он добавляет функциональность для обработки текущей версии, а не просто дублирует оригинал снова и снова
Джонатан Элмор
ссылка не работает
Digitgopher
Куда писать в hook_form_alter?
KTM
ссылка исправлена. @IcecreamJelly, попробуйте hook_node_update.
Джонатан Элмор
2

Это предположение, но я бы попробовал субмодуль Workbench Moderation в модуле Workbench . Я обнаружил, что это гораздо проще настроить, чем рабочий процесс .

Тот факт, что вы создаете узлы в коде, не должен иметь значения, если node_save()пользователь работает с надлежащими настройками для типа контента (состояния модерации обрабатываются с помощью API узла). Это может означать, тем не менее, что вам нужно сделать некоторые сессионные изменения, чтобы сделать все как должный пользователь при запуске Feeds.

mpdonadio
источник
2
+1 модерация рабочего места - превосходный модуль, которым я уже давно пользуюсь
Клайв