所以继承用例:
twig 2.2
symfony 3.2
在基本模板中,我只是在定义了一个块时(不是'不是emtpy')
{% if block('left_sidebar') is defined %}
<div class="col-md-2">
{{- block('left_sidebar') -}}
</div>
<div class="col-md-10">
{% else %}
<div class="col-md-12">
{% endif %}
对于上述工作,块根本不能定义(完全设计)。无论如何,以下渲染块,我不能&#39;找出原因。
{% if not is_granted('IS_FULLY_AUTHENTICATED') %}
{% block left_sidebar %}
{% include ':blocks:block__login.html.twig' %}
{% endblock %}
{% endif %}
我想知道这是否有效,因为基本模板代码 工作的原因相同。也就是说,块在运行时之前编译,条件语句在运行时执行。
任何人都可以确认这是对的吗?如果我错了,请纠正我?
修改
我尝试将条件的结果强制为true和false,并且在任何一种情况下都会呈现该块。
答案 0 :(得分:0)
Twig将您的模板编译成php类,您可以在symfony cache
目录中看到它们,块是这些类中的方法。这意味着块总是在编译时定义,而像你这样的条件只决定它们是否被“执行”。
对于您的用例,我建议将调用is_granted
放在基本模板中。然后,您不需要在if
中包含任何index.html.twig
元素,因为如果从未使用过边栏块,那么它将无效。
定义未使用的块没有真正的性能影响,因为twig块的解析仅在编译时发生。无论是否使用了块,都可以在symfony自己的表单组件中完成。
答案 1 :(得分:0)
所以,为了把它包起来,因为它似乎是在一些地方出现的问题,我的怀疑是正确的,因为它是编译/运行时问题。
块被编译,因为if语句在运行时,一个不能控制另一个。
heres the github issue thread如果有人想要更多信息。
答案 2 :(得分:0)
block()
函数似乎返回一个假值,如果在其中没有输出或仅输出空格,那么您可以将块包装在真实性测试中,并在子模板中确保它是空的如果你不#39;想要它显示。这样的事情对我有用:
base.html.twig:
{% if block('left_sidebar') %}
<div class="col-md-2">
{% block left_sidebar %}{% endblock %}
</div>
<div class="col-md-10">
{% else %}
<div class="col-md-12">
{% endif %}
index.html.twig
{% block left_sidebar %}
{% if not is_granted('IS_FULLY_AUTHENTICATED') %}
{% include ':blocks:block__login.html.twig' %}
{% endif %}
{% endblock %}