Подтвердить что ты не робот

Как настроить 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/поставщик/zendframework/zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php в строке 471

4b9b3361

Ответ 1

Проблема заключается в отсутствии Router (или, точнее, a 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);
    }
  }
}

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

ШАГ ОДИН

Сначала введите конфигурацию навигации в конфигурацию вашего модуля. Подобно тому, как вы используете навигацию 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).

STEP TWO​​strong >

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

namespace MyModule\Navigation\Service;

use Zend\Navigation\Service\DefaultNavigationFactory;

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

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

ШАГ ТРЕХ

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

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

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

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

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

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

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