Я знаю, что это старая тема, но все же вы найдете ее в топ-3 в Google, поэтому вот небольшое обновление к ней.
Вы можете по-разному подходить к созданию навигации с помощью «класса выделения»с Symfony.
1.Проверьте маршрут
Как подсказывает @ Себастьян J , вы можете проверить с помощью if else для маршрута.
<li{% if app.request.get('_route') == 'foo_products_overview' %} class="active"{% endif %}>
Проблема: официально не поддерживается, как указали @ netmikey : Как получить текущий маршрут в Symfony 2?
1.1.Проверьте массив маршрутов
Я фактически использую это в своих проектах, с одной настройкой.Я использую функцию в массиве, чтобы иметь возможность указывать более одного маршрута.
<li{% if app.request.attributes.get('_route') in [
'foo_products_overview',
'foo_products_detail',
'foo_products_bar'
] %} class="active"{% endif %}>
1.2.Проверьте начало маршрута с ...
Третий подход - это то, что предложил @ bernland .Давайте предположим, что мы хотим сопоставить все маршруты, начинающиеся с foo_products
, и мы хотели бы применить это с помощью магии.
<li{% if app.request.attributes.get( '_route' ) starts with 'foo_products' %} class="active"{% endif %}>
Как я уже сказал, я использую это, и у меня еще не было проблем.
2.Используйте комплект / функцию Я уверен, что есть другие комплекты, но я бы порекомендовал вам это для создания вашей навигации: https://github.com/KnpLabs/KnpMenuBundle
3.Используйте макрос edit июль 2015
Мой новый фаворит - использовать макрос вроде
{% macro menuItem(name, url, subitems) %}
{% spaceless %}
{% set subitems = subitems|default({}) %}
{% set currentUrl = path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')) %}
{% set isActive = currentUrl == url %}
{% for name, suburl in subitems %}
{% set isActive = not isActive and currentUrl == suburl %}
{% endfor %}
<li{% if isActive %} class="is-active"{% endif %}>
<a href="{{ url }}"{% if subitems|length > 0 %} class="has-sub-menu"{% endif %}>{{ name|trans() }}</a>
{% if subitems|length > 0 %}
<ul class="main-sub-menu">
{% for name, url in subitems %}
{{ _self.menuItem(name, url) }}
{% endfor %}
</ul>
{% endif %}
</li>
{% endspaceless %}
{% endmacro %}
, просто добавьте этот код где-нибудь в файле ветки (не в {% block %}
вещь!)
Затем вы можете назвать это так для одного элемента:
{{ _self.menuItem('FooBar', path('foo_foobar')) }}
или для элемента с подпунктами:
{{ _self.menuItem('FooBar', path('foo_foobar'), {
'Foo': path('foo_baz', {slug: 'foo'}),
"Bar": path('foo_baz', {slug: 'bar'}),
}) }}
Красиво, неэто?