Twig Real Content - 空のリージョン/コンテンツ確認ヘルパー
Twig変数(通常はリージョン)が意味のあるコンテンツを含んでいるか、実質的に空であるかを判定するためのTwigフィルターとテストを提供します。
twig_real_content
インストール
composer require 'drupal/twig_real_content:^1.0'
概要
Twig Real Contentは、Drupalテーマ開発における一般的な問題を解決します。リージョンやレンダリングされた変数が実際に表示可能なコンテンツを含んでいるのか、それとも空のラッパーマークアップだけなのかを判定する問題です。Drupalのレンダリングシステムでは、実際に表示するコンテンツがない場合でも、リージョンやコンテンツ領域にHTMLラッパー要素が含まれていることが多く、テンプレートで空のセクションを条件付きで非表示にすることが困難でした。
このモジュールはreal_contentというTwigフィルターとTwigテストの両方を提供します。これはHTMLタグを除去しつつ(画像、動画、iframeなどの意味のある要素は保持)、実際のコンテンツが残っているかどうかを確認します。これにより、テーマ開発者はリージョンに実際の表示可能なコンテンツが含まれているかどうかに基づいて、適切に表示/非表示を制御できます。
このモジュールは、Twigテンプレートで空のリージョンを確認することの難しさに関する長年のDrupal Coreイシュー #953034 に対応しています。
Features
- 変数に意味のあるコンテンツが含まれている場合はTRUE、空の場合はFALSEを返す'real_content' Twigテストを提供
- さらなる処理のために除去されたコンテンツを返す'real_content' Twigフィルターを提供
- コンテンツを含む要素(img、video、iframe、embed、script、styleなど)を保持しながら、空のラッパーマークアップをインテリジェントに除去
- 遅延読み込みコンテンツでの誤検知を避けるため、Drupalのレンダープレースホルダーを正しく処理
- レンダリングされた文字列とMarkupInterfaceオブジェクトに対応
- 未レンダリングの配列が渡された場合、開発者を正しい使用方法に導く有用な例外をスロー
- Drupal 9、10、11に対応
Use Cases
実際のコンテンツがあるリージョンを条件付きで表示
page.html.twigでreal_contentテストを使用して、実際のコンテンツが含まれている場合のみリージョンラッパーを表示します: {% if page.sidebar_first|render is real_content %}<aside class="sidebar">{{ page.sidebar_first }}</aside>{% endif %}
空のコンテンツセクションを非表示
カスタムレイアウトを構築する際、real_contentを使用して空のセクションの表示を避けます: {% if content.field_body|render is real_content %}<div class="body-content">{{ content.field_body }}</div>{% endif %}
処理用にリージョン出力をクリーンアップ
real_contentフィルターを使用して、さらなる処理のためのクリーンなコンテンツを取得します: {% set clean_content = page.sidebar_first|render|real_content %}
Viewsの出力で空のラッパーdivを防止
Viewsをテーマ化する際、real_contentを使用して、空のViewの結果やフィールドにラッパーマークアップを出力しないようにします。
Tips
- real_contentテストまたはフィルターを使用する前に、必ず変数をレンダリングしてください。パターン: {{ variable|render is real_content }}
- モジュールはレンダリングされた文字列を想定しています - 未レンダリングの配列はTwigRealContentExceptionと有用なメッセージをスローします
- 画像、動画、iframe、埋め込みなどのメディア要素は、自己終了タグであっても「実際のコンテンツ」として扱われます
- Drupalのレンダープレースホルダーは保持されるため、遅延読み込みコンテンツが誤って空として識別されることはありません
- 複雑なコンテンツ確認のニーズには、レンダリングのタイミングをより細かく制御するためにTwig Captureモジュールと組み合わせてください
Technical Details
Troubleshooting 3
real_contentに渡された変数がレンダリングされていませんでした。最初に|renderフィルターを適用してください: {{ my_variable|render is real_content }}
scriptタグとstyleタグは「実際のコンテンツ」として保持されます。これらを無視したい場合は、カスタムロジックが必要か、コンテンツを別の方法で処理する必要があります。
モジュールは遅延レンダリングを処理するために<drupal-render-placeholder>タグを特別に保持します。変数がレンダリングされた後にモジュールのフィルター/テストを使用していることを確認してください。