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 中覆盖它,以便在您不需要菜单时将其设为空白。这不需要额外的变量。

模板.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 回答