2016-09-29 5 views
2

С набором функций Symfony 3.1 и KNP Я создаю дерево меню уровня 2.Меню KNP - выделение родительского меню

Выбранная страница подсвечивается в меню. Поскольку я использую раскрывающееся меню, я также хочу, чтобы высший уровень меню был выделен - в основном родительская запись моего выбранного ребенка.

Не знаю, как этого достичь. Документы пока не помогли. Любая помощь оценивается. Thanks 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; 
    } 
    

Вместо этого переключателя раздела, вы можете использовать свой собственный вход в соответствии с вашими потребностями. Надеюсь, это достаточно ясно, чтобы понять.