Cambiar el estado de Workbench de Borrador a Publicado programáticamente

8

Me gustaría hacer una operación masiva y cambiar los nodos de un estado de borrador a publicado. Creé una nueva revisión a partir de un cambio anterior, pero todas las revisiones están predeterminadas en Borrador. Ahora me gustaría básicamente publicar la nueva revisión. (Estoy usando el módulo Workbench).

He intentado hacer cosas como las siguientes, pero ninguna parece funcionar:

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

Intenté guardar usando el siguiente en lugar de node_savetambién, pensando que tal vez node_savedesencadenó un nuevo borrador.

workbench_moderation_node_update($node);

Solo quiero cargar el nodo, publicar el borrador y luego guardarlo nuevamente.

¿Alguna idea de lo que estoy haciendo mal?

Keven
fuente

Respuestas:

11

Hay dos soluciones que he encontrado que funcionarán:

El primero:

$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: Puse intencionalmente workbench_moderation_moderate()después node_save()porque en mi caso node_save()activará un nuevo borrador. Después de crear el borrador, publico ese borrador.

El segundo:

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

Voy con la primera solución sobre la segunda solución debido a los mensajes de estado. El primero muestra los dos mensajes bajo la revisión actual:

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

mientras que la segunda solución solo muestra un mensaje que realmente no tiene mucho sentido:

From Published --> Published on...
Keven
fuente
0

@Keven

¡La segunda solución es la correcta! Solo tiene que cargar la revisión más reciente con node_load. node_save () activa la función workbench_moderation_moderate () para que no tenga que hacerlo después de node_save () manualmente.

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