我想检查子模板中是否覆盖了一个块。
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
测试,但它只适用于变量,而不是块。
我做错了什么?
答案 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 %}
在任何其他具有菜单的页面中,您将继续正常覆盖“菜单”块。