KNP菜单 - 突出显示父菜单

时间:2016-09-29 19:10:50

标签: knpmenubundle symfony-3.1

使用Symfony 3.1和KNP菜单包,我构建了一个2级菜单树。

所选页面在菜单中突出显示。 当我使用下拉菜单时,我还希望突出显示顶级菜单 - 基本上是我所选孩子的父条目。

不知道如何实现这一目标。到目前为止,Docs没有帮助。任何帮助赞赏。 谢谢Wolfram

1 个答案:

答案 0 :(得分: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;
    }
    
  5. 您可以根据需要使用自己的登录信息代替此切换部分。希望这很清楚,可以理解。