47

想象一下我的树枝模板中有这样的东西

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

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

block("posLeft") 

并检查 posBlock 的返回值以验证是否存在。我是 Symfony2 + Twig 的新手。

4

6 回答 6

83

如果您只想在某个块有内容的情况下显示某个块,您可以这样解决它。希望,这就是你要找的。

示例 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 %}
于 2012-12-10T18:18:18.567 回答
19

你可以这样做:

{% if block('posLeft') %}
  ...
{% endif %}

但是,如果您需要渲染块的输出,则效率不高。因此,如果您需要块输出,则应首先将其分配给变量, 然后进行断言

于 2013-01-16T15:44:59.130 回答
16

这里的其他答案不适用于 twig 2.1(我没有在 ~2.0 上测试过),所以这里有一个小的更新:

{% if block('dynamic') is defined %}
    {{ block('dynamic')|raw }}
{% endif %}

请注意,渲染块的行不是

{% block dynamic %}
    {#  this wont work  #}
{% endblock %}

这不会起作用,因为该块将在编译期间呈现,因此测试将返回它存在的真值(因为它在运行时测试)。所以你需要渲染块,{{ block('dynamic')|raw }}因为这实际上并没有在模板中定义块。

于 2017-02-12T09:03:15.627 回答
11

首先检查您在 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上的旧答案仍然正确。

于 2017-01-16T12:01:04.320 回答
8

树枝 2.x

{{ (block("posLeft")) ?? '' }}

如果您想在一行中显示一个块是否已定义。可能有点笨拙,但无需一堆 if..then 逻辑就可以满足我的需求。

于 2017-04-12T15:50:46.133 回答
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=''指令并且以奇怪的方式中断。

于 2016-12-08T13:42:12.540 回答