Drupalでワークフローを設計する時に押さえておきたい要件

今回はDrupalのコアに入っているContent Moderationsモジュール（とWorkflowsモジュール）を使用してワークフローを作る際に、事前にクライアントと話し合ってはっきりさせておくべき情報をまとめたいと思います。

## 必要なモデレーション状態
「下書き」、「承認待ち」、「公開」など、必要なモデレーション状態をはっきりさせましょう。

モデレーション状態には以下のようなパラメーターを設定できるので、これらが完全一致する既存のモデレーション状態が無ければ新しいモデレーション状態が必要だと考えられます。

- ラベル（画面上で表示される）
- マシン名
- 公開・非公開（後述）
- デフォルトのリビジョンかどうか（後述）

今回は「下書き」、「承認待ち」、「公開」、「アーカイブ」のモデレーション状態を作成します。
![スクリーンショット 2021-01-26 22.24.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/dc6bd573-89bc-c38e-db83-ff4e39851e7a.png)

## 各モデレーション状態の公開・非公開
さきほど書いたように、各モデレーション状態には公開・非公開を設定することができます。
非公開に設定するとそのモデレーション状態のリビジョンは非公開になります。
今回は「下書き」、「承認待ち」、「アーカイブ」を非公開にします。
![スクリーンショット 2021-01-26 22.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/9683df23-8fc4-7301-7ee8-d320980c7c24.png)

## 各モデレーション状態を「デフォルトのリビジョン」にするかどうか
デフォルトのリビジョンは「**そのコンテンツを代表するリビジョン**」を指します。
ノードでいうと**閲覧画面**（`/node/[nid]`）に表示されるリビジョンです。
たくさんのリビジョンのうち、一つだけにデフォルトのリビジョンというフラグが立っているようなイメージです。
ノードのリビジョン一覧画面ではデフォルトのリビジョンだけ黄色く表示され、**現在のリビジョン**と表示されます。
![スクリーンショット 2021-01-26 22.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/56785b43-b9bf-9372-e364-eac489a21e32.png)

**コンテンツが公開されているかどうか（匿名ユーザーから閲覧できるかどうか）はこのデフォルトリビジョンが公開か非公開かどうかに依存します。**

今回の例でいうと、デフォルトリビジョンが「公開」であれば公開され、「下書き」「承認待ち」「アーカイブ」であれば非公開になります。

ただし実際には、**いったん公開のリビジョンが作成されると、その後非公開のリビジョンを作成してもデフォルトのリビジョンになることはありません。**次の公開のリビジョンが作成されるまでデフォルトのリビジョンは一番最後に作られた公開リビジョンが担当します。

今回の例でいうと、「公開(１回目)」→「承認待ち」→「公開（２回目）」と遷移させたとすると、デフォルトのリビジョンは「公開（１回目）」→「公開（２回目）」とバトンが渡されるので、コンテンツが非公開になることはありません。（ちなみに「承認待ち」のリビジョンは一度も閲覧画面に登場することはありませんが、最新のリビジョンである間は**編集画面**（`node/[nid]/edit`）や**最新のリビジョン**(`node/[nid]/latest`)で確認することができます。）

でもそれだと一旦公開されたコンテンツは永遠に非公開にできないことになってしまいます。そこで使用するのが「**デフォルトのリビジョン**」フラグです。これは非公開のモデレーション状態にのみ適用することができます。**これがTRUEになっているモデレーション状態は、デフォルトのリビジョンフラグを公開のリビジョンから奪うことができます。**

今回の例でいうと、「アーカイブ」のデフォルトのリビジョンをオンにしたとします。その場合、「公開」→「アーカイブ」に遷移させると「アーカイブ」がデフォルトのリビジョンになり、そのコンテンツは非公開になります。

つまり、「**このモデレーション状態に来たら強制的にコンテンツ自体を非公開にしたい**」という場合は「デフォルトのリビジョン」をオンにする必要があります。

今回はアーカイブをデフォルトのリビジョンにします。
![スクリーンショット 2021-01-26 23.24.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/f4e6a542-4095-c230-a1ae-8e99c422fa94.png)

## 必要な遷移
どのモデレーション状態からどのモデレーション状態に遷移できるようにすればいいのかをまとめておきましょう。

それぞれの遷移には以下のパラメーターがあります。

- ラベル（画面上では表示されない）
- マシン名
- 遷移元（複数可）
- 遷移先（一つのみ）
- 権限（誰がこの遷移を使用できるか）

今回は「投稿者」、「編集者」、「マネージャー」というロールが有ると仮定して、以下のように権限を設定します。「公開」と「復元」はどちらも「公開」への遷移ですが、権限が違うので別々の遷移として作成する必要があります。
![スクリーンショット 2021-01-27 0.12.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/22e3e46a-b578-641b-cd1c-2219fc3688ba.png)

## ワークフローの適用先
このワークフローを適用するコンテンツタイプなどを決めておきましょう。

## デフォルトのモデレーションの状態
コンテンツを新規作成したときのモデレーション状態はどれにするかも決めておきましょう。

## 詰め終わったら...
上記の情報を詰め終わったらContent Moderationモジュールをオンにして設定画面（/admin/config/workflow/workflows/manage）にGo!です。

今回のワークフローの設定画面はこのようになりました。
![workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/02848f05-5182-7cc4-6ac6-0ca6f9c1ce2f.png)

権限(/admin/people/permissions)はこんな感じです。
![スクリーンショット 2021-01-27 0.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/23cb8c07-d2fd-da92-ffe4-fae5d87ce83d.png)

コンテンツ作成画面ではこんな感じで表示されます。
![workflow_content.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253501/378214dd-cb78-7d13-601b-f182ea36a5d0.png)


## まとめ
今までいろんなプロジェクトでContent Moderationモジュールを使ってワークフローを作成してきましたが、管理画面から簡単にできるとはいえ詳細詰め忘れでゴタゴタすることがあったので、設計時に意識しておきたい情報をまとめてみました。何かご質問があればお気軽にコメントどうぞ！