Views Field View
Viewを別のView内のフィールドとして埋め込み、Tokenベースの引数渡しによる階層的なView関係を実現します。
views_field_view
概要
Views Field Viewは、あるViewを別のView内のフィールドとして埋め込むことができる強力なViews拡張モジュールです。これにより、View間に親子関係が作成され、子Viewは親Viewのフィールドや引数からコンテキスト引数を受け取ることができます。
このモジュールは、Viewsフィールドハンドラに「Global: View」という新しいフィールドタイプを追加します。このフィールドを「親」Viewに追加すると、親Viewの各行に表示する別のView(「子」View)を選択できます。子Viewは、包括的なTokenシステムを使用して親Viewから引数値を受け取ることができます。
これは、リスト内の各アイテムの関連コンテンツを表示したり、ネストされた階層を表示したり、各行に別のViewからの集計データを含むダッシュボードスタイルのViewを作成したりするなど、複雑なデータ関係を作成する場合に特に便利です。
Features
- 任意のViewを別のView内のフィールドとして埋め込み、親子View関係を作成
- 生データとレンダリングされたフィールド値の両方をサポートするTokenベースの引数渡しシステム
- 親Viewの引数を子Viewに渡すためのコンテキストフィルターToken({{ raw_arguments.X }}および{{ arguments.X }})のサポート
- 親Viewのフィールド値を子Viewの引数として渡すためのフィールドToken({{ raw_fields.X }}および{{ fields.X }})のサポート
- 複数のToken区切り文字をサポート:カンマ(,)またはスラッシュ(/)で複数の引数を区切り可能
- 静的値のサポート - 固定IDやタクソノミー用語を子Viewに直接渡すことが可能
- View同士が相互参照する際の無限ループを防止する組み込みの再帰保護
- 親View内で子ViewのPagerが正しく動作するように自動Pager IDを書き換え
- 親Viewのフィールド設定から子Viewの設定を編集するための直接リンク
- アクセス制御 - 現在のユーザーが選択した表示にアクセス権を持つ場合にのみ子Viewをレンダリング
- 空の非表示オプション統合 - 子Viewが結果を返さない場合に出力を抑制
Use Cases
各アイテムの関連コンテンツを表示
記事を一覧表示する親Viewを作成し、各記事の関連コンテンツを表示する子Viewを埋め込みます。記事のNode ID({{ raw_fields.nid }})を子Viewのコンテキストフィルターに渡すことで、タクソノミー用語やその他の関係に基づいて関連アイテムを表示します。
アクティビティサマリー付きユーザーダッシュボード
各ユーザーの最近のアクティビティ(コメント、作成したコンテンツなど)を表示する子Viewを埋め込んだユーザーViewを構築します。{{ raw_fields.uid }}を渡して、子Viewをそのユーザーのアクティビティのみに絞り込みます。
アイテム数またはプレビュー付きカテゴリ一覧
各カテゴリの最新3件のNodeを表示する子Viewを埋め込んだタクソノミー用語一覧Viewを作成します。用語ID({{ raw_fields.tid }})を子Viewに渡して、カテゴリでコンテンツをフィルタリングします。
ECサイトの商品バリエーション
利用可能なバリエーション、価格帯、または在庫情報を表示する埋め込みViewとともに商品を表示します。バリエーション固有のデータを表示する子Viewに商品IDを渡します。
階層的なコンテンツナビゲーション
親Viewがトップレベルのアイテムを表示し、埋め込まれた子Viewがサブアイテムを表示するネストされたナビゲーション構造を構築します。親アイテムのIDまたはパスを引数として使用して子をフィルタリングします。
マルチレベル集計レポート
親Viewがグループ(日付別、カテゴリ別、ユーザー別)を表示し、子Viewが各グループの詳細な内訳や統計を提供するサマリーレポートを作成します。
Tips
- 引数Tokenとして使用するフィールドは、Viewsがフィールドを順番に処理するため、フィールドリストでGlobal: Viewフィールドより上に配置してください
- Tokenとして渡すためだけに必要なフィールドには「表示から除外」を使用して、出力が煩雑になるのを避けてください
- IDや値を引数として渡す際は、よりクリーンなデータ(HTMLフォーマットなし)のために{{ raw_fields.X }}Tokenを使用してください
- レンダリング/フォーマットされた出力が必要な場合は{{ fields.X }}Tokenを使用しますが、フィールドに適用されたリライトも含まれることに注意してください
- 同じ子Viewが複数回埋め込まれる場合は特に、パフォーマンス向上のために子Viewでキャッシュを有効にしてください
- 複雑な引数ロジックには、Views PHPまたはカスタムコードを使用して引数値を準備することを検討してください
- 埋め込む前に、手動引数で子Viewを独立してテストし、コンテキストフィルターが正しく動作することを確認してください
- フィールド設定の「Viewを編集」リンクを使用して、子Viewの設定に素早くアクセスして変更できます
- 複数の引数を使用する場合は、カンマまたはスラッシュで区切られ、子Viewのコンテキストフィルターに一致する正しい順序であることを確認してください
Technical Details
Hooks 1
hook_views_data_alter
グローバルViewsデータに「view」フィールドハンドラを追加し、「Global: View」フィールドをすべてのViewで利用可能にします。
Troubleshooting 6
これは、Viewが自身を埋め込もうとして無限ループが発生した場合に起こります。親Viewと子Viewが異なることを確認するか、埋め込まれている表示が現在の表示と同じでないことを確認してください。再帰保護は意図どおりに機能しています。
Tokenソースとして使用しているフィールドが、フィールドリストでGlobal: Viewフィールドより上に配置されていることを確認してください。Viewsはフィールドを順番に処理するため、下にあるフィールドのTokenは利用できません。また、Tokenの形式が正確に一致していることを確認してください: {{ raw_fields.field_name }}または{{ fields.field_name }}。
Viewを選択した後、まずフィールド設定を保存してください。表示オプションは、2段階のAJAXロードプロセスのため、有効なViewが選択され保存された後に表示されます。
モジュールは、行インデックスに基づいて子Viewに一意のPager IDを自動的に割り当てます。行ごとに複数の子ViewでPagerが必要な場合、競合が発生する可能性があります。「mini」Pagerを使用するか、子ViewのPagerを無効にして「more」リンクを使用することを検討してください。
親Viewの各行で子Viewのクエリが個別に実行されます。子Viewでキャッシュを有効にする(Views Cache設定)、Pagerで親の行数を減らす、または単純なカウントにはViews集計の使用を検討してください。
現在のユーザーが子Viewの表示にアクセス権を持っているか確認してください。モジュールはViewのアクセス権限を尊重し、ユーザーがアクセスできないViewはレンダリングしません。
Security Notes 4
- モジュールはViewsのアクセス権限を尊重します - 現在のユーザーが選択した表示にアクセス権を持つ場合にのみ子Viewをレンダリングします
- 静的文字列引数は、XSS脆弱性を防ぐために渡される前にHTMLエスケープされます
- 無限ループによるサービス拒否を防ぐため、再帰保護がデフォルトで有効になっています
- 「evil」設定は、再帰的なView埋め込みを許可することのセキュリティへの影響を理解している開発者のみが有効にしてください