如何检查一个块是否存在于树枝模板中 – Symfony2
想象一下,我在我的树枝模板中有这样的东西
{% block posLeft %} ----- {%endblock%}
有什么办法可以检查posLeft块的存在,而不用调用:
block("posLeft")
并检查posBlock的返回值来改变存在。 我是Symfony2 + Twig的新手。
你可以像这样解决,如果你想显示一个特定的块只有当它有内容。 希望,这是你要找的。
示例index.html.twig
{% set _block = block('dynamic') %} {% if _block is not empty %} {{ _block|raw }} {% endif %}
示例part.html.twig
{% extends "index.html.twig" %} {% block dynamic %} Block content goes here. {% endblock %}
你可以这样做:
{% if block('posLeft') %} ... {% endif %}
但是如果你需要渲染块的输出, 效率是不高的 。 所以, 如果你需要块输出,你应该首先把它分配给variables ,然后做断言
树枝2.x
{{ (block("posLeft")) ?? '' }}
如果你想显示一个块,如果它被定义或不在一行。 可能是一个小顽固,但满足我的需要,没有一堆如果..然后逻辑。
这里的其他答案不适用于2.1(我没有testing2.0),所以这是一个小小的更新:
{% if block('dynamic') is defined %} {{ block('dynamic')|raw }} {% endif %}
请注意,渲染块的行不是 :
{% block dynamic %} {# this wont work #} {% endblock %}
这不会工作,因为该块将在编译期间呈现,所以testing将返回它存在(如在运行时testing)。 所以你需要用{{ block('dynamic')|raw }}
来渲染块,因为这实际上并没有定义模板中的块。
首先检查一下你在symfony项目中使用的Twig版本,因为这里的答案只适用于Twig 1。
如果你使用树枝2,你是幸运的。 根据Twig文档,您可以使用定义的testing来检查块是否存在于当前的模板上下文中。
{% if block("dynamic") is defined %} ... {% endif %}
我写了一个小小的TwigExtension来检查块是否被if语句调用,看起来像Twig只是检查块是否存在而不调用它。
链接到文档: http : //twig.sensiolabs.org/doc/2.x/functions/block.html
如果您正在使用树枝1 ,旧的答案在https://stackoverflow.com/a/13806784/6458657仍然是正确的。;
只是想提供另一个为我工作的例子。
<body {% if block('ngapp') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %} >
这允许我在子模板中声明{% block ngapp 'myApp' %}
并将其显示在父项中。
这是需要的,因为在一些页面上,我手动引导Angular( angular.bootstrap('moduleName', rootElement)
)和Angular不喜欢空的ng-app=''
指令,并以怪异的方式打破。