web-dev-qa-db-fra.com

Puis-je créer par programmation une nouvelle révision de nœud, sans que la nouvelle révision devienne la révision "actuelle"?

Chaque fois que mon importation de flux trouve une nouvelle version d'un élément de contenu existant, il crée une nouvelle révision de ce nœud au lieu de remplacer les données.

Normalement, la nouvelle révision devient immédiatement "actuelle". Je voudrais cependant que la révision actuellement affichée reste la même, et laisser un modérateur décider plus tard si la nouvelle doit être publiée.

9
Letharion

Une installation standard Drupal ne vous permet pas de créer une révision "En attente". Vous avez deux options:

  1. Créer par programmation une nouvelle révision mais revenir par programmation à la révision d'origine (ce qui crée une révision encore plus récente, mais elle a le contenu d'origine)
  2. (Recommandé) Utilisez la Modération, la Révision ou le Workflow de Workbench qui sont des solutions bien pensées pour le contrôle de version et/ou le contrôle d'accès.

Pour l'option 1: vous pouvez ajouter ce code en tant que nouvelle règle ou l'utiliser dans un nouveau 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');
?>

Pour l'option 2: je recommanderais Workbench plutôt que Révision ou Workflow, mais chacun est différent selon vos besoins. Workbench est en quelque sorte le successeur de Revisioning, et Workflow est bien plus qu'un simple contrôle de version, il peut donc ou non convenir à vos besoins.

Voici un ventilation rapide sur les différences entre Workbench et Workflow.

13
Johnathan Elmore

C'est une supposition, mais je donnerais un coup au sous-module Workbench Moderation dans le module Workbench . J'ai trouvé cela beaucoup plus facile à configurer que Workflow .

Le fait que vous créez des nœuds dans du code ne devrait pas avoir d'importance, tant que la node_save() s'exécute en tant qu'utilisateur avec les paramètres appropriés pour le type de contenu (les états de modération sont gérés avec l'API de nœud). Cela peut signifier, cependant, que vous devez effectuer des manigances de session pour faire avancer les choses en tant qu'utilisateur approprié lors de l'exécution de Feeds.

2
mpdonadio