Czy mogę programowo utworzyć nową wersję węzła, tak aby nowa wersja nie stała się „aktualną”?

9

Ilekroć mój import kanałów znajduje nową wersję istniejącego fragmentu treści, tworzy nową wersję tego węzła zamiast nadpisywania danych.

Zwykle nowa wersja staje się od razu „aktualna”. Chciałbym jednak, aby aktualnie wyświetlana wersja pozostała taka sama, i niech moderator zdecyduje później, czy nowa powinna zostać opublikowana.

Letharion
źródło
1
Czy próbowałeś używać Workbench Moderation, Workflow lub dowolnego z modułów, które robią to samo?
mpdonadio
Nie mam Początkowo zakładałem, że ponieważ tworzę węzeł w kodzie, nie miały zastosowania. Być może tak nie jest.
Letharion

Odpowiedzi:

13

Standardowa instalacja Drupal nie pozwala na utworzenie wersji „Oczekującej”. Masz dwie opcje:

  1. Programowo utwórz nową wersję, ale programowo powróć do oryginalnej wersji (która tworzy jeszcze nowszą wersję, ale ma oryginalną treść)
  2. (Zalecane) Użyj Moderacja, weryfikacja lub przepływ pracy Workbench, które są dobrze przemyślanymi rozwiązaniami do kontroli wersji i / lub kontroli dostępu.

Dla opcji 1: Możesz dodać ten kod jako nową Regułę lub użyć go w nowym module

<?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');
?>

W przypadku opcji 2: zaleciłbym Workbench zamiast zmiany lub przepływu pracy, ale każda jest inna w zależności od potrzeb. Workbench jest swego rodzaju następcą Revisioning, a Workflow to znacznie więcej niż tylko kontrola wersji, więc może, ale nie musi, dobrze pasować do twoich potrzeb.

Oto szybki podział na różnice między Workbench a Workflow.

Johnathan Elmore
źródło
Pierwsza opcja byłaby świetna, ale jak mogę przywrócić?
Letharion
Dodano kod dla opcji 1, ale tak naprawdę opcja 2 jest prawdopodobnie najlepszym wyborem, ponieważ dodaje funkcjonalność do obsługi, która wersja jest aktualna, zamiast po prostu duplikować oryginał w kółko
Johnathan Elmore
link jest zepsuty
digitgopher
Gdzie pisać w hook_form_alter?
KTM
link naprawiony. @IcecreamJelly, spróbuj hook_node_update.
Johnathan Elmore
2

To przypuszczenie, ale dałbym szansę na podmoduł Moderacja Workbench w module Workbench . Zauważyłem, że jest to o wiele łatwiejsze do skonfigurowania niż Workflow .

Fakt, że tworzysz węzły w kodzie, nie powinien mieć znaczenia, o ile node_save()działa jako użytkownik z odpowiednimi ustawieniami dla typu zawartości (stany moderacji są obsługiwane za pomocą interfejsu API węzła). Może to jednak oznaczać, że musisz wykonać kilka sesji shenanigans, aby wykonać zadania jako właściwy użytkownik, gdy działa Feeds.

mpdonadio
źródło
2
+1 moderacja stołu roboczego jest wspaniałym modułem, z którego korzystam już od dłuższego czasu
Clive