如何检查一个块是否存在于树枝模板中 – 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=''指令,并以怪异的方式打破。