将当前路由或模板指定为活动链接KnpMenu

时间:2012-07-10 06:07:35

标签: symfony menu knpmenu

在symfony2中,如上所述,我想在Controller或Template中将指定的菜单子项设置为活动状态,我该如何实现?也就是说,我想将几​​个路径(控制器动作,模板)映射到一个菜单子,这可能吗?我想我可以在控制器或模板中获取菜单并将其设置为活动状态。

1 个答案:

答案 0 :(得分:5)

使用 KNPMenuBundle 时已经实现了这一点。系统会自动为first lastcurrent元素生成类。


您的菜单将自动显示如下:

<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菜单包呈现菜单的方式,请覆盖knp_menu.html.twig。您可以看到程序here