如何检查Twig中是否覆盖了一个块?

时间:2012-12-28 22:45:44

标签: php symfony twig

我想检查子模板中是否覆盖了一个块。

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测试,但它只适用于变量,而不是块。

我做错了什么?

2 个答案:

答案 0 :(得分: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 %}

也许您还应该考虑将此标记放在块定义中,以获得更直接的方法。

答案 1 :(得分:1)

您可以在nav元素中添加一个包装,然后在第2页中覆盖它,以便在您不需要菜单时将其设置为空白。这不需要额外的变量。

<强> 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 %}

在任何其他具有菜单的页面中,您将继续正常覆盖“菜单”块。