Symfony 3.1 と KNP メニュー バンドルを使用して、2 レベルのメニュー ツリーを構築します。
選択したページがメニュー内で強調表示されます。ドロップダウン メニューを使用しているので、メニューのトップ レベル (基本的には選択した子の親エントリ) を強調表示することも必要です。
これを達成する方法がわかりません。ドキュメントはこれまでのところ役に立ちませんでした。どんな助けでも感謝します。ありがとうウルフラム
Symfony 3.1 と KNP メニュー バンドルを使用して、2 レベルのメニュー ツリーを構築します。
選択したページがメニュー内で強調表示されます。ドロップダウン メニューを使用しているので、メニューのトップ レベル (基本的には選択した子の親エントリ) を強調表示することも必要です。
これを達成する方法がわかりません。ドキュメントはこれまでのところ役に立ちませんでした。どんな助けでも感謝します。ありがとうウルフラム
大変遅くなりましたが、あなたはすでに道を見つけたと思いますが、誰かがまだ探している場合のために、私は答えます.
setCurrent()
基本的に、メソッドを介してこれを実現できます。たとえば、現在のルートで確認したかったのです。それで、私がしたことは、
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 }
今、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');
}
}
次に、たとえばメニューを作成しました。
$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)
));
いよいよ本編です。メニュー オブジェクトの準備ができたら、ルートをその親にマップし、メニュー オブジェクトを返す前に親をアクティブに設定しました。
$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;
}
このスイッチ セクションの代わりに、必要に応じて独自のログインを使用できます。これが理解できるほど明確であることを願っています。