如何在TWIG布局块中进行有条件的覆盖?

26
首先,让我从我尝试使用的代码开始:
{% if modal == true %}
    {% block header %}{% endblock %}
    {% block footer %}{% endblock %}
{% endif %}

我想要实现的是,只有当变量modal为true时,才不显示我的页眉和页脚块。在if语句之后,我还有以下内容:
{% block content %}
    {{ dump(modal) }}
{% endblock %}

这里发生的情况是,无论modal的值是true还是其他值,我的清空头部和底部块的覆盖始终会运行。所以,我将modal传递为false运行这个代码,结果是头部和底部仍然不显示。dump命令的输出准确地显示了true或false,但是在if语句中,条件似乎总是评估为true。
块是否不能被包裹在条件语句中,或者我需要做一些额外的工作来使其工作?
2个回答

58

定义

{% block footer %}Some standard content{% endblock %}

在父twig模板中。 然后在你想决定是否显示页脚内容的模板中,可以这样做:

{% block footer %}
  {% if not modal == true %}
    {{ parent() }}
  {% endif %}
{% endblock %}
如果模态框为真,则页脚将为空,否则页脚中将打印“一些标准内容”。

7
虽然已接受的答案是正确的,但这个答案采用了那种方法并展示了如何实际实现该解决方案。+1 {{ parent() }} - AJ Cerqueti
这是最佳答案,因为它回退到默认设置。 - numediaweb

27

文档所述,块不关心其周围的任何逻辑:

块提供了一种更改模板中某个部分的呈现方式的方法,但不会以任何方式干扰其周围的逻辑。

您应该将该逻辑放在块内部,而不是外部,正如您可以在该文章的最后一个示例中看到的那样。


谢谢。我刚刚和一位同事交谈,他建议尝试在模态框不为真时渲染父块。 - slave2zeros
有没有其他的提示或文档可以解决这个问题?(例如无法在块外进行样式设置)。 我正在尝试向现有的来自父主题的div添加一个div类。我正在尝试在我的子主题中完成此操作(以避免损害父主题模板文件)。我遇到的问题是,所涉及的div位于块外面(包裹着块)。因此,我不确定如何向其中添加类,因为如果我在子主题twig中编写某些内容,就会触发错误(由于它扩展了父主题的page.html.twig,因此块外的任何内容都是不允许的)。 - Auxiliary Joel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接