2016-09-29 172 views
2

使用Symfony 3.1和KNP菜單包我構建了2級菜單樹。KNP菜單 - 突出顯示父菜單

所選頁面在菜單中突出顯示。 當我使用下拉菜單時,我還想讓頂層菜單高亮顯示 - 基本上是我選擇的孩子的父項。

不知道如何實現這一點。 Docs目前沒有幫助。任何幫助讚賞。 感謝Wolfram

回答

0

現在已經很晚了,我想你已經找到了方法,但如果有人仍在尋找它,我會給出我的答案。

基本上你可以通過setCurrent()方法實現這一點。例如,我想用我目前的路線檢查它。所以,我所做的是,

  1. 新增request_stack在我的生成器服務。所以,我的服務一直在尋找像

    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 } 
    
  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. 然後,我建立了我的菜單,例如:

    $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) 
    )); 
    
  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; 
    } 
    

代替此開關部分,你可以根據自己的需要使用自己的登錄。希望這足以讓人明白。