Вопрос по config, navigation, zend-framework2 – Как настроить 2 навигации в zf2?

11

У меня есть конфиг для основной навигацииссылка на сайт а второй только с 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

Сообщение об ошибке отображается наstackoverflow.com/questions/12781623/... но на этот вопрос нет общепринятого ответа activout.se

Ваш Ответ

1   ответ
43

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

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

Это происходит на страницах MVCZend\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 используется в этом представлении помощник.

Прекрасно работает даже с ACLI ' Garry
Я хотел бы дать вам 100 голосов! Stephan Weinhold
Что вы имели в виду, говоря "Вы должны ввести маршрутизатор на каждой странице навигации " ? Где мне нужно написать этот код? iit2011081

Похожие вопросы