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