ワークフローを使う
組織でサイトを運用するような場面では、管理者、編集者など、適切な権限が与えられたユーザーで安全に管理できることが求められます。その際に利用できるのがワークフロー機能です。Drupal 8以前はコントリビュートモジュールで実現していましたが、コアでサポートされるようになりました。
ここでは、各店舗のスタッフが店舗ページを編集し、管理者に承認申請するというシナリオでDrupalのワークフロー機能の一連の流れを見てみます。
モジュールの有効化
必要なモジュールを有効化します。拡張機能ページより、以下2つのモジュールにチェックを入れて「インストール」します。
- Workflows:ワークフローを管理するためのUIとAPIを提供します。
- Content Moderation:Drupalのコンテンツの「未公開」「公開済み」の状態を拡張し、コンテンツにモデレーション状態を提供します。
店舗コンテンツタイプにワークフローを適用する
環境設定>ワークフロー に移動します。デフォルトで「Editorial」というワークフローがすでに設定されているので、こちらを流用したいと思います。「編集」をクリックします。「このワークフローの適用先:」項目の「コンテンツ タイプ」を選択し、「店舗」にチェックを入れて保存します。

ロールとユーザーの作成
「店舗エディタ」ロールを作成します。ユーザー>役割>役割の追加 から、下記のように入力し保存します。
| 役割名 | 店舗エディタ |
| システム内部名称 | store_editor |
次に、店舗エディタに必要な権限を付与します。ユーザー>権限 に移動し、「店舗エディタ」列に下記6項目のチェックを入れて保存します。
| Content Moderation | Editorial workflow: Use Create New Draft transition. |
| Content Moderation | 全ての未公開のコンテンツを表示 |
| Content Moderation | 最新バージョンを表示 |
| Node | 店舗: 新しいコンテンツを作成 |
| Node | 店舗: 任意のコンテンツを編集 |
| Node | テラス席あり店舗: リビジョンを表示 |
「店舗スタッフA」というユーザーを作成し、店舗エディタ役割を割り当てます。ユーザー>ユーザーを追加 から、下記項目を埋めて保存します。
| メールアドレス | [任意のもの] |
| ユーザー名 | 店舗スタッフA |
| パスワード | [任意のもの] |
| 役割 | [店舗エディタ] にチェックを入れる |
店舗スタッフAとしてページを作成
では実際にワークフロー機能を使って承認フローを回します。ブラウザの別ウィンドウにて「店舗スタッフA」としてサイトにログインします。

新たに店舗ページを作成します。サイドバーの「コンテンツを追加」から下記項目を埋めます。
| Tittle | 銀座店 |
| Body | まる茶の記念すべき第4号店です。 |
| 電話番号 | 03-xxxx-xxxx |
| 住所 | 東京都中央区銀座2丁目 |
| 店舗画像 | [任意のもの] |
| 店舗特徴 | テラス席あり |
最後に「保存」をクリックします。店舗スタッフAはドラフト作成の権限はありますが、公開する権限は持たないので必然的にページはドラフトでの保存となります。保存の際にレビュアーに向けたログメッセージを残すことができます。

ドラフト(未公開)ページが作成されました。

では管理者権限で該当ページをレビューします。管理者権限でサイトにログインした状態で該当ページのURLにアクセスすると、ページのプレビューが表示されます。

