it-swarm.com.de

Ändern Sie den Workbench-Status programmgesteuert von Entwurf in Veröffentlicht

Ich möchte eine Massenoperation ausführen und Knoten von einem Entwurfsstatus in "Veröffentlicht" ändern. Ich habe eine neue Revision aus einer früheren Änderung erstellt, aber alle Revisionen sind standardmäßig Entwurf. Jetzt möchte ich im Grunde nur die neue Revision veröffentlichen. (Ich verwende das Workbench-Modul.)

Ich habe versucht, Dinge wie die folgenden zu tun, aber keine davon scheint zu funktionieren:

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

oder

$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;

oder

workbench_moderation_moderate($node, 'published');

Ich habe versucht, mit dem folgenden zu speichern, anstatt node_save auch, vielleicht denken die node_save hat einen neuen Entwurf ausgelöst.

workbench_moderation_node_update($node);

Ich möchte nur den Knoten laden, den Entwurf veröffentlichen und dann erneut speichern.

Irgendeine Idee, was ich falsch mache?

8
Keven

Ich habe zwei Lösungen gefunden, die funktionieren werden:

Der Erste :

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

HINWEIS: Ich habe absichtlich workbench_moderation_moderate() nach node_save() gesetzt, weil in meinem Fall node_save() wird einen neuen Entwurf auslösen. Nachdem der Entwurf erstellt wurde, veröffentliche ich diesen Entwurf.

Der zweite :

$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);

Ich gehe mit der ersten Lösung über die zweite Lösung wegen der Statusmeldungen. Die erste zeigt die beiden Meldungen unter der aktuellen Version:

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

wohingegen die zweite Lösung nur eine Nachricht zeigt, die nicht wirklich Sinn macht:

From Published --> Published on...
11
Keven

@ Keven

Die zweite Lösung ist die richtige! Sie müssen nur die letzte Revision mit node_load laden. node_save () löst die Funktion workbench_moderation_moderate () aus, sodass Sie sie nach node_save () nicht manuell ausführen müssen!

$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);
0
user27207