2009-06-26 52 views
2

我在網站的標題中有一個登錄按鈕。這個頭文件的html被編程到Zend framework views/layouts/home.phtml中。所有控制器的Zend框架公共代碼

我在這個佈局中有一個隱藏窗體,它由jQuery thickbox內聯內容顯示集成觸發。原因,我不想做一個Ajax調用來獲取一個小的登錄表單。

我使用Zend_Form創建表單,問題是我必須在檢查用戶是否登錄之後在所有控制器中執行此操作。我想把這個表單生成放在一個地方,比如在bootstrap中,然後在bootstrap中有一個邏輯表示如果用戶登錄不生成表單。

我不知道引導程序是否是正確的地方,或者我應該在其他地方做。

所以,我應該在哪裏實例的形式,使得其隨處可得,如果用戶沒有登錄。

回答

1

我做了不同的方式,擴展Zend_Controller_Plugin_Abstract實現一個插件並註冊它與前端控制器。

public function routeStartup(Zend_Controller_Request_Abstract $request) { } 

產生的形式上述方法內,並通過設置在$視圖對象的形式。

$視圖可以使用retrived:

$view = Zend_Layout :: getMvcInstance()->getView(); 
2

創建延伸化Zend_Controller_Action然後讓你的控制器擴展了你的基地控制器的你自己的基本控制器。我不知道「jQuery thickbox內聯內容顯示集成」是什麼......但是當你需要運行代碼時,你可以放置幾個部分。的init(),preDispatch()方法,執行postDispatch()等等......只要確保當您擴展掉,你sthing喜歡你的基本控制器:

父::的init() 父:: preDispatch()方法 父:: postDispatch() etc ...在每個部分,以便基本代碼運行以及...

2

要小心普拉迪普·夏爾馬的解決方案(他自己寫的和低於可接受的答案)。

所有下面的代碼代碼是ZF 1.12,而不是ZF 2.0

在引導,Zend_Layout的的MVC實例可能還沒有被創建。您應該使用Zend_Layout::startMvc()代替:

$view = Zend_Layout::startMvc()->getView() ; 

和TBH我更喜歡在preDispatch()方法函數執行此代碼。 ZF的新用戶可能感興趣的:

應用/插件/ HeaderForm.php:

class Application_Plugin_HeaderForm extends Zend_Controller_Plugin_Abstract 
{ 
    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    {  
     $view = Zend_Layout::startMvc()->getView() ; 
     $view->headerForm = new Application_Form_HeaderForm() ; 
    } 
} 

調用默認新Application_Form_HeaderForm()會自動加載到應用/表格/文件夾。您也可以直接在new Zend_Form()addElement()等插件中創建表單,但不能重複使用。

當然,你需要在你的引導程序中註冊這個插件!

應用/ bootstrap.php中:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap 
{ 
    protected function _initPlugin() 
    { 
     $front = Zend_Controller_Front::getInstance() ; 
     $front->registerPlugin(new Application_Plugin_HeaderForm()) ; 
    } 
} 

調用默認新Application_Plugin_HeaderForm()將自動加載到應用/插件/文件夾