如何检查树枝模板中是否存在块 - Symfony2

时间:2012-12-08 04:11:30

标签: symfony twig

想象一下,我的树枝模板中有类似的东西

{% block posLeft %}
   -----
{%endblock%}

有没有办法检查posLeft块的存在而不调用:

block("posLeft") 

并检查posBlock的返回值以改变存在。我是Symfony2 + Twig的新手。

6 个答案:

答案 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=''指令并以奇怪的方式中断。