55
votes

I am working on a PHP project using Symfony2 with Twig templating, and I can't find a solution for this problem.

I have an admin bundle and all the templates extend from admin base which has a master template with a menu.

I need to set the current tab of the menu in the base template of the page to selected when the user is on that page.

Is there any way to pass parameter to the base template through extends?

2

2 Answers

93
votes

Here is a simple example:

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' %}

Output from rendering page2.html.twig:

<ul>
  <li>One</li>
  <li class="selected">Two</li>
  <li>Three</li>
</ul>
4
votes

A better way that I just discovered is the basic approach by checking the route for the shortcut route name:

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

Or another way is to name all your route shortcut names according to the group it belongs to. For example all the routes from your products controller start with "product_...." and then in the template you can do this:

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