2012-01-31 51 views
0

我必須在Boostrap中創建引導佈局資源並註冊一些視圖助手的方法。在引導佈局資源之後將變量傳遞給佈局

protected function _initViewHelpers() { 
    $this->bootstrap('layout'); 
    $layout = $this->getResource('layout'); 
    $view = $layout->getView(); 

    $view->registerHelper(new Application_View_Helper_LoadMenu, 'loadMenu'); 
    $view->registerHelper(new Application_View_Helper_InfoLink, 'infoLink'); 
    $view->registerHelper(new Application_View_Helper_InfoData, 'infoData'); 
} 

現在,我通過一些變量來佈局(以Zend_View的實例,一如既往),但佈局不承認它有他們。

當我將註冊助手的代碼移動到控制器中的init()方法時,一切正常。是ZF錯誤還是我做錯了?

回答

0

在你的控制器(或你有視圖)

$view->layout()->some_var = "Some Value"; 

在佈局

<?php echo $this->layout()->some_var; ?> 

如果我失去了你的問題的一些部分讓我知道。

編輯:失敗上述,其他正確的方法是使用佔位符助手(http://framework.zend.com/manual/en/zend.view.helpers.html#zend.view .helpers.initial.placeholder)

編輯2:確保你是bootstrapping視圖。

$this->bootstrap('view'); 
$view = $this->getResource('view'); 
0

您的視圖助手是否直接或者作爲Zend_View_Helper_Abstract的子類實現了setView()方法?

如果您查看Zend_View_Abstract::registerHelper($helper, $name)方法的代碼,您將看到它檢查助手上是否存在setView()方法。如果找到這樣的方法,則它調用$helper->setView($this),其中$this$view

這是連接發生的地方。在沒有這個調用的情況下,雖然視圖會意識到幫助者(畢竟,您只是註冊了它),但幫助者不會意識到該視圖。如果幫助器試圖訪問視圖,它最終會創建一個新的視圖對象,這不是您在Bootstrap中配置的視圖對象。

tl; dr:可能不需要顯式註冊助手。使用默認的資源自動加載器和您似乎正在使用的類/方法命名約定,您可以允許內置的插件加載器來處理所有的實例。只需在您的佈局或視圖腳本中調用$this->myHelperMethod(),並且所有應該都很酷。