phpzend-frameworkzend-framework2

ZF2: Dynamically created sub pages in navigation doesn't become active (isActive() == false)


I have the following issue...

This is my navigation:

return array(
    'navigation' => array(
        'site' => array(
            array(
                'label' => 'Home',
                'route' => 'site',
            ),
            'categories' => array(
                'label' => 'Categories',
                'class' => 'categories',
                'uri' => '#',
            ),
            'contact-us' => array(
                'label' => 'Contact Us',
                'route' => 'site/contact-us',
            ),
        ),
    ),
);

and in my Module.php I have function:

public function attachSubMenu($serviceManager) {
        $siteNavigation = $serviceManager->get('siteNavigation');
        $router = $serviceManager->get('router');
        $categoriesTable = $serviceManager->get('Category/Model/Table/CategoriesTable');
        $categories = $categoriesTable->fetchAll();
        $categoriesRoute = $siteNavigation->findByClass('categories');
        if (!is_null($categoriesRoute)) {
            $pages = array();
            foreach ($categories as $category) {
                $newPage = new Mvc(array(
                    'label' => $category->name,
                    'route' => 'site/categories',
                    'params' => array(
                        'category' => $category->route
                    ),
                ));
                $newPage->setRouter($router);

                array_push($pages, $newPage);
            }
            $categoriesRoute->addPages($pages);
        }
    }

So far so good. Now I have menu with Category item and list with categories as subMenu of Category. But when I click one of the listed categories, neither the submenu nor parent element has class "active". When I click on Home, I have class "active", so the problem is somewhere in the category listing, in my opinion.

This is how I show navigation in layout:

<?= $this->navigation('siteNavigation')->menu()->setMaxDepth(1); ?>

I debugged and found that when I generate dynamically these categories in Zend\Navigation\Page\Mvc -> isActive function $this->getRoute() doesn't return category route... If I add categories like that:

 return array(
        'navigation' => array(
            'site' => array(
                array(
                    'label' => 'Home',
                    'route' => 'site',
                ),
                'categories' => array(
                    'label' => 'Categories',
                    'class' => 'categories',
                    'uri' => '#',
                    'pages' => array(
                         array(
                            'label' => 'Cat1',
                            'route' => 'site/categories',
                            'params' => array(
                                'category' => 'cat1'
                             ),
                      //.....
                        ),
                    ),
                ),
                'contact-us' => array(
                    'label' => 'Contact Us',
                    'route' => 'site/contact-us',
                ),
            ),
        ),
    );

everything works fine. subMenu and parent menu has class "active"....

Any idea how to fix this issue?


Solution

  • I thnink I found the solution...

    RouteMatch was not set in the new pages, so I added one more line after:

    $newPage->setRouter($router);
    $newPage->setRouteMatch($routeMatch);//The new line;
    

    Then my navigation work as expected.