Добавить активный класс для связи с sf2 и веточкой
после простого кода:
<li><a href="{{ path('_list') }}">List</a></li>
есть ли простой способ добавить class="active"
, если текущая страница соответствует маршруту _list
?
используя новейший PR-релиз symfony2 и twig в качестве механизма шаблонов
Ответы
Ответ 1
Twig позволяет использовать условные выражения, а объект Request доступен во всем приложении. Если вы включили шаблон, чтобы получить маршрут, который вы хотите использовать:
app.request.attributes.get('_route')
Если вы используете функцию рендеринга, вы хотите использовать:
app.request.attributes.get('_internal')
При этом вы сможете использовать:
class="{% if app.request.attributes.get('_route') == '_list' %}active{% endif %}"
Ответ 2
Иногда вы не хотите выполнять точное сопоставление маршрута. В этих случаях вы можете использовать условную логику ветки "начинается с".
В качестве примера давайте предположим, что вы работаете с книгами. У вас есть следующие маршруты: book, book_show, book_new, book_edit. Вы хотите, чтобы элемент меню навигации был выделен для любого из этих случаев. Этот код выполнит это.
<a class="{% if app.request.attributes.get('_route') starts with 'book' %}active{% endif %}">Books</a>
<a class="{% if app.request.attributes.get('_route') starts with 'author' %}active{% endif %}">Authors</a>
В этом примере работает, по крайней мере, Symfony 2.3.x
Ответ 3
С тройным оператором:
{% set route = app.request.attributes.get('_route') %}
<ul class="nav navbar-nav">
<li {{ route == 'profile_index' ? 'class="active"' }}><a href="{{ path('profile_index') }}"><i class="icon-profile position-left"></i> My Profile</a></li>
<li {{ route == 'influencers_index' ? 'class="active"'}}><a href="{{ path('influencers_index') }}"><i class="icon-crown position-left"></i> Influencers</a></li>
<li {{ route == 'task_manager_index' ? 'class="active"'}}><a href="{{ path('task_manager_index') }}"><i class="icon-alarm-check position-left"></i> Task Manager</a></li>
</ul>
Ответ 4
Самая короткая версия:
{% set route = app.request.get('_route') %}
<li class="{{ route starts with 'post' ? 'open' }}"></li>
<li class="{{ route starts with 'category' ? 'open' }}"></li>
Иногда полезно:
{% set route = app.request.get('_route') %}
<li class="{{ 'post' in route ? 'open' }}"></li>
<li class="{{ 'category' in route ? 'open' }}"></li>
Ответ 5
я нашел очень хороший Bundle, который автоматически обрабатывает все это:
https://github.com/KnpLabs/KnpMenuBundle
Ответ 6
SF2.2
{{ dump(app.request.server.get('PATH_INFO')) }}
Ответ 7
Symfony2.3, в Twig, попробуйте это, чтобы получить uri:
{{ dump(app.request.server.get("REQUEST_URI")) }}
Ответ 8
Вот как я это делаю (используя Symfony 2.6)
<li {% if app.request.get('_route') == '_homepage' %} class="active" {% endif %}><a href="{{ path('_homepage') }}">Student</a></li>
'_homepage'
- это название маршрута в routing.yml
вашего пакета, и маршрут выглядит следующим образом:
_homepage:
path: /
defaults: { _controller: CoreBundle:Default:index }
Ответ 9
class= "class_name {% if loop.index0 == 0%} CLASSNAME {% endif%}"