2012-10-08 53 views
4

在我的控制,我創建了導航對象,並把它傳遞給視圖Zend框架2:導航

$navigation = new \Zend\Navigation\Navigation(array(
    array(
      'label' => 'Album', 
      'controller' => 'album', 
      'action' => 'index', 
      'route' => 'album', 
     ), 
    )); 

有嘗試使用它

<?php echo $this->navigation($this->navigation)->menu() ?> 

並且得到錯誤:

Fatal error: Zend\Navigation\Exception\DomainException: Zend\Navigation\Page\Mvc::getHref cannot execute as no Zend\Mvc\Router\RouteStackInterface instance is composed in Zend\View\Helper\Navigation\AbstractHelper.php on line 471

但是我在佈局中使用的導航,所以它寫在這裏:http://adam.lundrigan.ca/2012/07/quick-and-dirty-zf2-zend-navigation/作品。我的錯誤是什麼?

謝謝。

回答

1

btw。如果您定義了route,則不需要定義controlleraction,僅當您的路由是通用路由且控制器/操作是可變段時。

+0

你是對的,感謝您的意見。但如果這樣修復公告頁面錯誤仍然存​​在。 '$導航=新\ Zend的\導航\導航(陣列( \t \t \t陣列( \t \t \t \t '標籤'> '相冊', \t:當代碼運行,當它看起來那麼唯一的選擇\t \t \t 'URI'=> '/' \t \t \t) \t \t));'當URL被直接設置。 – Eremite

+0

hm不知道,但你有這在你的module.php? '$ application = $ e-> getApplication(); $ eventManager = $ application-> getEventManager(); $ moduleRouteListener = new ModuleRouteListener(); $ moduleRouteListener-> attach($ eventManager);' –

+0

是的在onBootstrap的方法中的Module.php中我有完全相同的代碼。有趣的是我的視圖中的url視圖助手能夠正常工作。代碼'$ this-> url('album/default',array('controller'=>'album','action'=>'edit','id'=> $ id))''很好,顯示一個鏈接在頁面上。目前尚不清楚是否干擾了菜單的正確顯示。如果有任何想法,我會很高興聽到他們。謝謝。 – Eremite

9

問題是缺少一個路由器(或更準確地說,一個Zend\Mvc\Router\RouteStackInterface)。路由堆棧是路由的集合,可以使用路由名稱將其轉換爲url。基本上,它接受一個路由名稱,併爲您創建一個URL:

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

出現這種情況的Zend\Navigation的MVC頁面內了。該頁面有一個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); 
    } 
    } 
} 

必須注入在導航的每一頁路由器。乏味!因此有一家工廠爲你做這件事。有四個簡單的步驟來做到這一點。

STEP ONE

把導航配置您的模塊配置第一。正如您有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)。

第二步

一家工廠將轉換成一個導航對象結構這一點,你需要首先創建一個類。在MyModule/Navigation/Service目錄下創建一個文件SecondaryNavigationFactory.php

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

披露:這個答案是一樣的,因爲我介紹了這個問題:https://stackoverflow.com/a/12973806/434223

+0

這是一個很好的例子。它的工作原理,直到我想使用部分視圖渲染。我使用這個來做我的主要導航,但這不重要。以下是我正在使用的: echo $ this-> navigation('navigation') - > menu() - > setPartial(array('navigation.phtml','Application'));錯誤:Zend \ ServiceManager \ Exception \ ServiceNotFoundException:Zend \ ServiceManager \ ServiceManager :: get無法在/ myapp/vendor/zendframework/zendframework/library/Zend/View/Helper/Navigation中爲菜單獲取或創建實例/AbstractHelper.php 471行 –

0

的問題確實是一個路由不能沒有路由器來解決。我希望導航類能夠解決這個問題,但顯然你必須自己做。我只寫了一個視圖助手來介紹具有MVC頁面的路由器。

下面是我如何使用它在視圖中:

$navigation = $this->navigation(); 
$navigation->addPage(
    array(
     'route' => 'language', 
     'label' => 'language.list.nav' 
    ) 
); 
$this->registerNavigationRouter($navigation); 
echo $navigation->menu()->render(); 

的視圖助手:

<?php 
namespace JarJar\View\Helper; 

use Zend\View\Helper\AbstractHelper; 
use Zend\View\Helper\Navigation; 
use Zend\ServiceManager\ServiceLocatorAwareInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\Navigation\Page\Mvc; 

class RegisterNavigationRouter extends AbstractHelper implements ServiceLocatorAwareInterface 
{ 
    protected $serviceLocator; 

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) 
    { 
     $this->serviceLocator = $serviceLocator; 
    } 

    public function getServiceLocator() 
    { 
     return $this->serviceLocator; 
    } 

    public function __invoke(Navigation $navigation) 
    { 
     $router = $this->getRouter(); 
     foreach ($navigation->getPages() as $page) { 
      if ($page instanceof Mvc) { 
       $page->setRouter($router); 
      } 
     } 
    } 

    protected function getRouter() 
    { 
     $router = $this->getServiceLocator()->getServiceLocator()->get('router'); 
     return $router; 
    } 
} 

不要忘記添加視圖助手在你的配置爲可調用的實例:

'view_helpers' => array(
    'invokables' => array(
     'registerNavigationRouter' => 'JarJar\View\Helper\RegisterNavigationRouter' 
    ) 
), 

這不是一個很好的解決方案,但它的工作原理。