2011-08-23 82 views
1

我想在我的佈局中創建一個具有佔位符行爲的側欄。我希望能夠爲每個控制器定義一次佔位符的內容。因此,每個控制器都可以將自定義內容添加到側欄,而無需在任何視圖中定義它。Zend佈局佔位符?

我有點困惑於如何去與Zend_Layout。任何幫助?

+0

我知道你可以這樣做:$ this-> layout() - > sidebar將內容注入佈局,但是我想讓每個控制器的每個視圖的內容都相同。 –

回答

0

如何爲每個控制器添加postDispatch()呼叫?

public function postDispatch() 
{ 
    // code to populate/activate your placeholder 
    $this->view->placeholder('xxx'); 
} 

該功能將在您的操作完成後調用。欲瞭解更多信息,請參閱Pre- and Post-Dispatch Hooks

1

我試過類似的東西。這是你可以做的。

將這種類型的代碼放在layout.phtml腳本文件中。某處靠近頂部。你不必這樣,只要你知道你正在使用什麼佔位符。在佈局中這樣做也是一個好主意,因爲你可以將html div封裝在這裏,而不用擔心它在視圖中。觀點可能只是擔心內容。在此之後,您可以從控制器和視圖向佔位符中添加內容。

 
$this->placeholder('blah'); 
$this->placeholder('sidebar'); 
$this->placeholder('blunk'); 

如果你不想在你的佈局來創建它們,那麼你就可以做到這一點的,像這樣的控制器,

 
$this->view->placeholder('sidebar'); 

現在,您可以將內容放入控制器或視圖腳本中。儘管在視圖中添加內容是一個更好的主意。

在佈局然後你可以只回聲佔位符,像這樣

echo $this->placeholder->('sidebar');

前的佈局執行這樣的觀點產生的任何佔位符將提供給佈局打印所有的意見都執行出。

此外,控制器不具有佔位符。只有視圖和擴展布局纔有像這樣的佔位符,因此您必須在某個位置聲明它們。即使你在控制器中聲明它們,它們仍然屬於視圖對象。

我不知道這是否有所幫助,但祝你好運。告訴我你的想法。

+0

嗯...我希望有一種方法來標記模板。 .net MVC有辦法做到這一點,但我忘了它叫什麼。我想我可以把標記放在佈局中,並讓它決定從通過佔位符傳遞的內容顯示哪個版本。 –

+0

我不認爲我很理解你的意思。你想在標記中模擬標記輸出嗎?我認爲.NET中可能會有一些MVC魔術,但在PHP中,您必須自己做更多的工作。 如果每個控制器都顯示相同的側邊欄,那麼只需將$this->placeholder('name')->append($this->view->render('scriptfile.phtml'))置入控制器的init方法即可。 –

+0

它們被稱爲.net中的編輯器模板。 –

0

我剛剛實施了一個解決方案,這應該適用於大多數用途。

我存儲所有我placeholder.phtml文件在以下目錄: /視圖/腳本/ _placeholder

在我創建的每個控制器/動作,有一個佔位符目錄中的佔位符(以及ROOT的東西)。然後,我爲每個佔位符創建一個文件。

例如佔位符=側邊欄。控制器=用戶/行動=觀點

對於以上我們將在這裏保存文件:

的意見/腳本/ _placeholder /用戶/視圖/工具條。phtml

注意:在sidebar.phtml中,您需要添加:$ this-> placeholder(「sidebar」) - > captureStart()和captureEnd();

如果插件看到這個文件,它會渲染它。如果它沒有找到一個,那麼它不會。

此外,該插件也將尋找以下拉,在第一:

的意見/腳本/ _placeholder/sidebar.phtml

,如果你想我可以張貼的插件。

我唯一的問題是我想現在知道一個佔位符中是否有任何數據。這樣我就可以創建一些巧妙的佈局,並呈現出需要的東西。有誰知道如何做到這一點?