2009-11-16 71 views
8

我想使用導航助手來使用Acl構建我的導航菜單。 Acl部分我工作得很好。Zend Framework - 多板導航塊

我現在想要能夠顯示幾種不同類型的導航。例如。 admin-nav,side-nav,new-nav等等。我在文檔中找不到任何關於此的信息。只有如何設置導航,然後在佈局或視圖中重複使用該導航對象。

我嘗試了類似的東西 - 有兩個不同的容器,不同的頁面數組,然後在註冊表中設置這些容器。然後從我的觀點和/或佈局呼叫導航和傳遞一個容器內:

<?php echo $this->navigation(Zend_Registry::get("news-nav")) ?> 

以上被稱爲在我的新聞觀,以下稱爲在我的佈局

<?php echo $this->navigation(Zend_Registry::get("admin-nav")) ?> 

這工作正常除了新聞頁面之外,我所有的頁面。在我的新聞頁面上,新聞導航顯示兩次,一次顯示在佈局中,一次顯示在新聞視圖中。管理員導航從不顯示,似乎被新聞導航覆蓋。

我可能會用完全錯誤的方式去解決這個問題,如果有的話請讓我知道更好的方法。如果這種方法看起來不錯,有人可以幫我理清爲什麼新聞導航顯示在佈局和新聞視圖中。

感謝您的時間

傑克

回答

10

我有此相同的問題。我在我的控制器中爲每個我需要的菜單創建了多個Zend_Navigation_Container實例,將它們傳遞給視圖,然後通過將對象直接傳遞給菜單渲染方法來渲染它們。如下:

在控制器:

$this->view->menu1 = new Zend_Navigation_Container(); 
$this->view->menu2 = new Zend_Navigation_Container(); 

在視圖:

$this->navigation()->menu()->renderMenu($this->menu1); 
$this->navigation()->menu()->renderMenu($this->menu2); 

你甚至可以自主的每一個(通過插入方法調用的初始菜單()調用之後:

$this->navigation()->menu()->setUlClass('my_first_menu')->renderMenu($this->menu1); 
$this->navigation()->menu()->setUlClass('my_second_menu')->renderMenu($this->menu2); 
1

或者您可以縮短語法

$this->menu($this->menu1); 
1

我剛碰到這個需要多次導航的問題,並且在這個過程中發現了你的問題,它實際上是一個在Zend_View_Helper_Navigation_HelperAbstract中的錯誤。

516線:

public function __toString() 
{ 
    try { 
     return $this->render(); 
    } catch (Exception $e) { 
     $msg = get_class($e) . ': ' . $e->getMessage(); 
     trigger_error($msg, E_USER_ERROR); 
     return ''; 
    } 
} 

這裏的問題是,如果你不顯式調用$this->navigation->render($container)或類似$this->navigation()->menu($container)一個神奇的方法,然後調用render最終沒有得到傳遞給它的容器。

這又使得爲navigation默認視圖助手,這是menu,要從registry拉出(在這種情況下將使用最後給定容器),或實例化當場(這將導致在那裏沒有容器)。

這是我的簡單修復程序,在__toString上調用getContainer

516線:

public function __toString() 
{ 
    try { 
     return $this->render($this->getContainer()); 
    } catch (Exception $e) { 
     $msg = get_class($e) . ': ' . $e->getMessage(); 
     trigger_error($msg, E_USER_ERROR); 
     return ''; 
    } 
} 

找了所有有關Navigation助手的文件很清楚這樣做的目的是調用getContainer。同樣清楚的是,如果您直接或通過navigation魔術方法致電menu視圖助手,則這不是問題。

一旦你改變了上面的那一行,你應該能夠呼叫$this->navigation($container)並且呈現多個導航而不必求助於直接呼叫menu助手。