使用Symfony 3.1和KNP菜单包,我构建了一个2级菜单树。
所选页面在菜单中突出显示。 当我使用下拉菜单时,我还希望突出显示顶级菜单 - 基本上是我所选孩子的父条目。
不知道如何实现这一目标。到目前为止,Docs没有帮助。任何帮助赞赏。 谢谢Wolfram
答案 0 :(得分:0)
已经很晚了,我想你已经找到了方法,但是如果有人还在寻找,我会给出答案。
基本上,您可以通过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;
}
您可以根据需要使用自己的登录信息代替此切换部分。希望这很清楚,可以理解。