EVA: Entity Views Attachment
ViewsのディスプレイをDrupalエンティティのコンテンツに直接アタッチできるViewsディスプレイプラグインを提供するモジュールです。
eva
インストール
composer require 'drupal/eva:^3.1'
概要
EVA(Entity Views Attachment)は、Viewsの出力をDrupalの任意のエンティティコンテンツに直接アタッチできるViewsディスプレイプラグインを提供します。ノードの本文、コメント、ユーザープロフィール、タクソノミー用語のリストページなど、エンティティが表示される場所にViewsを埋め込むことができます。
EVAディスプレイは、Field UIモジュールを使用して追加されたフィールドと同様に、エンティティの表示設定管理ページで並び順を変更できます。これにより、Viewsの出力をエンティティの他のフィールドと一緒に柔軟にレイアウトできます。
さらに、Viewがアタッチされているエンティティの一意のID、およびそのエンティティから生成されたトークンを、Viewの引数として渡すことができます。例えば、「著者ID」引数を持つ投稿を表示するViewを作成し、EVAを使用してそのViewをユーザーエンティティタイプにアタッチすることができます。ユーザープロフィールが表示されると、ユーザーのIDが自動的にViewの引数として渡されます。
注意:EVAはエンティティに疑似フィールドとしてアタッチされます。このレガシーメカニズムはField UIによって十分にサポートされていないため、デフォルト設定やサードパーティ設定などの一部のディスプレイ機能が利用できない場合があります。
Features
- Viewsの出力を任意のDrupalエンティティ(ノード、ユーザー、タクソノミー用語など)のコンテンツに直接アタッチできるEVAディスプレイタイプを提供
- エンティティの表示設定ページでEVAディスプレイの配置位置と重み(表示順序)を他のフィールドと同様に調整可能
- アタッチ先エンティティのIDを自動的にViewの引数として渡す機能
- トークン置換を使用してエンティティのフィールド値をViewの引数として動的に渡す機能
- 特定のバンドル(コンテンツタイプなど)のみにViewをアタッチするフィルタリング機能
- Viewのタイトルを表示/非表示にするオプション
- 結果が空の場合に出力を非表示にするオプション
- 露出フィルタフォームを別フィールドとして表示する機能
- Tokenモジュールとの統合によるトークンブラウザのサポート
Use Cases
ユーザープロフィールに関連投稿を表示
ユーザーのプロフィールページに、そのユーザーが作成したコンテンツの一覧を表示する場合。「著者ID」引数を持つViewを作成し、EVAディスプレイでUserエンティティにアタッチします。argument_modeを「id」に設定すると、プロフィールが表示される際にユーザーのIDが自動的にViewの引数として渡され、そのユーザーの投稿のみが表示されます。
ノードに関連コンテンツを表示
記事ページの下部に「関連記事」セクションを追加する場合。同じカテゴリの記事を表示するViewを作成し、EVAディスプレイで記事コンテンツタイプにアタッチします。トークン置換を使用して[node:field_category:target_id]などを引数として渡し、同じカテゴリの他の記事を動的に取得できます。
タクソノミー用語ページにコンテンツ一覧を表示
タグやカテゴリのタクソノミー用語ページに、その用語でタグ付けされたコンテンツの一覧を表示する場合。タクソノミー用語IDを引数に取るViewを作成し、EVAディスプレイでTaxonomy Termエンティティにアタッチします。
製品ページにレビュー一覧を表示
ECサイトの製品詳細ページに顧客レビューを表示する場合。レビューコンテンツタイプを参照フィールドで製品に関連付け、製品IDを引数に取るレビュー一覧Viewを作成してEVAで製品ページにアタッチします。露出フィルタを使用すれば、ユーザーがレビューを評価順やなどで並び替えることも可能です。
特定のコンテンツタイプのみにViewをアタッチ
複数のコンテンツタイプがある中で、特定のタイプにのみViewを表示したい場合。EVAディスプレイのBundles設定で対象のコンテンツタイプのみを選択することで、そのタイプのノードにのみViewが表示されます。
露出フィルタ付きViewのエンティティへの埋め込み
フィルタ機能付きの検索結果Viewをノードコンテンツ内に埋め込む場合。EVAは露出フィルタフォームを別のフィールドとして提供するため、フォームとView結果の配置を個別に制御できます。Field UIの表示管理でそれぞれの位置を調整可能です。
Tips
- Viewsにキャッシュタグが適切に設定されていることを確認し、エンティティが更新された際にEVA出力も適切に更新されるようにしてください。
- パフォーマンスのため、EVAディスプレイではページャーを「None」に設定するか、表示件数を制限することを推奨します。
- 複雑なトークン引数を使用する場合は、Tokenモジュールをインストールしてトークンブラウザを活用してください。
- EVAテンプレートをカスタマイズする場合は、eva-display-entity-view--{view_id}--{display_id}.html.twigの形式でテーマにテンプレートを配置できます。
- 露出フィルタを使用する場合、フォームとビュー結果は別々のフィールドとして表示管理できるため、レイアウトの自由度が高くなります。
Technical Details
Hooks 5
hook_entity_extra_field_info
EVAディスプレイをエンティティの疑似フィールドとして登録する。これによりField UIでEVAの表示位置を設定できるようになる。
hook_entity_view
エンティティが表示される際にEVAビューをレンダリングして埋め込む。エンティティの引数設定に基づいてViewの引数を設定し、レンダー配列を構築する。
hook_view_presave
Viewの保存前にEVAディスプレイが削除されたかチェックし、不要なモジュール依存関係を削除する。
hook_views_invalidate_cache
Viewsのキャッシュが無効化される際にEVA関連のキャッシュもクリアする。
hook_modules_enabled / hook_modules_disabled
モジュールが有効化/無効化された際にEVAディスプレイキャッシュをリセットする。
Troubleshooting 5
まずViewsキャッシュをクリアしてください(/admin/config/development/performance)。次に、エンティティの「表示管理」設定(例: /admin/structure/types/manage/article/display)でEVAフィールドが有効になっており、「無効」セクションに配置されていないことを確認してください。また、EVAディスプレイ設定でアタッチ先のエンティティタイプとバンドルが正しく設定されているか確認してください。
これはキャッシュの問題です。EVAモジュールは引数に基づくキャッシュキーを自動的に追加しますが、引数が設定されていない場合はキャッシュが共有される可能性があります。argument_modeを「id」または「token」に設定して、各エンティティに固有の引数が渡されるようにしてください。
トークンの構文が正しいことを確認してください(例: [node:nid])。Tokenモジュールをインストールすると、トークンブラウザが利用可能になり、正しいトークン名を確認できます。複数の引数を渡す場合は「/」で区切ってください。
Viewを保存すると、eva_view_presave()フックが自動的に不要なEVA依存関係を削除します。Viewを編集して保存し直してみてください。
EVAはエンティティに疑似フィールドとしてアタッチされるレガシーメカニズムを使用しています。このため、Field UIの一部機能が制限されます。より「本物のフィールド」のような動作が必要な場合は、他のモジュール(ViewfieldやViews Referenceなど)の使用を検討してください。
Security Notes 3
- EVAはViewsのアクセスチェックを尊重します。Viewのアクセス設定が適切に構成されていることを確認してください。
- トークン引数を使用する場合、EVAはHTML::escape()を使用して値をエスケープし、XSS攻撃を防止しています。
- EVAモジュールはDrupalのセキュリティカバレッジ対象であり、セキュリティチームによる審査を受けています。