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


8

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 unten stehenden zu speichern, anstatt zu node_savedenken, vielleicht hat das node_saveeinen 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?

Antworten:


11

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 absichtlich setzen workbench_moderation_moderate()nach , node_save()weil in meinem Fall node_save()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...

0

@ 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 dies nicht nach node_save () manuell tun 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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.