简介
我正在一个非常大的网站工作,每页有两个导航菜单。第一个是链接到网站各部分的全局导航,第二个是全局导航菜单中所选项目的分区级导航。
为了提高效率,我们认为始终在Navigation
服务中加载整个站点导航结构是不明智的。相反,我们选择始终加载全局导航结构,但随后使用基于加载部分生成的单独Navigation
。
配置
全局Navigation
如下所示:
array(
array(
'type' => 'mvc',
'label' => 'Section 1',
'route' => 'section1'
),
array(
'type' => 'mvc',
'label' => 'Section 2',
'route' => 'section2'
),
array(
'type' => 'mvc',
'label' => 'Section 3',
'route' => 'section3'
)
)
动态加载的部分级Navigation
如下所示:
array(
array(
'type' => 'uri',
'label' => 'Group 1',
'pages' => array(
array(
'type' => 'mvc',
'label' => 'Page 1',
'route' => 'section1/page1'
),
array(
'type' => 'mvc',
'label' => 'Page 2',
'route' => 'section1/page2'
),
array(
'type' => 'mvc',
'label' => 'Page 3',
'route' => 'section1/page3'
),
)
)
// ... more groups
)
问题
问题在于,全局Navigation
仅在当前请求高级路由时才具有活动项目(例如 section1
(。一旦用户导航到该部分中的另一个页面(例如 section1/page1
(,全局Navigation
不再具有活动项目。
尝试了什么
在阅读了Menu
插件和Page
类的源代码后,看起来它只支持按名称进行精确路由匹配,并且设置 controller
选项不起作用。
为了进行测试,我们将部分Navigation
添加到全局Navigation
,就像在标准配置中所做的那样,并且显示所需的结果,其中全局项目在该部分的所有路由中始终处于活动状态。
有没有办法使它与当前配置一起工作?如果没有,你会建议什么来制作结构以使其能够工作?
我们已经成功地在全球Navigation
服务工厂中使用了这样的东西:
$event = $serviceLocator->get('Application')->getMvcEvent();
$matched_route = $event->getRouteMatch()->getMatchedRouteName();
$route_section = explode('/',$matched_route)[0];
然后在定义页面时:
array(
array(
'type' => 'mvc',
'label' => 'Section 1',
'route' => 'section1',
'active' => ($route_section === 'section1')
),
// ... etc
)
警告。。。
此解决方案可能会受到限制。这可以防止我们拥有横截面 URL。部分不能包含另一个部分中的路由链接,否则不会更改全局导航活动项。希望这对我们来说不是问题。