Zend 框架 2:使用多个导航时显示子路由的导航活动状态


Zend Framework 2: Showing active state of Navigation for child route when using multiple Navigations

简介

我正在一个非常大的网站工作,每页有两个导航菜单。第一个是链接到网站各部分的全局导航,第二个是全局导航菜单中所选项目的分区级导航。

为了提高效率,我们认为始终在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。部分不能包含另一个部分中的路由链接,否则不会更改全局导航活动项。希望这对我们来说不是问题。