Как настроить 2 навигации в zf2?

У меня есть конфиг для основной навигационной ссылки, а вторая просто с 1 ссылкой. Основная навигация работает нормально, но когда я пытаюсь настроить вторую панель навигации в модуле так:

$config = $e->getApplication()->getServiceManager()->get('config');
$navigation = new \Zend\Navigation\Navigation($config['navigation_footer']);
$e->getApplication()->getServiceManager()
    ->setService('new_navigation', $navigation);`

Я получаю сообщение об ошибке при отображении в виде:

Неустранимая ошибка: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref не может быть выполнен, поскольку экземпляр Zend\Mvc\Router\RouteStackInterface не находится в /home/cawa/www/sp-app/vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php в строке 471

1 ответ

Решение

Проблема в отсутствии Маршрутизатора (или, если быть более точным, Zend\Mvc\Router\RouteStackInterface). Стек маршрутов представляет собой набор маршрутов и может использовать имя маршрута, чтобы превратить его в URL. В основном он принимает имя маршрута и создает для вас URL:

$url = $routeStack->assemble('my/route');

Это происходит на страницах MVC Zend\Navigation тоже. На странице есть route параметр и когда есть доступный маршрутизатор, страница собирает свой собственный URL (или в Zend\Navigation условия, href). Если вы не предоставляете маршрутизатор, он не может собрать маршрут и, таким образом, выдает исключение.

Вы должны внедрить роутер на каждой странице навигации:

$navigation = new Navigation($config);
$router     = $serviceLocator->get('router');

function injectRouter($navigation, $router) {
  foreach ($navigation->getPages() as $page) {
    if ($page instanceof MvcPage) {
      $page->setRouter($router);
    }

    if ($page->hasPages()) {
      injectRouter($page, $router);
    }
  }
}

Как видите, это рекурсивная функция, внедряющая маршрутизатор в каждую страницу. Скучная! Поэтому есть фабрика, чтобы сделать это для вас. Есть четыре простых шага, чтобы это произошло.

ПЕРВЫЙ ШАГ

Сначала поместите конфигурацию навигации в конфигурацию вашего модуля. Так же, как у вас есть default навигация, вы можете создать второй secondary,

'navigation' => array(
    'secondary' => array(
        'page-1' => array(
            'label' => 'First page',
            'route' => 'route-1'
        ),
        'page-2' => array(
            'label' => 'Second page',
            'route' => 'route-2'
        ),
    ),
),

У вас есть маршруты к вашей первой странице (route-1) и вторая страница (route-2).

ШАГ ВТОРОЙ

Фабрика преобразует это в структуру объекта навигации, для этого нужно сначала создать класс. Создать файл SecondaryNavigationFactory.php в вашем каталоге MyModule / Navigation / Service.

namespace MyModule\Navigation\Service;

use Zend\Navigation\Service\DefaultNavigationFactory;

class SecondaryNavigationFactory extends DefaultNavigationFactory
{
    protected function getName()
    {
        return 'secondary';
    }
}

Смотри, я поставил имя secondary здесь, который совпадает с вашей навигационной клавишей.

ТРЕТИЙ ШАГ

Вы должны зарегистрировать эту фабрику у менеджера сервиса. Тогда фабрика может сделать свою работу и превратить файл конфигурации в Zend\Navigation объект. Вы можете сделать это в вашем module.config.php:

'service_manager' => array(
    'factories' => array(
        'secondary_navigation' => 'MyModule\Navigation\Service\SecondaryNavigationFactory'
    ),
)

Видишь, я сделал услугу secondary_navigation здесь, где фабрика вернет Zend\Navigation экземпляр тогда. Если вы делаете сейчас $sm->get('secondary_navigation') вы увидите, что это Zend\Navigation\Navigation объект.

ШАГ ЧЕТВЕРТЫЙ

Скажите помощнику вида использовать эту навигацию, а не по умолчанию. Помощник вида навигации принимает параметр "навигация", в котором вы можете указать, какую навигацию вы хотите. В этом случае у менеджера сервиса есть сервис secondary_navigation и это то, что нам нужно.

<?= $this->navigation('secondary_navigation')->menu() ?>

Теперь у вас будет навигация secondary используется в этом представлении помощник.

Другие вопросы по тегам