Alterar o estado do ambiente de trabalho de rascunho para publicado programaticamente

8

Gostaria de fazer uma operação em massa e alterar os nós de um estado de Rascunho para Publicado. Criei uma nova revisão a partir de uma alteração anterior, mas todas as revisões assumem o padrão de Rascunho. Agora, basicamente, gostaria de publicar apenas a nova revisão. (Estou usando o módulo Workbench.)

Eu tentei fazer coisas como a abaixo, mas nenhuma delas parece funcionar:

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

Eu tentei salvar usando o abaixo e não node_savetambém, pensando que talvez tenha node_savedesencadeado um novo rascunho.

workbench_moderation_node_update($node);

Eu só quero carregar o nó, publicar o rascunho e salvá-lo novamente.

Alguma idéia do que estou fazendo de errado?

Keven
fonte

Respostas:

11

Existem duas soluções que eu achei que funcionariam:

O primeiro:

$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: Eu intencionalmente coloquei workbench_moderation_moderate()depois, node_save()porque no meu caso node_save()acionará um novo rascunho. Após a criação do rascunho, publico esse rascunho.

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

Eu estou indo com a primeira solução sobre a segunda solução por causa das mensagens de status. O primeiro mostra as duas mensagens na revisão atual:

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

enquanto a segunda solução mostra apenas uma mensagem que não faz muito sentido:

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

@Keven

A segunda solução é a correta! Você só precisa carregar a revisão mais recente com o node_load. node_save () aciona a função workbench_moderation_moderate () para que você não precise fazer isso depois 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);
user27207
fonte