有条件地在树枝2中定义一个块

时间:2017-02-12 09:30:20

标签: twig symfony templating

所以继承用例:

  • 在动态页面结构中呈现登录表单块,但仅限用户未经过身份验证
  • 如果未经过身份验证,则不得定义
  • 块(以保留动态页面结构)

twig 2.2
symfony 3.2

在基本模板中,我只是在定义了一个块时(不是'不是emtpy')

base.html.twig

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

index.html.twig

对于上述工作,块根本不能定义(完全设计)。无论如何,以下渲染块,我不能&#39;找出原因。

{% if not is_granted('IS_FULLY_AUTHENTICATED') %}
    {% block left_sidebar %}
        {% include ':blocks:block__login.html.twig' %}
    {% endblock %}
{% endif %}

我想知道这是否有效,因为基本模板代码 工作的原因相同。也就是说,块在运行时之前编译,条件语句在运行时执行。

任何人都可以确认这是对的吗?如果我错了,请纠正我?

修改

我尝试将条件的结果强制为true和false,并且在任何一种情况下都会呈现该块。

3 个答案:

答案 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 %}