2012-04-08 70 views
4

我使用的模板有兩個不同的導航菜單。Zend Framework - 定義導航菜單的正確方法

  1. 主導航菜單。 (固定)

  2. 操作的導航菜單,包含元素如背部,保存,刪除等 此導航元素改變根據被稱爲控制器。雖然它可能存在一些控制器和一些它不

我正在利用佈局,和我已經把所有的模板代碼在我default.phtml佈局文件。我面對的問題是動作導航菜單。由於這個菜單的html代碼駐留在default.phtml我需要根據被調用的控制器來更改它的內容。

我不知道這是否是正確的做法。但在我的default.phtml我檢查控制器的名稱,並相應地顯示菜單。這是我正在使用的代碼。

<?php if(Zend_Controller_Front::getInstance()->getRequest()->getControllerName() == 'item'): ?> 
    <!-- Action Navigation Menu --> 
    <div class="statsRow"> 
     <div class="wrapper"> 
      <a href="#"><img src="/images/icons/dark/add.png" alt="" class="icon"><span>New item</span></a> 
      <a href="#"><img src="/images/icons/dark/cd.png" alt="" class="icon"><span>Publish/Unpublish item</span></a> 
      <a href="#"><img src="/images/icons/dark/trash.png" alt="" class="icon"><span>Delete item</span></a> 
     </div> 
    </div> 
    <div class="line"></div> 
<?php endif; ?> 

可以這樣做嗎?或者我有更好的方法來做到這一點?

回答

3

看來你行動導航菜單其實的行爲像一個子菜單,每個動作子頁面的一部分。做這樣的事情的一個好方法是有兩個Zend_Navigation實例,例如你可以存儲在註冊表中。然後,在你的控制器,你可以調用一個動作助手preDispatch()方法是這樣的:

// in each controller where you want your "action navigation menu" 
public function preDispatch() 
{ 
    $this->_helper->navigation()->renderActionNavigation(); 
} 

當然,只需要這個操作的導航菜單會有這種方法的控制器。 這個動作助手將基本得到當前視圖對象,創建佔位符和渲染的部分如下:

// in your library/My/Controller/Action/Helper 
class My_Controller_Action_Helper_Navigation extends Zend_Controller_Action_Helper_Abstract 
{ 
    private $_view = null; 

    public function direct() 
    { 
     $this->_view = $view = Zend_Layout::getMvcInstance()->getView(); 
     $this->_view->placeholder('action-navigation'); 
     return $this; 
    } 

    public function renderActionNavigation() 
    { 
     $this->_view->render('partials/_action-navigation.phtml'); 
    } 
} 

如果你不使用庫,只需把這個代碼在/視圖/助理/並將其重命名爲Zend_View_Helper_Navigation

則部分將負責使用佔位符,以使您的子菜單:

// in /view/scripts/partials/_action-navigation.phtml 
<?php $this->placeholder('action-navigation')->captureStart() ?> 
<?php $options = array('onlyActiveBranch' => true); ?> 
<?= $this->navigation()->menu()->renderMenu(Zend_Registry::get('nav.action-navigation'), $options); 
// here I assume that you've stored your Navigation container in the registry ?> 
<?php $this->placeholder('action-navigation')->captureEnd() ?> 

此外,渲染使用navigation view helper method renderMenu()一個選項onlyActiveBranch設置你的菜單true將讓你到只呈現活躍分支,其中每個分支對應您的控制器

最後,在你的佈局你會這樣:

// in your layout file (usually named layout.phtml) 
<?= $this->placeholder('action-navigation'); ?> 

如果您選擇在註冊表中註冊Zend_Navigation容器,這可以在引導做這樣:

// in your bootstrap.php 
protected function _initNavigation() 
{ 
    $config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav'); 
    $container = new Zend_Navigation($config); 
    Zend_Registry::set('nav.action-navigation', $container); 
} 

有關集裝箱的更多信息,請致電refer to this page。另外,如果您對佔位符不熟悉,請撥打here is a good practical example以瞭解如何使用它們。

+0

我是新來的zend框架。而你的解釋似乎對我來說有點過頭。我仍然掌握助手或導航的概念,以及它如何在zend中處理。你能否向我解釋一下代碼中發生了什麼和所有事情。它屬於哪裏 – 2012-04-08 15:48:22

+0

剛剛編輯我的答案,並在每個片段添加評論。從Zend文檔中,[Action Helpers](http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#zend.controller.actionhelper.writingyourown)允許開發人員注入運行時和/將需求功能添加到擴展了'Zend_Controller_Action'的任何Action控制器中。 **動作助手**旨在最大限度地減少擴展抽象動作控制器以注入通用動作控制器功能的必要性。 – Liyali 2012-04-08 17:12:08

+0

我很感謝你的幫助。但是你認爲我可以在不使用Zend_Navigation的情況下實現同樣的效果嗎? Zend_Navigation有什麼困擾我是自定義裝飾器,我仍然無法得到它。如何使用視圖助手出於同樣的目的? – 2012-04-10 14:06:43

1

我想沒關係。我不是做在控制器和包括使用Zend_Navigation導航,那麼你就可以利用ACL等

的如果控制器只設置:

$this->view->navigation()->setContainer($navigation); 

哪裏$navigation是Zend_Navigation的一個實例。然後在您的佈局:

<?=$this->navigation()->menu()?> 
+0

我可以使用zend_navigation來爲我的菜單生成完全相同的語法嗎?請給我一個例子:) – 2012-04-08 15:49:30

+0

請參閱http://stackoverflow.com/questions/1243697/getting-zend-navigation-menu-to-work-with-jquerys-fisheye/1255289#1255289 – Ashley 2012-04-08 18:46:58

+0

問題與你的方法是我需要爲所有控制器和動作定義動作導航。而對於我的應用程序的動作導航存在的一些和一些它不 – 2012-04-10 16:11:01