3

次のブロックを含む小枝テンプレートがあります。

{% 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 }}">

ここでの問題は、ダッシュボード ブロック全体が 2 回呼び出されることです。ブロックがいくつかのコントローラーアクションをレンダリングすることを除いて、これはあまり気にしません。つまり...

{% render "UserWidget:userAppMenu" %}

...そして、そのアクションのコードが 2 回呼び出されています。さまざまな理由で、パフォーマンスが重要ではありませんが、これはそのダッシュボード ブロック内のいくつかのものを台無しにします。

それで、私の質問は...そのブロックが空であるかどうかを2回ロードせずに判断する方法はありますか? 私が見逃している本当に単純なものはありますか、それとも可能ですか?

ありがとう!

編集:

物事を明確にするのに役立つ場合、これが私の完全なテンプレートです。

{% 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 行目に見ることができます。どちらも実際には、そのインクルードにあるものをインクルードして処理しているようです。

4

1 に答える 1