記事が問題ないことを確認できたら、「Moderation state」が「Published」になっていることを確認し、「適用」をクリックすることで記事が公開されます。
この一連のフローや状態は 環境設定>ワークフロー から追加、変更が可能です。また、サイト上でワークフローは複数持つことが可能です。例えば店舗記事やニュース記事はシンプルな構造のワークフローを適用し、各部門のレビューが必要となるプレスリリースのようなコンテンツには、別途それに適したワークフローを作成し適用できます。
JSON:API
これまで、コードに1行も触れず管理画面のみでコンテンツモデルを定義し、Webサイトに情報を格納していきました。これは同時に、標準に準拠した強力なAPIサーバーを構築していたと言っても過言ではありません。
JSON:APIモジュールを有効にすると、ブログ投稿、ユーザー、タグ、コメントなどの全てのDrupalエンティティがJSON:API仕様に準拠したWebサービスを介してアクセス可能となります。DrupalをヘッドレスCMSとして、モダンなJavaScriptアプリケーション、チャットボット、スマートスピーカーなどで活用することができます。
モジュールの有効化
JSON:APIの利用に必要なコアモジュールを有効化します。拡張機能ページにて、以下2つのモジュールにチェックを入れ、インストールします。
- JSON:API:エンティティをJSON:API仕様に準拠したWeb APIとして公開します。
- Serialization:JSON、XMLなどの形式との間でデータをシリアライズします。
記事一覧を取得する
では早速APIにアクセスします。JSON:APIのエントリポイント(/jsonapi)にGETリクエストを送信すると、全てのリソースが配置されている場所を示すリンクのリストが表示されます。
curl http://drupal-9-project-9-0-1.dd:8083/jsonapi
{
"jsonapi": {
"version": "1.0",
"meta": {
"links": {
"self": {
"href": "http://jsonapi.org/format/1.0/"
}
}
}
},
"data": [],
"links": {
"action--action": {
"href": "http://drupal-9-project-9-0-1.dd:8083/jsonapi/action/action"
},
"base_field_override--base_field_override": {
"href": "http://drupal-9-project-9-0-1.dd:8083/jsonapi/base_field_override/base_field_override"
},
"block--block": {
"href": "http://drupal-9-project-9-0-1.dd:8083/jsonapi/block/block"
},
"block_content--basic": {
"href": "http://drupal-9-project-9-0-1.dd:8083/jsonapi/block_content/basic"
},
...(省略)...
中身を確認すると、記事コンテンツタイプのページ一覧を取得するエンドポイントは /jsonapi/node/article ということが分かります。
curl http://drupal-9-project-9-0-1.dd:8083/jsonapi/node/article
{
"jsonapi": {
"version": "1.0",
"meta": {
"links": {
"self": {
"href": "http://jsonapi.org/format/1.0/"
}
}
}
},
"data": [
{
"type": "node--article",
"id": "41b68b31-2504-4392-9f44-e0c51ee59204",
"links": {
"self": {
"href": "http://drupal-9-project-9-0-1.dd:8083/jsonapi/node/article/41b68b31-2504-4392-9f44-e0c51ee59204?resourceVersion=id%3A12"
}
},
"attributes": {
"drupal_internal__nid": 1,
"drupal_internal__vid": 12,
"langcode": "ja",
"revision_timestamp": "2020-08-30T13:19:30+00:00",
"revision_log": null,
"status": true,
"title": "2月の営業日",
"created": "2020-08-29T07:18:30+00:00",
"changed": "2020-08-29T07:19:15+00:00",
"promote": true,
...(省略)...
記事の構造化情報を取得することができました。JSON:APIのコンセプトや、より詳細は使用方法は公式ドキュメントを参照してください。
まとめ
第4回では、前回に引き続きDrupalの新機能を紹介しながらサイト構築を行いました。レイアウトをドラッグ&ドロップで変更することができるレイアウトビルダー、コンテンツ制作のライフサイクルを管理するワークフロー、DrupalをヘッドレスCMSやAPIサーバーとして活用するためのJSON:APIモジュールなど、Drupalに関わる編集担当、管理者や開発者それぞれのニーズ、市場変化を汲み取った機能拡張がされていることがわかります。
次回はDrupalサイトの「見た目」を定義するテーマシステムに触れていきます。サードパーティで提供されたテーマの利用方法、ベーステーマを継承したテーマのカスタマイズ、Twigでのテンプレート開発など、Drupalのテーマ開発の基本を学びます。
