【问题标题】:Is a Twig block empty? - Symfony 2Twig 块是空的吗? - Symfony 2
【发布时间】:2013-05-16 18:18:48
【问题描述】:

我有一个带有以下块的树枝模板:

{% block dashboard %}
    {% include "::user_dashboard.html.twig" %}
{% endblock dashboard %}

稍后在该模板中,我想根据该块中是否有任何内容在 div 上设置一个类(即,默认情况下,它将具有上面的包含,但该模板的子级可能会覆盖它并且将其清空)。

我所拥有的(有点工作)是......

{% set _dashboard = block('dashboard') %}
{% set _mainWidth = ( _dashboard|trim is empty ? "no-dashboard" : "with-dashboard" ) #}
<div id="main" class="{{ _mainWidth }}">

这里的问题是整个仪表板块被调用了两次。除了该块呈现一些控制器操作之外,这不会打扰我太多,即...

{% render "UserWidget:userAppMenu" %}

... 并且该操作中的代码被调用了两次。由于各种原因,其中最重要的是性能,这与仪表板块中的一些东西混淆了。

所以,我的问题是……有没有办法在不加载两次的情况下判断该块是否为空?是否有一些非常简单的东西我错过了,或者这甚至可能吗?

谢谢!

编辑:

如果它有助于澄清事情,这是我的完整模板:

{% extends '::base.html.twig' %}

{% block layout %}

{% block header %}
    {% include "::header.html.twig" %}
{% endblock header %}

<div id="container" class="row-fluid">

    {% block dashboard %}
        {% include "::user_dashboard.html.twig" %}
    {% endblock dashboard %}

    {% set _dashboard = block('dashboard') %}
    {% set _mainWidth = ( _dashboard|trim is empty ? "no-dashboard" : "with-dashboard" ) %}  
    <div id="main" class="{{ _mainWidth }}">
        <h1 class="page-title">{% block page_title %}{% endblock %}</h1>
        {% block main_filters %}{% endblock %}

        {% if app.session.flashbag.has('message') %}
          <div class="alert alert-block alert-success">
            <ul>
                {% for flashMessage in app.session.flashbag.get('message') %}
                    <li>{{ flashMessage }}</li>
                {% endfor %}
            </ul>
          </div>
        {% endif %}

        {% if app.session.flashbag.has('warning') %}
          <div class="alert alert-block alert-success">
            <ul>
                {% for flashWarning in app.session.flashbag.get('warning') %}
                    <li>{{ flashWarning }}</li>
                {% endfor %}
            </ul>
          </div>
        {% endif %}

        {% block body %}{% endblock %}

        {% block footer %}
            {% include "::footer.html.twig" %}
        {% endblock footer %}
    </div>

</div>

{% endblock layout %}

在这里,您可以在第 11 行和第 15 行看到 - 这两行实际上似乎都包含并处理了包含的内容。

【问题讨论】:

  • Twig 中没有render 标签...
  • @Paulpro 有!但是文档真的……嗯……没有。但是请参阅thisstackoverflow 上的出色答案。
  • @SirDerpington 哇哦。谢谢!我从来不知道那个标签。
  • 我正在使用 Symfony 2.1,但我不确定在哪里找到了该渲染语法,但它可以工作。显然,新的 (2.2, 2.3) 方式略有不同:symfony.com/doc/master/book/… ...如果我认为升级到 2.2 并且新语法会有所帮助,我会这样做。无论如何我仍然可能,但我不相信这是这里唯一的问题。

标签: symfony twig


【解决方案1】:

这个呢?这样,当您调用 block('dashboard') 时,该块应该只呈现一次。

{# at top of twig #}
{% set _dashboard = block('dashboard') %}

{# where ever you include your block #}
<div>
    {{ _dashboard|raw }}
</div>

{# and your main #}
{% set _mainWidth = ( _dashboard|trim is empty ? "no-dashboard" : "with-dashboard" ) #}
<div id="main" class="{{ _mainWidth }}">

【讨论】:

  • 这里的问题是我需要在该块内默认放置一些东西,所以我的模板包含该默认内容。后来,当我为该块设置一个变量以测试它现在是否为空时,那个简单的调用 {% set _dashboard = block('dashboard') %} 实际上再次包含了该块。我将编辑我的问题以包含完整的模板,希望有助于澄清......
  • 现在,我已经开始设置一个额外的模板 - 一个有仪表板,一个没有仪表板。然后,不是清空我不需要的块,而是扩展没有它的模板。这很容易工作,可以让我继续前进,但我仍然有一种方法可以使用一个模板。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多