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 に答える