1

子テンプレートでブロックがオーバーライドされているかどうかを確認したいと思います。

template.html.twig

<html>
    ...
    <nav class="menu">
        {% block menu %}
        {% endblock %}
    </nav>
    ...
    <div class="contents">
        {% block contents %}
        {% endblock %}
    </div>
    ...
</html>

page1.html.twig-メニューが含まれています:

{% extends '::template.html.twig' %}

{% block menu %}
    <ul>
        <li>...</li>
    </ul>
{% endblock %}

{% block contents %}
    Hello World!
{% endblock %}

page2.html.twig--メニューは含まれていません:

{% extends '::template.html.twig' %}

{% block contents %}
    Hello World!
{% endblock %}

子テンプレートでオーバーライドされている場合にのみ、テンプレートに要素を表示したいと思いnavます(目標は空の<nav />要素を回避することです)。

Twig構文にはis emptyテストがありますが、ブロックには適用されず、変数にのみ適用されます。

私は何が間違っているのですか?

4

2 に答える 2

2

そのための子テンプレート チェックで変数を設定できます。

{# template.html.twig #}

{% if show_menu is not empty %}
<nav class="menu">
    {% block menu %}
    {% endblock %}
</nav>
{% endif %}

{# page1.html.twig #}

{% set show_menu = true %}

より単純なアプローチのために、このマークアップをブロック定義に入れることも検討する必要があるかもしれません。

于 2012-12-28T23:52:15.993 に答える
1

nav 要素にラッパーを追加し、それを page2 でオーバーライドして、メニューが必要ないときに空白にすることができます。これには追加の変数は必要ありません。

template.html.twig

... snip ...
{% block nav %}
<nav class="menu">
    {% block menu %}
    {% endblock %}
</nav>
{% endblock %}
... snip ...

page2.html.twig

{% extends '::template.html.twig' %}

{% block nav '' %} {# here's the kicker ... #}

{% block contents %}
    Hello World!
{% endblock %}

メニューがある他のページでは、通常どおり「メニュー」ブロックをオーバーライドし続けます。

于 2013-01-02T20:32:51.853 に答える