Aroused
@Aroused

Как сделать активное меню?

Требуется задать класс .selected активному пункту меню, а так же снять ссылку.
Как это сделать правильно и лаконично (без JS)?
homepage:
    path: /
    defaults: { _controller: SiteAppBundle:Main:index }
download:
    path: /download
    defaults: { _controller: SiteAppBundle:Main:download }
entry:
    path: /entry/{name}
    defaults: { _controller: SiteAppBundle:Main:entry }

<li><a href="{{ path('homepage') }}">HOME</a></li>
<li><a href="{{ path('entry', {'name': 'info'}) }}">INFO</a></li>
<li><a href="{{ path('entry', {'name': 'settings'}) }}">SETTINGS</a></li>
<li><a href="{{ path('download') }}">DOWNLOAD</a></li>


UPD
Создал переменные в главном шаблоне:
{% set route = app.request.get('_route') %}
{% set entry = app.request.get('_route') == 'entry' ? app.request.get('_route_params').name : '' %}

Вынес меню в menu.html.twig и подключил его в главный шаблон.
Дальше обычная проверка через {% if %}
<li>{% if route == 'homepage' %}HOME{% else %}<a href="{{ path('homepage') }}">HOME</a>{% endif %}</li>
<li>{% if entry == 'info' %}INFO{% else %}<a href="{{ path('entry', {'name': 'info'}) }}">INFO</a>{% endif %}</li>
<li>{% if entry == 'settings' %}SETTINGS{% else %}<a href="{{ path('entry', {'name': 'settings'}) }}">SETTINGS</a>{% endif %}</li>
<li>{% if route == 'download' %}DOWNLOAD{% else %}<a href="{{ path('download') }}">DOWNLOAD</a>{% endif %}</li>

p.s. К сожалению, через расширение Twig использовать тест вот так:
{% if 'homepage' is is_page %}текущая страница "homepage"{% endif %}

не вышло Как получить имя роута в расширении Twig (тест)?

Будет вариант еще короче, предлагайте =D
Всем спасибо!
  • Вопрос задан
  • 700 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
1. symfony.com/doc/current/bundles/KnpMenuBundle/inde...
2. Если сторонние бандлы подключать не хочется, то можно сделать что-то вроде этого (но лаконичностью тут не пахнет):
{% if app.request.attributes.get('_route') == 'homepage' %}
    <li class="selected"><span>HOME</span></li>
{% else %}
    <li><a href="{{ path('homepage') }}">HOME</a></li>
{% endif %}

{% if app.request.attributes.get('_route') == 'entry' and
    app.request.attributes.get('_route_params').name is defined and
    app.request.attributes.get('_route_params').name == 'info' %}
    <li class="selected"><span>INFO</span></li>
{% else %}
    <li><a href="{{ path('entry', { 'name': 'info' }) }}">INFO</a></li>
{% endif %}

{% if app.request.attributes.get('_route') == 'entry' and
    app.request.attributes.get('_route_params').name is defined and
    app.request.attributes.get('_route_params').name == 'settings' %}
    <li class="selected"><span>SETTINGS</span></li>
{% else %}
    <li><a href="{{ path('entry', { 'name': 'settings' }) }}">SETTINGS</a></li>
{% endif %}

{% if app.request.attributes.get('_route') == 'download' %}
    <li class="selected"><span>DOWNLOAD</span></li>
{% else %}
    <li><a href="{{ path('download') }}">DOWNLOAD</a></li>
{% endif %}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы