web-dev-qa-db-ja.com

Symfony2-Twig-パラメータを親テンプレートに送信するにはどうすればよいですか?

私はPHP Symfony2とTwigテンプレートを使用したプロジェクトに取り組んでいますが、この問題の解決策が見つかりません。

管理バンドルがあり、すべてのテンプレートは、メニュー付きのマスターテンプレートを持つ管理ベースから拡張されます。

ユーザーがそのページにいるときに、ページのベーステンプレートのメニューの現在のタブを選択済みに設定する必要があります。

extends を介してベーステンプレートにパラメーターを渡す方法はありますか?

46
Germán Lena

以下に簡単な例を示します。

base.html.twig

{# base.html.twig #}
...
<ul>
  <li{% if menu_selected|default('one') == 'one' %} class="selected"{% endif %}>One</li>
  <li{% if menu_selected == 'two' %} class="selected"{% endif %}>Two</li>
  <li{% if menu_selected == 'three' %} class="selected"{% endif %}>Three</li>
</ul>
...

page2.html.twig

{# page2.html.twig #}
{% extends 'YourBundle::base.html.twig' %}

{% set menu_selected = 'two' %}

Page2.html.twigのレンダリングからの出力:

<ul>
  <li>One</li>
  <li class="selected">Two</li>
  <li>Three</li>
</ul>
82
Paulpro

私が今発見したより良い方法は、ショートカットルート名のルートをチェックすることによる基本的なアプローチです。

<li class="{% if app.request.attributes.get('_route') == 'homepage' %}active{% endif %}">Home</li>

または、別の方法は、すべてのルートショートカット名を、それが属するグループに従って指定することです。たとえば、製品コントローラからのすべてのルートは「product _....」で始まり、テンプレートで次のことができます。

<li class="{% if app.request.attributes.get('_route') starts with 'product' %}active{% endif %}">
3
pogeybait