¿Puedo crear programáticamente una nueva revisión de nodo, sin que la nueva revisión se convierta en la "actual"?

9

Cada vez que mi importación de feeds encuentra una nueva versión de un contenido existente, crea una nueva revisión de este nodo en lugar de sobrescribir los datos.

Normalmente, la nueva revisión se convierte en la "actual" de inmediato. Sin embargo, me gustaría que la revisión que se muestra actualmente permanezca igual, y deje que un moderador decida más adelante si se debe publicar la nueva.

Letharion
fuente
1
¿Has intentado usar Workbench Moderation, Workflow o alguno de los módulos que hacen lo mismo?
mpdonadio
No tengo Inicialmente supuse que debido a que creo el nodo en código, no se aplicaron. Quizás ese no sea el caso.
Letharion

Respuestas:

13

Una instalación estándar de Drupal no le permite crear una revisión "Pendiente". Tienes dos opciones:

  1. Programáticamente cree una nueva revisión, pero regrese programáticamente a la revisión original (que crea una revisión aún más nueva, pero tiene el contenido original)
  2. (Recomendado) Use Workbench Moderation, Revisioning o Workflow, que son soluciones bien pensadas para el control de versiones y / o control de acceso.

Para la opción 1: puede agregar este código como una nueva regla o usarlo en un nuevo módulo

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

Para la opción 2: recomendaría Workbench sobre Revisión o Flujo de trabajo, pero cada uno es diferente dependiendo de sus necesidades. Workbench es el sucesor de Revisioning, y Workflow es mucho más que un simple control de versión, por lo que puede o no ser adecuado para sus necesidades.

Aquí hay un desglose rápido sobre las diferencias entre Workbench y Workflow.

Johnathan Elmore
fuente
La primera opción sería genial, pero ¿cómo hago la reversión?
Letharion
Agregó el código para la opción 1, pero realmente la opción 2 es probablemente su mejor opción porque agrega funcionalidad para manejar qué versión es la actual, en lugar de simplemente duplicar el original una y otra vez
Johnathan Elmore
el enlace está roto
digitgopher
¿Dónde escribir en hook_form_alter?
KTM
Enlace fijo. @IcecreamJelly, prueba hook_node_update.
Johnathan Elmore
2

Esto es una suposición, pero le daría una oportunidad al submódulo de Moderación de Workbench en el módulo Workbench . He encontrado esto mucho más fácil de configurar que Workflow .

El hecho de que esté creando nodos en el código no debería importar, siempre y cuando se node_save()ejecute como un usuario con la configuración adecuada para el tipo de contenido (los estados de moderación se manejan con la API del nodo). Sin embargo, esto puede significar que debe hacer algunas travesuras de sesión para hacer que el usuario adecuado haga las cosas cuando se ejecuta Feeds.

mpdonadio
fuente
2
La moderación de +1 workbench es un módulo excelente que lo he estado usando durante bastante tiempo
Clive