web-dev-qa-db-ja.com

コンテンツモデレーションを使用してエンティティの(D8コア)ワークフロー状態をプログラムで変更するにはどうすればよいですか?

Drupal 8.4-rc2を使用しています。ワークフローモジュールとコンテンツ管理モジュールを有効にすると、編集ワークフローが自動的に取得されますデモとして。

状態は次のとおりです。

  • アーカイブ済み
  • ドラフト
  • 公開済み

移行は次のとおりです。

  • 新しいドラフトを作成(ドラフト/公開からドラフトへ)
  • 公開(ドラフト/公開から公開へ)

プログラムでトランジションを呼び出すにはどうすればよいですか?または、トランジションを呼び出さずにプログラムで状態を変更するにはどうすればよいですか?

具体的には、コンテンツの管理の対象となるノードがあります(状態:アーカイブ済み、下書き、公開済み)。デフォルトでは、ノードの編集ページでは、ノードは元の状態で保存されます(そのため、ドラフトノードはドラフトとして保存されます)。送信ハンドラを使用して2番目のボタンを「発行済みとして保存」を追加したいのですが、プログラムで状態を変更する方法がわかりません。

これまでに理解しているのは、ワークフローはエンティティであり、状態でもあるということです。これは、Drupal 7とは異なります。ほとんどのワークフロータイプのモジュールは、何が起こっているのかを追跡するためにフィールドを使用していました。

Examples モジュールをチェックしましたが、構成管理/ワークフローにはまだ何もありません。

4
Patrick Kenny

素晴らしい例は コンテンツ管理モジュールのコード にあります。

$entity->set('moderation_state', $new_state);
if ($entity instanceof RevisionLogInterface) {
  $entity->setRevisionLogMessage($form_state->getValue('revision_log'));
  $entity->setRevisionUserId($this->currentUser()->id());
}
$entity->save();
10

私はまだD8を多用していませんが、D7のワークベンチのモデレーションモジュールでは、ノードに下書きまたは公開されたmoderation_stateフィールドがありました。 D7の遷移は通常、ユーザーロールワークフローに対するものでしたが、コードでは通常、node_loadおよびnode_save ...を介してノードの状態を直接変更しました。D8がd7モジュールから発想を得ている場合、実装は同様です。

ここで参照されているテストは、例のリンクにあります https://www.drupal.org/docs/8/core/modules/workflows/overview と、ノードのモデレートフィールドの変更例はこちら- http://cgit.drupalcode.org/drupal/tree/core/modules/content_moderation/tests/src/Functional/ModerationStateNodeTest.php

2
tenken