2

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

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

不知道如何实现这一目标。到目前为止,文档没有帮助。任何帮助表示赞赏。谢谢沃尔夫拉姆

4

1 回答 1

1

现在已经很晚了,我想你已经找到了路,但如果有人还在寻找它,我正在给出我的答案。

基本上你可以通过该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;
    }
    

代替此开关部分,您可以根据需要使用自己的登录。希望这足够清楚,可以理解。

于 2017-07-31T18:15:52.660 回答