【问题标题】:conditionally define a block in twig 2有条件地在树枝 2 中定义一个块
【发布时间】:2017-06-30 08:57:24
【问题描述】:

这是用例:

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

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

为了上述工作,根本无法定义块(这是完全设计的)。无论如何,下面都会渲染块,我不知道为什么。

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

我想知道这是否不起作用,因为与基本模板代码确实工作的原因相同。即块在运行前编译,条件语句在运行时执行。

谁能确认我是对的?如果我错了,或者纠正我?

编辑

我已经尝试强制条件的结果为真和假,并且在任何一种情况下都会呈现块。

【问题讨论】:

  • IS_AUTHENTICATED_FULLY
  • 看起来他们把一个别名放在另一个上面。没有区别,但很好的喊声。我尝试强制测试的结果为真假,并且该块仍然呈现。
  • 类似的东西怎么样:` {% if app.user and is_granted("IS_FULLY_AUTHENTICATED") %}` ?
  • 不,即使你强制 true 或 false,它仍然会呈现。
  • 为什么不将块渲染为空,例如。评估块内的条件?

标签: twig symfony templating


【解决方案1】:

Twig 将您的模板编译成 php 类,您可以在 symfony cache 目录中看到这些类,而块是这些类中的方法。这意味着块总是在编译时定义,像你这样的条件只确定它们是否被“执行”。

对于您的用例,我建议在基本模板中调用is_granted。那么你就不需要在index.html.twig 中包含任何if 元素,因为如果从不使用边栏块,定义侧边栏块将无效。

定义未使用的块不会对性能造成真正的影响,因为 twig 块的解析只发生在编译时。例如,在 symfony 自己的表单组件中定义块是否被使用。

【讨论】:

  • 是的,这就是我认为正在发生的事情,但我不想将条件作为基本模板,因为它会在其他地方需要。我的问题是我需要 2 个条件,一个确定是否呈现侧栏,其中可能包含除登录表单之外的其他内容,以及 2,是否应呈现登录表单,无论是在那里还是其他地方。
  • 但是为什么要根据这些条件来定义block呢?您也可以在块内移动 if 语句,并且仅在用户登录时呈现 include() 调用。
  • 因为侧边栏需要在其他与登录无关的情况下有条件地显示
  • 在将 is_granted 放入基本模板时要小心,自定义 4xx 和 5xx 错误可能会使用尚未加载安全性的相同基本布局。
  • 是的,这就是我不想要基本模板 Alain 中的 if 语句的原因之一,但看起来我别无选择。
【解决方案2】:

所以,总结一下,因为它似乎是在几个地方发生的问题,我的怀疑是正确的,因为它是一个编译/运行时问题。

块被编译,因为 if 语句在运行时一个不能控制另一个。

heres the github issue thread如果有人想了解更多信息。

【讨论】:

    【解决方案3】:

    block() 函数似乎返回一个错误值,如果其中没有输出或仅输出空格,因此您可以将块包装在真实性测试中,并在子模板中确保它是空的,如果你不这样做希望它显示。这样的事情对我有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2016-12-30
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多