次のブロックを含む小枝テンプレートがあります。
{% 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 行目に見ることができます。どちらも実際には、そのインクルードにあるものをインクルードして処理しているようです。