【问题标题】:Specify current route or template as active link KnpMenu将当前路由或模板指定为活动链接 KnpMenu
【发布时间】:2012-07-09 14:08:33
【问题描述】:

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

【问题讨论】:

    标签: symfony menu knpmenu


    【解决方案1】:

    这在使用 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。 可以看到,job是由$menu-&gt;setCurrentUri($request-&gt;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。可以看程序here

    【讨论】:

    • 你的方法很好,但是短语 $request->get('_route') 只是返回“_internal”作为结果,我怎么才能真正得到请求的路由名称?
    • 这个话题和你的problem有关。请参阅 carignan.boy 的回复。
    猜你喜欢
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2012-05-01
    • 2018-03-24
    相关资源
    最近更新 更多