Changer l'état du plan de travail de Brouillon à Publié par programme

8

Je voudrais faire une opération en bloc et changer les nœuds d'un état de brouillon à publié. J'ai créé une nouvelle révision à partir d'une modification précédente, mais toutes les révisions sont définies par défaut sur Brouillon. Maintenant, je voudrais simplement publier la nouvelle révision. (J'utilise le module Workbench.)

J'ai essayé de faire des choses comme ci-dessous, mais aucune ne semble fonctionner:

$node->workbench_moderation['current']->published = "1";

ou

$node->workbench_moderation['current']->from_state = "draft";
$node->workbench_moderation['current']->state = "published";
$node->workbench_moderation['current']->published = "1";

$node->workbench_moderation['published']->from_state = "draft";
$node->workbench_moderation['published']->state = "published";
$node->workbench_moderation['published']->published = "1";

$node->workbench_moderation['my_revision']->from_state = "draft";
$node->workbench_moderation['my_revision']->state = "published";
$node->workbench_moderation['my_revision']->published = "1";
$node->workbench_moderation['my_revision']->current = TRUE;

ou

workbench_moderation_moderate($node, 'published');

J'ai essayé d'enregistrer en utilisant plutôt que ci-dessous node_save, pensant peut-être que cela a node_savedéclenché un nouveau projet.

workbench_moderation_node_update($node);

Je veux simplement charger le nœud, publier le brouillon, puis l'enregistrer à nouveau.

Une idée de ce que je fais mal?

Keven
la source

Réponses:

11

J'ai trouvé deux solutions qui fonctionneront:

La première:

$nid = 1234;
$node = node_load($nid);
$node->body['und'][0]['value'] = 'new body';
$node->revision = 1;
$node->log = 'State Changed to published';
node_save($node);
workbench_moderation_moderate($node, 'published');

REMARQUE: j'ai intentionnellement mis workbench_moderation_moderate()après node_save()parce que dans mon cas node_save()va déclencher un nouveau projet. Une fois le brouillon créé, je le publie.

La deuxième:

$nid = 1234;
$node = node_load($nid);
$node->body['und'][0]['value'] = 'new body';
$node->workbench_moderation_state_new = workbench_moderation_state_published();
$node->revision = 1;
$node->log = 'State Changed to published';
node_save($node);

Je vais avec la première solution sur la deuxième solution à cause des messages d'état. Le premier montre les deux messages sous la révision actuelle:

From Draft --> Published on...
From Published --> Draft on... 

alors que la deuxième solution n'affiche qu'un seul message qui n'a pas vraiment de sens:

From Published --> Published on...
Keven
la source
0

@Keven

La deuxième solution est la bonne! Il vous suffit de charger la révision la plus récente avec node_load. node_save () déclenche la fonction workbench_moderation_moderate () afin que vous n'ayez pas à le faire manuellement après node_save ()!

$query = db_select('workbench_moderation_node_history', 'wmnh');
$query->addField('wmnh', 'vid');
$query->condition('wmnh.nid', $nid);
$query->condition('wmnh.current', 1);
$current = $query->execute()->fetchField();

// or you can get the latest revision id by loading the node without revision id:
$node = node_load($nid);
// Altough you can get node revision id from node object itself i prefer using the workbench_moderation property.
// $current = $node->vid;
$current = $node->workbench_moderation['current']->vid;

$node = node_load($nid, $current);
$node->workbench_moderation_state_new = workbench_moderation_state_published();
$node->revision = 1;
node_save($node);
user27207
la source