Come impostare 2 navigazioni in zf2?

Ho una configurazione per il link di navigazione principale e la seconda solo con 1 collegamento . La navigazione principale funziona bene, ma quando provo a configurare una seconda barra di navigazione in un modulo come questo:

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

Ottengo un errore quando lo visualizzo nella vista:

Errore irreversibile: Zend \ Navigation \ Exception \ DomainException: Zend \ Navigation \ Page \ Mvc :: getHref non può essere eseguito poiché nessuna istanza di Zend \ Mvc \ Router \ RouteStackInterface è composta in / home / cawa / www / sp-app / vendor / zendframework /zendframework/library/Zend/View/Helper/Navigation/AbstractHelper.php sulla linea 471

Il problema è un Router mancante (o, per essere più precisi, un Zend\Mvc\Router\RouteStackInterface ). Una pila di percorsi è una raccolta di percorsi e può utilizzare il nome di una rotta per trasformarla in un URL. Fondamentalmente accetta un nome di rotta e crea un url per te:

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

Questo succede anche nelle pagine MVC di Zend\Navigation . La pagina ha un parametro di route e quando è disponibile un router, la pagina assembla il proprio URL (o in termini Zend\Navigation , un href ). Se non si fornisce il router, non è ansible assemblare il percorso e pertanto genera un’eccezione.

È necessario inserire il router in ogni pagina della navigazione:

 $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); } } } 

Come vedi è una funzione ricorsiva, iniettando il router in ogni pagina. Noioso! Quindi c’è una fabbrica che fa questo per te. Ci sono quattro semplici passaggi per farlo accadere.

PRIMO PASSO

Inserire prima la configurazione di navigazione nella configurazione del modulo. Proprio come hai una navigazione default , puoi crearne una seconda secondary .

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

Hai percorsi per la tua prima pagina ( route-1 ) e seconda pagina ( route-2 ).

PASSO DUE

Una fabbrica convertirà questo in una struttura di oggetti di navigazione, è necessario creare una class per quella prima. Creare un file SecondaryNavigationFactory.php nella directory MyModule / Navigation / Service.

 namespace MyModule\Navigation\Service; use Zend\Navigation\Service\DefaultNavigationFactory; class SecondaryNavigationFactory extends DefaultNavigationFactory { protected function getName() { return 'secondary'; } } 

Vedi ho messo il nome secondary qui, che è lo stesso del tuo codice di navigazione.

PASSO TRE

È necessario registrare questa fabbrica al gestore del servizio. Quindi la fabbrica può fare il suo lavoro e trasformare il file di configurazione in un object Zend\Navigation . Puoi farlo nel tuo module.config.php:

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

Vedi Ho creato un servizio secondary_navigation qui, dove la factory restituirà un’istanza Zend\Navigation . Se ora $sm->get('secondary_navigation') vedrai che è un object Zend\Navigation\Navigation .

PASSO QUATTRO

Dì al helper della vista di usare questa navigazione e non quella di default. L’helper della vista di navigazione accetta un parametro di “navigazione” in cui puoi indicare quale navigazione desideri. In questo caso, il gestore del servizio ha un servizio secondary_navigation e questo è quello di cui abbiamo bisogno.

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

Ora avremo il secondary navigazione usato in questo helper vista.