プログラムでワークベンチの状態を下書きから公開済みに変更する


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

ノードをロードし、ドラフトを公開して、もう一度保存したいだけです。

私が間違っていることは何か考えていますか?

回答:


11

私が機能することがわかった2つの解決策があります:

最初:

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

ステータスメッセージのため、2番目のソリューションよりも最初のソリューションを使用します。1つ目は、現在のリビジョンの2つのメッセージを示しています。

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

一方、2番目のソリューションでは、あまり意味のないメッセージが1つしか表示されません。

From Published --> Published on...

0

@Keven

2番目のソリューションは正しいものです!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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.