【问题标题】:KNP menu - highlight parent menuKNP 菜单 - 突出显示父菜单
【发布时间】:2017-02-08 05:54:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: knpmenubundle symfony-3.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;
      }
      

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2016-10-30
      • 2016-12-15
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多