有条件地定义分支2中的块



所以这里是用例:

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

树枝2.2
符号3.2


在基本模板中,我只在块定义(而不是"not 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 %}

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

谁能证实我是对的吗?或者如果我错了就纠正我?

编辑

我尝试过将条件的结果强制为true和false,在任何一种情况下都会渲染块。

因此,总结一下,由于这似乎是一个发生在少数地方的问题,我的怀疑是正确的,因为这是一个编译/运行时问题。

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

如果有人想了解更多信息,请访问github问题线程。

如果block()函数中没有输出任何内容或只输出空白,则它似乎会返回一个false值,因此您可以在truthiness测试中包装块,如果不希望它显示,则在子模板中确保它为空。像这样的东西对我有用:

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

Twig将模板编译为php类,您可以在symfonycache目录中看到这些类,块是这些类中的方法。这意味着块总是在编译时定义的,而像您这样的条件语句只决定它们是否"执行"。

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

定义未使用的块并不会对性能造成真正的影响,因为只有在编译时才能解析分支块。定义块(无论是否使用)是在symfony自己的表单组件中完成的。

最新更新