2012-04-21 123 views
1

我建立在Zend Framework的一個新的CMS和我沒有太多的接觸ZF。客戶端需要兩個部分,分別稱爲Admin和FE。所以,我的結構如下我的應用程序結構。如何自動加載Zend Framework模塊模型?

 
- SITE 
-- application 
---- configs 
---- layouts 
---- modules 
-------- default 
------------ controllers 
------------ forms 
------------ models 
------------ views 
------------ Bootstrap.php 
-------- admin 
------------ controllers 
------------ forms 
------------ models 
------------ views 
------------ Bootstrap.php 
---- Bootstrap.php 
-- public 
-- library 
-- index.php 

我的結構工作正常,當我訪問的網站,如http://sitehttp://site/admin佈局和控制器加載。

我的問題是 1)我會怎樣自動加載我的模型模塊。在模型特定的引導文件中我添加了下面的代碼。但它不起作用。

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap 
{ 
    protected function _initAutoload() 
    { 
     $autoloader = new Zend_Application_Module_Autoloader(array(
      'basePath' => APPLICATION_PATH.'/modules/admin/', 
      'namespace' => '', 
      'resourceTypes' => array(
       'form' => array(
        'path' => 'forms/', 
        'namespace' => 'Form_', 
       ), 
       'model' => array(
        'path' => 'models/', 
        'namespace' => 'CPModel_' 
       ) 
      ), 
     )); 
     return $autoloader; 
    } 
} 

2.)我將如何爲不同的模塊使用不同的佈局?

回答

3

兩個問題在這裏:

  1. 自動加載模型
  2. 模塊,具體佈局

對於自動加載模式,首先確保你的模塊自舉類擴展Zend_Application_Module_Bootstrap。這將註冊包括映射,使名爲Admin_Model_User一個模型類可以存儲在文件application/modules/admin/models/User.php在資源自動加載(注意是複數模式* 小號 *路徑名)。對於上面描述的用法,似乎並不需要自己定義任何此類映射。

有關聯的默認模塊trickiness的位。 IIRC,默認模塊使用應用程序名稱空間,通常默認爲Application_。因此,例如,默認模塊中的用戶模型將被命名爲Application_Model_User並存儲在文件application/modules/default/models/User.php中。 [如果不工作,然後嘗試命名Default_Model_User]

[但是,如果你真的堅持了您的管理模塊和CPModel爲您的機型前綴的空appnamespace - 爲您的例子說明 - 然後一些這變化]

其結果是,因爲大多數這些文件夾不在include_path中,系統需要在某些時候類的前綴聯想到什麼/圖什麼目錄被告知。

對於特定於模塊的佈局,通常創建一個front-controller plugin實現該preDispatch()鉤。如果你把你的佈局在頂層的application/layouts/scripts/,那麼你的插件可以看起來像下面存儲在application/plugins/Layout.php

class Application_Plugin_Layout extends Zend_Controller_Plugin_Abstract 
{ 

    public function preDispatch(Zend_Controller_Request_Abstract $request) 
    { 
     Zend_Layout::getMvcInstance()->setLayout($request->getModuleName()); 
    } 
} 

註冊您的插件在您的應用程序級Bootstrap,無論是通過applications/config/application.ini

resources.frontController.plugin.layout = "Application_Plugin_Layout" 

或應用級Bootstrapapplication/Bootstrap.php

protected function _initPlugins() 
{ 
    $this->bootstrap('frontController'); 
    $front = $this->getResource('frontController'); 
    $front->registerPlugin(new Application_Plugin_Layout()); 
} 

然後,例如,您的管理佈局可以存儲在application/layouts/scripts/admin.phtml中。

+0

Weinaub - 要創建「plugins.Layout。php「文件,或者在」application/plugins「目錄下創建」Layout.php「文件 – Saurabh 2012-04-22 09:23:06

+0

@Saurabh:感謝您的錯誤;-)修復了在application/plugins目錄中名爲'Application_Plugin_Layout'的類。插件/ Layout.php'(注意路徑中的複數插件** s) – 2012-04-22 09:25:19

+0

我也認爲在zf 1.11中不允許註冊來自application.ini的插件,我們必須從「layout.phtml」重命名佈局文件到「default.phtml」工作..請確認.. – Saurabh 2012-04-22 09:43:12