Cambia lo stato di Workbench da Bozza a Pubblicato programmaticamente


8

Vorrei eseguire un'operazione in blocco e cambiare i nodi da uno stato di Bozza a Pubblicato. Ho creato una nuova revisione da una modifica precedente, ma tutte le revisioni predefinite sono Bozze. Ora vorrei semplicemente pubblicare la nuova revisione. (Sto usando il modulo Workbench.)

Ho provato a fare cose come la seguente, ma nessuna di queste sembra funzionare:

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

o

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

o

workbench_moderation_moderate($node, 'published');

Ho provato a salvare usando il sotto piuttosto che node_saveanche, pensando che forse ha node_saveinnescato una nuova bozza.

workbench_moderation_node_update($node);

Voglio semplicemente caricare il nodo, pubblicare la bozza, quindi salvarla di nuovo.

Hai idea di cosa sto facendo di sbagliato?

Risposte:


11

Ci sono due soluzioni che ho trovato funzionerà:

Il primo:

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

NOTA: ho intenzionalmente messo workbench_moderation_moderate()dopo node_save()perché nel mio caso node_save()si innescherà una nuova bozza. Dopo aver creato la bozza, pubblico quella bozza.

Il secondo:

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

Vado con la prima soluzione rispetto alla seconda soluzione a causa dei messaggi di stato. Il primo mostra i due messaggi nella revisione corrente:

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

mentre la seconda soluzione mostra solo un messaggio che non ha molto senso:

From Published --> Published on...

0

@Keven

La seconda soluzione è quella corretta! Devi solo caricare la revisione più recente con node_load. node_save () attiva la funzione workbench_moderation_moderate () in modo da non doverlo fare manualmente dopo 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.