2016-09-29 6 views
2

Symfony 3.1とKNPメニューバンドルでは、2レベルのメニューツリーを構築します。KNPメニュー - 親メニューを強調表示

選択したページがメニュー内で強調表示されます。 私はドロップダウンメニューを使用しているので、メニューのトップレベルが強調表示されるようにしたい - 基本的には選択した子の親エントリ。

これを達成する方法はありません。ドキュメントは今まで役に立たなかった。どんな助けもありがたい。 ありがとうWolfram

答えて

0

あなたはすでに方法を見つけたと思いますが、誰かがまだそれを探している場合は、私は答えを出しています。

基本的にはsetCurrent()メソッドでこれを達成できます。たとえば、私は現在のルートでそれをチェックしたいと思っていました。だから、私がやったことは

  1. 、私のビルダーサービスで追加request_stackました。

    $menu->addChild('level1_1', array(
        'label' => "<span>Committee</span>", 
        'uri' => '#', 
        'extras' => array('safe_label' => true) 
    )); 
    $menu['level1_1']->addChild('level2_1', array(
        'label' => "<span>Level 2 Number 1</span>", 
        'route' => 'route_1', 
        'extras' => array('safe_label' => true) 
    )); 
    $menu['level1_1']->addChild('level2_2', array(
        'label' => "<span>Level 2 Number 2</span>", 
        'route' => 'route_2', 
        'extras' => array('safe_label' => true) 
    )); 
    $menu->addChild('level1_2', array(
        'label' => "<span>Committee</span>", 
        'uri' => '#', 
        'extras' => array('safe_label' => true) 
    )); 
    $menu['level1_2']->addChild('level2_3', array(
        'label' => "<span>Level 2 Number 3</span>", 
        'route' => 'route_3', 
        'extras' => array('safe_label' => true) 
    )); 
    $menu['level1_2']->addChild('level2_4', array(
        'label' => "<span>Level 2 Number 4</span>", 
        'route' => 'route_4', 
        'extras' => array('safe_label' => true) 
    )); 
    
  2. :だから私のサービスは、私のMenuBuilderクラス

    use Knp\Menu\FactoryInterface; 
    use Symfony\Component\Translation\TranslatorInterface; 
    use Symfony\Component\HttpFoundation\RequestStack; 
    
    class MenuBuilder 
    { 
        /** 
        * @var FactoryInterface 
        */ 
        private $factory; 
    
        /** 
        * @var TranslatorInterface 
        */ 
        private $translator; 
    
        /** 
        * @var RequestStack 
        */ 
        private $requestStack; 
    
        /** 
        * MenuBuilder constructor. 
        * @param FactoryInterface $factory 
        * @param TranslatorInterface $translator 
        */ 
        public function __construct(
         FactoryInterface $factory, 
         TranslatorInterface $translator, 
         RequestStack $requestStack 
        ) { 
         $this->factory = $factory; 
         $this->translator = $translator; 
         $this->requestStack = $requestStack; 
         $this->prefix = $requestStack->getCurrentRequest()->get('_prefix'); 
        } 
    } 
    
  3. のようなものを探していた中でその後、私は例えば、私のメニューを作成し、コンストラクタの一部今

    app.menu_builder: 
        class: MyBundle\Menu\MenuBuilder 
        arguments: ["@knp_menu.factory", "@security.authorization_checker", '@request_stack'] 
        tags: 
         - { name: knp_menu.menu_builder, method: createSideMenu, alias: side } 
    
  4. のようなものを探していました

    今は主要な部分です。メニューオブジェクトの準備が整った後は、ルートを親にマップし、親をアクティブに設定してからメニューオブジェクトを返すようにしました。このスイッチ部の代わりに

    $request = $this->requestStack->getCurrentRequest(); 
    $routeName = $request->get('_route'); 
    
    switch ($routeName) 
    { 
        case 'route_1': 
        case 'route_2': 
         $menu['level1_1']->setCurrent(true); 
         break; 
        case 'route_3': 
        case 'route_4': 
         $menu['level1_2']->setCurrent(true); 
         break; 
    } 
    

、あなたのニーズに応じて独自のログインを使用することができます。これが理解できるほど明確であることを願っています。

関連する問題