2011-12-27 23 views
0

我目前正在使用Zend Framework開發一個基於我的網頁設計結構的項目,我已經達到了必須通過的點從我的佈局從每個控制器/行動少數變量。這些變量是:從Controller/Action傳遞變量到佈局時如何避免重複

<?php Zend_Layout::getMvcInstance()->assign('pageId', 'page1'); ?> 
<?php Zend_Layout::getMvcInstance()->assign('headerType', '<header id="index">'); ?> 

正在顯示的原因通過這個信息首先,我通過頁面ID作爲多列布局可以根據內容發生變化,從而在body標籤中的頁ID鏈接適當的CSS顯示頁面的方式。其次,我只在索引頁面上顯示一個促銷jQuery滑塊,但我需要靈活性將其顯示在多個頁面上,以防風向變化和客戶改變主意。

我的實際問題:有沒有更適當的方法將這些信息傳遞給我忽略的佈局?

我並不是真的質疑信息是否需要發送,而是我有一些Zend Framework特性,在我的匆忙中忽略了這會減少重複冗餘代碼的數量,這些代碼很可能會重複同一控制器中有多個動作?

回答

1

您可以將該邏輯轉換爲動作助手,而不是以更直接的方式從控制器調用。您也可以讓視圖助手完成相同的事情,但視圖助手通常爲視圖生成數據而不是設置屬性。

// library/PageId.php 
class Lib_PageId extends Zend_Controller_Action_Helper_Abstract 
{ 
    public function direct($title, $pageId, $headerType) 
    { 
     $view = $this->getActionController()->view; 


     $view->headTitle()->append($title); 
     $view->pageId = $pageId; 
     $view->headerType = $headerType; 
    } 
} 

在你的控制器動作,你現在可以這樣做:

$this->_helper->PageId('Homepage', 'page1', 'index'); 
// now pageId and headerType are available in the view and 
// Homepage has been appended to the title 

您還需要註冊的助手路徑在你的引導是這樣的:

protected function _initActionHelpers() 
{ 
    Zend_Controller_Action_HelperBroker::addPrefix('Lib'); 
} 

做它像可以減少重複代碼的數量並刪除需要從視圖中分配值。你可以很快在控制器中完成它。如果助手尚未被調用,您也可以使用默認值。

+0

謝謝德魯,這更多的是我一直在尋找的,很好的答案,謝謝。 – Asciant

1

你不應該把任何事情從視圖傳遞到佈局,一開始視圖應該包含在佈局中,而不是反過來。

因此,設置你的頁面標題應該使用類似的代碼,你有什麼可以做,但控制器動作中被稱爲:

$this->view->headTitle()->append('Homepage'); 

而另外兩個問題 - 你需要重新考慮,因爲我陳述首先。也許你誤解了佈局/視圖原理?如果您爲每個操作包含不同的視圖,那麼只需在需要時更改div ID,並且只將banner的標題包含在index.phtml文件中。

+0

謝謝阿什利,你是對的,我應該從Controller/Action而不是視圖本身傳遞這些信息。儘管標題出現在layout.phtml中的<?php echo $ this-> layout() - > content?>聲明之前,因此我只能想到將這些信息通過一個變量傳遞給佈局。除非有更好的方法?然後我使用 - if($ this-> layout() - > headerType =='

'){echo $ this-> partial('index/_promotions.phtml'); }在佈局中顯示部分。在這裏粘貼代碼的道歉。 – Asciant

+0

爲了避免這種混淆,我更新了問題,並將我的代碼移到了討論的控制器/操作中,欣賞Ashley提示。乾杯。 – Asciant