2010-09-01 27 views
3

我有4個獨立的「塊」的佈局。它們是:如何在Zend_Application中使用多個視圖(使用Zend_Layout)?

  • 具有菜單和麪包屑的導航面板。這是使用Zend_Navigation構造的。
  • 甲邊欄,其中顯示一般的「新聞」默認
  • 甲內容區域中,其中來自每個控制器動作輸出的主將被放置
  • 首標區,它是導航,這通常顯示只是上述一些股票文本和一張照片。

內容區域符合Zend_Application的文檔中指出的傳統單一視圖模型,但其他三個不適用。它們都有合理的默認視圖使用,但是控制器需要能夠在需要時覆蓋它們。例如,管理頁面重寫「newsy」視圖以顯示系統上最近採取的管理操作的日誌是有意義的。

Zend_Layout/Zend_Application的例子,但是,所有承擔單一視圖(他們稱之爲<?php echo $this->layout()->content; ?>

如何才能實現這種佈局的壓倒一切的?我認爲唯一的解決辦法是將存儲覆蓋Zend_View s在Zend_Registry裏面,但是這看起來像是用管道膠帶把東西放在一起;)

回答

4

我相信你指的是所謂的「命名段」。 Zend Framework的響應對象支持這些所謂的「命名片段」,並允許您將正文內容分隔到不同的片段中。

例如採取以下佈局文件:

<div id="nav"> 
    <?php echo $this->layout()->nav ?> 
</div> 
<div id="content"> 
    <?php echo $this->layout()->content ?> 
</div> 

這裏有2個名爲段,是「內容」和「導航」。默認情況下,視圖腳本的輸出將呈現給「內容」細分。爲了使輸出到「導航」部分,你可以做控制器中的以下內容:與動作助手一起使用時

<?php 

$response = $this->getResponse(); 
$response->insert('nav', $view->render('nav.phtml')); 

?> 

此功能變得特別有用。舉例來說,你在一個管理頁面,並且你想覆蓋「導航」部分,那麼你可以確定每個控制器你想渲染到哪個部分。解釋這個問題的最好方法是通過一個代碼示例:

<?php 

class PageController extends Zend_Controller_Action 
{ 
    public function barAction() 
    { 
     // this would render the output of NavController::menuAction() 
     // to the "nav" segment (note how we set the response segment in the 
     // NavController in order to do this) 
     $this->_helper->actionStack('menu', 'nav'); 
    } 
} 

class NavController extends Zend_Controller_Action 
{ 
    public function menuAction() 
    { 
     $this->_helper->viewRenderer->setResponseSegment('nav'); 
     // do stuff 
    } 
} 

?> 
+0

有關操作堆棧的一些說明:http://www.rmauger.co.uk/2009/03/why-the-zend-framework-actionstack-is-evil/。如果有人真的想要去創建頁面塊的路線,我建議看看佔位符助手,但真正的部分更容易,除非你需要複雜性。 – 2010-09-01 18:47:02

+0

我同意你發佈的文章中提出的論點,上面列出的技術並不理想,但他們回答了最初的問題。 – Andries 2010-09-01 19:41:18

+0

+1,因爲這看起來正是我需要做的。一個問題:是否有可能以某種方式設置默認響應(即在Bootstrap中)?只有少數動作控制器確實需要更改默認設置,並且複製所有這些似乎是可恥的。 – 2010-09-01 19:58:26

3

通常你會有一個包含你的標題區域,導航面板,內容區域和邊欄的佈局。內容區域將使用您包含的$ this-> layout() - >內容片段進行加載,其他塊可以在主佈局中調用,也可以通過其包含。諧音。如果用後一種方法去,你的佈局文件可能是這個樣子:

<html> 
<head> 
<title><?=$this->headTitle()?></title> 
</head> 

<body> 

<?=$this->render('_header.phtml')?> 

<?=$this->render('_navigation.phtml')?> 

<?=$this->render('_sidebar.phtml')?> 

<?=$this->layout()->content?> 

</body> 
</html> 

如果你發現你的諧音是包括比HTML更多的PHP代碼,你可能會考慮寫一個幫手來代替。所以,你可以創建沿着這些路線側邊欄幫手:

<?php 
class My_View_Helper_Sidebar extends Zend_view_Helper_Abstract 
{ 
    public function sidebar() 
    { 
     $html = ''; 

     // code to generate side bar here 

     return $html; 
    } 
} 
?> 

,然後,而不是渲染的部分,因爲我上面做了,你會打電話給你的側邊欄幫手:

<?=$this->sidebar()?> 

這是相當容易的控制器重寫佈局,所以你可能會創建一個管理佈局,看起來像我上面的例子,但沒有側邊欄,也許有不同的標題。然後你會讓你的管理員控制器使用它來代替默認值。

我可以想到幾種情況,您需要配置多個Zend_View對象,這暗示着您正在考慮。

+0

+1在這個答案中的努力,但多個佈局的問題是,它迫使我複製佈局中的東西 - 複製/粘貼的代碼是邪惡的;) – 2010-09-01 19:55:40

+1

你需要複製什麼樣的東西?通常情況下,這些東西可以集中在部分內容中,除非渲染部分調用自己,你說的是重複。 – 2010-09-01 19:59:44

+0

我想要在內容中轉儲的東西相對比較複雜 - 所有的定位和我想要抽象到佈局中的那種設置。理想情況下,控制器應該提供的唯一東西是特定於其功能的項目。 – 2010-09-01 20:04:27

相關問題