想象一下,我的树枝模板中有类似的东西
{% block posLeft %}
-----
{%endblock%}
有没有办法检查posLeft块的存在而不调用:
block("posLeft")
并检查posBlock的返回值以改变存在。我是Symfony2 + Twig的新手。
答案 0 :(得分:76)
如果您想要仅在具有内容的情况下显示某个块,您可以像这样解决它。希望,这就是你要找的东西。
示例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 %}
答案 1 :(得分:17)
你可以这样做:
{% if block('posLeft') %}
...
{% endif %}
但如果您需要渲染块的输出,则效率不高。 所以如果你需要块输出,你应该首先将它分配给变量 然后做断言
答案 2 :(得分:11)
这里的其他答案不适用于树枝2.1(我没有在~2.0上测试过),所以这里有一个小小的更新:
{% if block('dynamic') is defined %}
{{ block('dynamic')|raw }}
{% endif %}
请注意,渲染块的行是不:
{% block dynamic %}
{# this wont work #}
{% endblock %}
这不会起作用,因为块将在编译期间呈现,因此测试将返回true,表明它存在(在运行时测试)。所以你需要用{{ block('dynamic')|raw }}
来渲染块,因为这并没有在模板中实际定义块。
答案 3 :(得分:8)
Twig 2.x
{{ (block("posLeft")) ?? '' }}
如果要在一行中定义或不显示块,则显示该块。可能有点kludgy但满足我的需要没有一堆if..then逻辑。
答案 4 :(得分:7)
首先检查您在symfony项目中使用的Twig版本,因为此处的答案仅适用于Twig 1.
如果您使用的是Twig 2 ,那么您很幸运。根据Twig文档,您可以使用定义的测试来检查当前模板上下文中是否存在块。
{% if block("dynamic") is defined %}
...
{% endif %}
我写了一个小的TwigExtension来检查是否在if语句中调用了块,看起来Twig只是检查块是否存在并且没有调用它。
指向文档的链接:http://twig.sensiolabs.org/doc/2.x/functions/block.html
如果您使用的是Twig 1 ,则https://stackoverflow.com/a/13806784/6458657上的旧答案仍然正确。
答案 5 :(得分:1)
只想提供另一个适合我的例子。
<body
{% if block('ngapp') is not empty %}ng-app="{% block ngapp %}{% endblock %}"{% endif %}
>
这允许我在子模板中声明{% block ngapp 'myApp' %}
并将其显示在父模板中。
这是必要的,因为在某些页面上我通过(angular.bootstrap('moduleName', rootElement)
)手动引导Angular,而Angular不喜欢空ng-app=''
指令并以奇怪的方式中断。