リージョンが空かどうかを適切に検出するにはどうすればよいですか?[閉まっている]


11

はないため、ページテンプレートの領域を印刷する条件がありますが、何があっても常に空の領域が印刷されます。空の領域を検出する適切な方法は何ですか?

たとえば、を{% if page.local_tasks is not empty %}{{ page.local_tasks }}{% endif %}出力し<div class="region region-local-tasks"></div>ます。

私は領域をレンダリングする場合themename_preprocess_page()var_dump(drupal_render($variables['page']['highlighted']));、私は、プレースホルダトークンでSafeStringを取得します。

<div class="region region-highlighted"><drupal-render-placeholder callback="Drupal\Core\Render\Element\StatusMessages::renderMessages" arguments="0" token="a8c34b5e"></drupal-render-placeholder></div>

したがって、技術的にはリージョンは空ではありませんが、それについては何もできません。


page.local_tasks空にすべきだと感じたときに何が含まれていますか?
クライブ

これは、ローカルタスクブロックの領域です。

そうですが、オブジェクトには何が含まれていますか?空ではないので、コンテンツがないことを示唆する他のプロパティがあるかどうかを確認してください(文字列またはレンダリングされていない配列が本質的に含まれていますか?)
Clive

私は同じ問題を抱えており、これはバグのようです
ユセフ

回答:


10

このためのTL; DRは、テンプレート内で領域が空であるかどうかを確実にチェックする方法がないことです。

Drupal 8では、テンプレートレベルに達した時点で、コンテンツが遅延レンダリングされるため、リージョンにコンテンツがあるかどうかを判断できません。これには未解決のDrupal 8の問題があります。

これを実現するためにおそらくしなければならないことは、領域が空かどうかをテストするCSSを記述することです。:empty疑似セレクターを使用してみてください。


この問題を回避する最も信頼できる方法は、hook_theme_suggestions_HOOK_alterにテンプレートの提案を追加し、表示されないはずの領域をテンプレートから完全に削除することであると結論付けました。
ヨハン

10

次のように、レンダリング後にフィルタを適用してみてください。

{% set has_sidebar_first = page.sidebar_first|render|striptags|trim is not empty %}
{% if has_sidebar_first %}
    {# ... #}
{% endif %}

これは私のために働きました
Andrew Kozoriz

これは非常に便利です。
ACanadianCoder 2018

2
一部の領域がプレースホルダーにレンダリングされる可能性があることを考慮に入れていないため、このアプローチは機能しません。プレースホルダーは後で実際のマークアップに置き換えられます。html.html.twigファイルで領域が空かどうかを判断する方法はありません。この問題の背景をすべてお読みになりたい場合は、このDrupal Coreの問題
lauriii

@lauriiiが言ったように、これはdrupalプレースホルダーでは機能しません(ブロック内の私のビューは通常、フィルターが原因で除外されstrip_tagsます)。
ダクワミン

2

小枝であなたは本当にできるはずです:

{% if page.local_tasks %}{{ page.local_tasks }}{% endif %}

ただし、おそらくpage.local_tasks内に何かがあります(空のマークアップなど)。以下をお試しください:

{% if page.local_tasks|striptags|trim %}{{ page.local_tasks }}{% endif %}

そのデバッグスニペットには何も表示されません(つまり、何も表示されず、変数は空です)。

あなたが言うときはdebugどういう意味dumpですか?するとどうなりますか{% if page.local_tasks %}Crazy magic{% endif %}
クイーンビクトリア2015

あなたの質問を読んで、私はそれpage.local_tasksが空ではないのを見ます。HTMLでいっぱいです。回答を更新します。
クイーンビクトリア

コンテンツがある場合、スニペットはコンテンツを2回レンダリングしませんか?または、レンダリングされた場合、キャッシュされ、パフォーマンスに影響はありませんか?また、なぜ回避策を実行する必要があるのか​​理解できません。これは、コアの箱から出して動作するはずです。@Berdirこれに関するコメントはありますか?

問題は、ローカルタスクが空ではないことです。小枝とdrupalはどちらもMVCに従っているため、空である(空ではない)小枝には何もわかりません。空のときにローカルタスクが提供するものをオーバーライドするプリプロセッサを作成するか、テストできる「count」タイプのプロパティを別の値に提供するか、または私が提案するようなものを作成できます。どこかであなたは打撃を受けるでしょう。パフォーマンスの向上は無視できると思います。
クイーンビクトリア2015

1

これでうまくいきました。

{% if page.sidebar_first|render|striptags %}
<aside id="sidebar-first" class="sidebar sidebar-first layout-sidebar-first" role="complementary">{{ page.sidebar_first }}</aside>
{% endif %}

十分に単純です。


よくわかりませんが、サイドバーが2回レンダリングされる可能性があります(1回は評価用、もう1回は表示用)。
Jigarius


-1

これを試して :

 {% if page.local_tasks|render|striptags|trim  is not empty %}
    {{ page.local_tasks }}
 {% endif %}

-1

これは実際には私の場合に機能します

{% if page.sidebar_second|render|striptags('<drupal-render-placeholder>')|trim|length > 0 %}

あなたも何でも追加できるようにstriptagsは、維持するために、タグの文字列を受け取りcontentlessあなたが持っていることを期待するタグのように、<form><img>など


-1

以下は、twigデバッグが有効な場合にも機能します。

{% set sidebarLength = page.sidebar_first|render|trim|striptags|length %}
{% if sidebarLength > 1 %}
  {% set has_sidebar_first = page.sidebar_first %}
{% else %}
  {% set has_sidebar_first = null %}
{% endif %}

-3

領域が空かどうかを検出するには、次のようなコードを記述します。

{%if page.local_tasks%}
   {{page.local_tasks}}
{%endif%}

上記のコードでは、local_tasksリージョンが空かどうかをチェックし、空の場合はそのリージョンを印刷しません


1
動作しません、これは常に本当です
ユセフ

ブロックの遅延レンダリングがこのスニペットが機能しない原因です。配列は空ではありませんが、レンダリングすると何も返されません。
Renrhaf、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.