2016-09-29 171 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; 
    } 
    

代替此开关部分,你可以根据自己的需要使用自己的登录。希望这足以让人明白。