2014-12-03 123 views
0

介绍

我的工作有每页两个导航菜单的一个非常大的网站时,显示的是孩子的路线导航的活动状态。第一个是全局导航,链接到网站的各个部分,第二个是全局导航菜单中所选项目的部分级导航。Zend框架2:使用多个导航

为了提高效率,我们决定始终加载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它将在标准配置来完成和所需的结果显示,其中全球产品总是在部分的所有路由有效。

有什么办法可以使这个工作与当前配置?如果不是,你会建议如何使结构能够工作?

回答

0

我们已经成功使用像这样在全球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 
) 

买者...

该解决方案可能是有限的。这可以防止我们拥有横截面网址。在不更改全局导航活动项目的情况下,部分不能包含另一个部分中的路线的链接。希望这不会成为我们的问题。