Dependent Fields
Viewsを使用して、親フィールドの選択に基づいて子フィールドのオプションを動的にフィルタリングする依存エンティティ参照フィールドを作成するメカニズムを提供します。
dependent_fields
インストール
composer require 'drupal/dependent_fields:^1.0'
概要
Dependent Fieldsモジュールは、親フィールドで選択された値に基づいて子フィールドの利用可能なオプションが動的に更新される、カスケード型のエンティティ参照フィールドをサイト構築者が作成できるようにします。これにより、フォームの使いやすさとデータの整合性を向上させる条件付きフィールド関係を作成できます。
このモジュールは、Entity Reference表示を持つViewsを使用して利用可能なオプションをフィルタリングするカスタムEntity Reference Selectionプラグインを提供します。ユーザーが親フィールドで値を選択すると、AJAXリクエストがページ全体をリロードすることなく、依存する子フィールドのフィルタリングされたオプションを取得します。
これは、最初に国を選択してからその国の都市のみを表示する場合や、カテゴリを選択して関連するサブカテゴリを表示する場合などのシナリオで特に有用です。このモジュールは複数値フィールド、Paragraphsをサポートし、サイト間の設定の移植性のためにUUIDで親フィールドを参照できます。
Features
- 親フィールドの選択に基づいて子フィールドのオプションがフィルタリングされるカスケード/依存エンティティ参照フィールドを作成
- 強力なクエリ機能を持つEntity Reference表示のViewsを使用してフィルタリング可能なオプションセットを定義
- 親フィールドが変更されたときにページをリロードせずにリアルタイムでAJAXベースのフィールドオプションを更新
- 複数の親フィールド値をサポート(コンテキストフィルタで複数値を許可)
- セレクトリスト、チェックボックス、ラジオボタンウィジェットに対応
- 複数値(無制限カーディナリティ)の依存フィールドをサポート
- Paragraphsを完全サポート - ネストされたParagraph構造内でも依存フィールドが正しく動作
- 環境間の設定移植性のためのUUIDベースの親フィールド参照
- エンティティオートコンプリートフィールド用のTagifyウィジェットをサポート
- 依存フィールドのオプションが更新されても現在の選択状態を保持
- オプション更新時に変更イベントを自動ディスパッチして後続の依存フィールド更新をトリガー
Use Cases
国と都市の選択
ユーザーがまずタクソノミーボキャブラリから国を選択し、その後都市フィールドがその国に関連する都市のみを表示するようにフィルタリングされる2フィールド構成を作成します。親の国参照フィールドにコンテキストフィルタを持つ都市タームをリストするViewを設定します。
製品カテゴリとサブカテゴリ
メインカテゴリを選択するとサブカテゴリのオプションがフィルタリングされる階層的な製品カテゴリ分類を実装します。親の選択に基づいて子タームをフィルタリングするタクソノミーターム関係を持つViewを使用します。
部門と従業員の選択
ユーザーがまず部門を選択し、その部門に所属する従業員のみを表示できるようにします。部門参照フィールドでフィルタリングされたユーザーエンティティのViewを作成し、部門の選択をコンテキストフィルタとして使用します。
複数レベルの依存フィールド
複数の依存フィールドを連鎖させます。例:地域 → 国 → 都市。各フィールドの選択が次のフィールドのオプションをフィルタリングします。モジュールは更新後に変更イベントをディスパッチし、後続の依存フィールド更新をトリガーします。
依存フィールドを持つParagraphs
複雑なコンテンツ構造のためにParagraphタイプ内で依存フィールドを使用します。モジュールはネストされたParagraphコンテキストを正しく処理し、同じParagraphまたは親Paragraph内の親フィールド値を見つけることができます。
環境間の設定同期
開発、ステージング、本番環境間で設定をデプロイする際、「Reference parent by UUID」オプションを有効にして、Viewのコンテキストフィルタが環境間で異なる可能性のあるIDの代わりにエンティティUUIDを受け取るようにします。
Tips
- 依存フィールドのソースとして設定する前に、必ずViewを個別にテストしてください - 期待されるコンテキストフィルタ値で正しい結果が返されることを確認します
- 複数値の親フィールドの場合、カンマ区切りのIDを受け入れられるようにViewのコンテキストフィルタ設定で「複数値を許可」を有効にしてください
- 親フィールドの値は常にViewへの最初の引数として渡され、その後に設定で指定された追加の引数が続きます
- 親フィールドの値以外の追加の静的コンテキストフィルタをViewに渡すには「arguments」フィールドを使用してください
- 大きなオプションセットでのパフォーマンス向上のため、Viewsに適切なキャッシュを追加することを検討してください
Technical Details
Hooks 1
hook_field_widget_single_element_form_alter
エンティティ参照フィールドウィジェットを変更して、親フィールドにAJAX動作を追加します。フィールドが1つ以上の依存フィールドの親として識別されると、このフックは親の値が変更されたときに子フィールドの更新をトリガーするAJAXハンドラーを追加します。
Troubleshooting 5
フォーム表示の管理で依存フィールドが「セレクトリスト」または「チェックボックス/ラジオボタン」ウィジェットを使用していることを確認してください。オートコンプリートウィジェットは依存フィールドではサポートされていません。
ViewにEntity Reference表示タイプがあることを確認してください。Entity Reference表示を持つViewのみが依存フィールドで使用できます。
Viewのコンテキストフィルタが親フィールドの値を正しく受け入れるように設定されていることを確認してください。期待される引数値で手動テストしたときにViewが結果を返すことを確認してください。
モジュールはParagraphsをサポートしていますが、親フィールドと子フィールドの両方が同じParagraph内にあるか、親フィールドがParagraphコンテキストからアクセス可能であることを確認してください。
環境間でエンティティIDが異なる場合の設定移植性を確保するため、フィールド設定で「Reference parent by UUID instead of entity ID」オプションを有効にしてください。