1

symfony2 では、上記のように、指定されたメニューの子を Controller または Template でアクティブなステータスとして設定したいのですが、どうすればそれを達成できますか? つまり、複数のルート (コントローラー アクション、テンプレート) を 1 つのメニューの子にマップしたいのですが、それは可能ですか? コントローラーまたはテンプレートでメニューを取得して、アクティブに設定できると思います。

4

1 に答える 1

5

KNPMenuBundleを使用する場合、これは既に実装されています。クラスはfirst lastおよび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>

Menu builder を次のように使用すると仮定します。

//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;
    }

currentしたがって、css をの代わりに適用する必要があります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。手順はこちらでご覧いただけます

于 2012-07-10T08:12:53.757 に答える