Измените состояние Workbench с черновика на опубликованное программно

8

Я хотел бы выполнить массовую операцию и изменить узлы из состояния Черновик в Опубликованный. Я создал новую ревизию из предыдущего изменения, но все ревизии по умолчанию имеют черновик. Теперь я хотел бы просто опубликовать новую версию. (Я использую модуль Workbench.)

Я пытался сделать что-то вроде ниже, но ни один из них, кажется, не работает:

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

или

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

или

workbench_moderation_moderate($node, 'published');

Я попытался сохранить, используя нижеприведенное, а не node_saveтак хорошо, подумав, может быть, node_saveвызвал новый проект.

workbench_moderation_node_update($node);

Я просто хочу просто загрузить узел, опубликовать черновик, а затем сохранить его снова.

Есть идеи, что я делаю не так?

Keven
источник

Ответы:

11

Есть два решения, которые я нашел, будет работать:

Первый:

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

ПРИМЕЧАНИЕ: я намеренно ставлю workbench_moderation_moderate()после, node_save()потому что в моем случае node_save()вызовет новый проект. После создания черновика я публикую этот черновик.

Второй:

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

Я иду с первым решением по второму решению из-за сообщений о состоянии. Первое показывает два сообщения под текущей ревизией:

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

тогда как второе решение показывает только одно сообщение, которое не имеет особого смысла:

From Published --> Published on...
Keven
источник
0

@Keven

Второе решение является правильным! Вам просто нужно загрузить самую последнюю версию с помощью node_load. node_save () запускает функцию workbench_moderation_moderate (), поэтому вам не нужно делать это после 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);
user27207
источник