Form Mode Control
エンティティのフォームモードをロールごと・バンドルごとに制御し、コンテンツ作成・編集時に異なるフォームを表示できるようにするモジュール。
form_mode_control
インストール
composer require 'drupal/form_mode_control:8.x-2.4'
概要
Form Mode Controlは、Drupalのフォームモード機能を拡張し、ユーザーロールやエンティティバンドルに基づいて異なるフォームモードを自動的に適用できるようにするモジュールです。
通常、Drupalのフォームモードは手動で選択する必要がありますが、このモジュールを使用することで、特定のロールを持つユーザーがコンテンツを作成・編集する際に、自動的に適切なフォームモード(フィールドの表示/非表示、並び順、ウィジェットの種類など)が適用されます。
例えば、編集者には全フィールドを表示し、投稿者には限定されたフィールドのみを表示するといった運用が可能になります。また、URLクエリパラメータ(?display=machine_name)を使用して、パーミッションを持つユーザーが任意のフォームモードに直接アクセスすることもできます。
Features
- ロールごとにデフォルトのフォームモードを設定可能 - 各ユーザーロールに対して、コンテンツ作成時と編集時のそれぞれで使用するフォームモードを個別に設定できます
- エンティティタイプ・バンドルごとの設定 - ノード、ユーザー、タクソノミーターム等、あらゆるコンテンツエンティティのバンドルごとにフォームモードを設定できます
- URLクエリパラメータによる直接アクセス - ?display=form_mode_nameをURLに追加することで、パーミッションを持つユーザーが特定のフォームモードに直接アクセスできます
- 動的パーミッション生成 - 有効化されたフォームモードごとに自動的にパーミッションが生成され、きめ細かなアクセス制御が可能です
- ロールの優先度(重み)に基づく自動選択 - ユーザーが複数のロールを持つ場合、最も重みの高いロールに設定されたフォームモードが適用されます
Use Cases
編集者と投稿者で異なるフォームを表示
ニュースサイトで、編集者にはSEO設定、公開スケジュール、関連コンテンツなどの全フィールドを表示し、投稿者にはタイトル・本文・画像のみの簡易フォームを表示したい場合。フォームモード「compact」を作成し、投稿者ロールにはcompactモードを、編集者ロールにはdefaultモードを割り当てます。
コンテンツ作成時と編集時で異なるフォームを使用
コンテンツ作成時には最小限のフィールドのみを表示して素早く下書きを作成し、編集時には全フィールドを表示して詳細な編集を行いたい場合。「creation」と「modification」でそれぞれ異なるフォームモードを設定することで実現できます。
特定のフォームモードへの直接リンク
ワークフローの中で、特定のフィールドセットのみを編集するリンクを提供したい場合。例えば「メタデータを編集」リンクで?display=metadataを指定することで、メタデータ関連フィールドのみのフォームに直接アクセスできます。ビューやカスタムモジュールからこのようなリンクを生成できます。
匿名ユーザー向けの登録フォーム制御
ユーザー登録フォームで、匿名ユーザーには最小限のフィールド(メール、パスワード)のみを表示し、管理者が登録する場合は全プロフィールフィールドを表示したい場合に活用できます。
複数ロールを持つユーザーの処理
ユーザーが複数のロールを持っている場合(例: 認証済みユーザーかつ編集者)、モジュールはロールの「重み(weight)」を参照し、最も重みの高いロールに設定されたフォームモードを適用します。これにより、上位権限を持つロールの設定が優先されます。
Tips
- フォームモードを使用する前に、必ず対象バンドルのフォーム表示設定(例: /admin/structure/types/manage/article/form-display)でそのフォームモードを有効化してください
- ロールに「access_all_form_modes」権限を与えると、そのロールはURLパラメータで任意のフォームモードにアクセスできるため、管理者ロールなど信頼できるロールにのみ付与することを推奨します
- 設定画面では、ロールがパーミッションを持つフォームモードのみが選択肢として表示されます。選択肢が表示されない場合は、パーミッション設定を確認してください
- ロールの重み(weight)はユーザー管理画面(/admin/people/roles)で設定できます。複数ロールを持つユーザーの場合、重みの高いロールの設定が優先されます
Technical Details
Admin Pages 1
/admin/structure/display-modes/form/config-form-modes
各ロールに対してエンティティタイプ・バンドルごとのデフォルトフォームモードを設定する画面です。コンテンツ作成時と編集時でそれぞれ異なるフォームモードを指定できます。
権限 2
Hooks 2
hook_entity_form_display_alter
エンティティフォームの表示が決定される際に呼び出され、ユーザーのロールと設定に基づいて適切なフォームモードに切り替えます。URLクエリパラメータ(?display=)による直接指定にも対応します。
hook_form_alter
フォームモードの追加・編集フォームにヒントメッセージを追加します。URLパラメータでフォームモードを切り替える方法をユーザーに案内します。
Troubleshooting 4
以下を確認してください: 1) フォームモードが作成されているか(/admin/structure/display-modes/form)、2) 対象バンドルのフォーム表示設定でフォームモードが有効化されているか、3) ロールにそのフォームモードへのパーミッションが付与されているか
ユーザーがそのフォームモードに対するパーミッション(個別のフォームモードパーミッションまたは「Access all form modes」)を持っているか確認してください。また、フォームモードのマシン名が正しいかも確認してください。
ユーザーが複数のロールを持っている場合、最も重みの高いロールの設定が適用されます。/admin/people/rolesでロールの重みを確認・調整してください。
キャッシュをクリアしてください(drush cr)。モジュールは動的にパーミッションを生成するため、キャッシュクリア後に無効化されたフォームモードのパーミッションは自動的に削除されます。
Security Notes 2
- 「Access all form modes」パーミッションは、URLパラメータで任意のフォームモードにアクセスできる強力な権限です。このパーミッションは管理者や信頼できるロールにのみ付与することを強く推奨します。
- 各フォームモードのパーミッションを適切に設定し、ユーザーがアクセスすべきでないフィールドを含むフォームモードへのアクセスを制限してください。