Укажите текущий маршрут или шаблон в качестве активной ссылки KnpMenu

В symfony2, как описано выше, я хочу установить указанный дочерний элемент меню в качестве активного состояния в Controller или Template, как я могу этого добиться? То есть я хочу, чтобы несколько маршрутов (действие контроллера, шаблон) отображались в одном дочернем меню, это возможно? Я думаю, я мог бы получить меню в контроллере или шаблон и установить его в активном.

1 ответ

Решение

Это уже реализовано при использовании KNPMenuBundle. Классы автоматически создаются для firstlast а также current элементы.


Ваше меню автоматически будет выглядеть так:

<ul>
    <li class="first">
        <a href="/whatever1">Menu Level 1</a>        
    </li>
    <li class="current">
        <a href="/whatever2">Menu Level 2</a>        
    </li>
    <li class="last">
       <a href="/whatever3">Menu Level 3</a>
    </li>
</ul>

Предполагая, что вы используете конструктор меню следующим образом:

//src/Acme/YourBundle/Menu/MenuBuilder.php
public function createSimpleMenu(Request $request)
    {
        $menu = $this->factory->createItem('root');
        $menu->setCurrentUri($request->getRequestUri());

        $menu->addChild('Menu Level 1', array('route' => '_route_whatever1'));
        $menu->addChild('Menu Level 2', array('route' => '_route_whatever2'));
        $menu->addChild('Menu Level 3', array('route' => '_route_whatever3'));

        return $menu;
    }

Поэтому вам нужно применить CSS к current вместо active, Как видите, работа осуществляется $menu->setCurrentUri($request->getRequestUri());,

Если вы хотите настроить ваше меню вручную (в вашем случае вы хотите иметь несколько маршрутов, которые отображаются на один и тот же элемент), вы можете использовать оператор switch:

//src/Acme/YourBundle/Menu/MenuBuilder.php
public function createSimpleMenu(Request $request)
{
// YOUR MENU AS USUAL FIRST
// ...
// A SWITCH IF YOU WISH TO CUSTOMIZE MANUALLY
switch($request->get('_route')) {
    case "_route_whatever1bis":
        $menu['Menu Level 1']->setCurrent(true);
        break;
    case "_route_whatever2bis":
        $menu['Menu Level 2']->setCurrent(true);
        break;
    case "_route_whatever3bis":
        $menu['Menu Level 3']->setCurrent(true);
        break;
    }
return $menu;
}

Примечание. Чтобы настроить способ отображения меню в KNP Menu Bundle, переопределите knp_menu.html.twig, Вы можете увидеть процедуру здесь.

Другие вопросы по тегам