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

9

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.

Létharion
la source
1
Avez-vous essayé d'utiliser Workbench Moderation, Workflow ou l'un des modules qui font la même chose?
mpdonadio
Non. J'ai d'abord supposé que parce que je créais le nœud en code, ils ne s'appliquaient pas. Ce n'est peut-être pas le cas.
Letharion

Réponses:

13

Une installation standard de 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 une ventilation rapide des différences entre Workbench et Workflow.

Johnathan Elmore
la source
La première option serait formidable, mais comment puis-je effectuer le retour?
Letharion
Ajout du code pour l'option 1, mais vraiment l'option 2 est probablement votre meilleur pari car il ajoute des fonctionnalités pour gérer la version actuelle, au lieu de simplement dupliquer l'original maintes et maintes fois
Johnathan Elmore
le lien est rompu
digitgopher
Où écrire dans hook_form_alter?
KTM
lien fixe. @IcecreamJelly, essayez hook_node_update.
Johnathan Elmore
2

C'est une supposition, mais je donnerais une chance 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 le code ne devrait pas avoir d'importance, tant que les node_save()exécutions 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.

mpdonadio
la source
2
+1 la modération de l'établi est un superbe module que je l'utilise depuis un bon moment maintenant
Clive