Php 如何检查Twig中是否覆盖了块?
我想检查是否在子模板中重写了块Php 如何检查Twig中是否覆盖了块?,php,symfony,twig,Php,Symfony,Twig,我想检查是否在子模板中重写了块 template.html.twig: <html> ... <nav class="menu"> {% block menu %} {% endblock %} </nav> ... <div class="contents"> {% block contents %} {% endblock %} &l
template.html.twig
:
<html>
...
<nav class="menu">
{% block menu %}
{% endblock %}
</nav>
...
<div class="contents">
{% block contents %}
{% endblock %}
</div>
...
</html>
page2.html.twig
——不包含菜单:
{% extends '::template.html.twig' %}
{% block contents %}
Hello World!
{% endblock %}
我想在模板中显示nav
元素,前提是它在子模板中被重写(目标是避免出现空的
元素)
Twig语法有一个为空的测试,但它只适用于变量,而不适用于块
我做错了什么?您可以在子模板检查中设置一个变量:
{# template.html.twig #}
{% if show_menu is not empty %}
<nav class="menu">
{% block menu %}
{% endblock %}
</nav>
{% endif %}
也许你也应该考虑将这个标记放在块定义中,以更直接的方式。
你可以向你的导航元素添加一个包装器,然后在PGE2中重写它,当你不想要一个菜单时使它成为空白。这不需要额外的变量
template.html.twig
... snip ...
{% block nav %}
<nav class="menu">
{% block menu %}
{% endblock %}
</nav>
{% endblock %}
... snip ...
{% extends '::template.html.twig' %}
{% block nav '' %} {# here's the kicker ... #}
{% block contents %}
Hello World!
{% endblock %}
在任何其他有菜单的页面中,您将继续正常覆盖“菜单”块。我希望有一种方法可以做到这一点,而不必使用这些技巧。也许我们没有以正确的方式解决这个问题。。。
... snip ...
{% block nav %}
<nav class="menu">
{% block menu %}
{% endblock %}
</nav>
{% endblock %}
... snip ...
{% extends '::template.html.twig' %}
{% block nav '' %} {# here's the kicker ... #}
{% block contents %}
Hello World!
{% endblock %}