zend framework多模塊多Layout配置

 原文出處:http://blog.csdn.net/a82168506/article/details/10228011


上次接觸zend framework已經很久遠了,10年的事情了。最近在做一個項目,時間不緊,就又把ZF拿出來折騰。而我發現以前做ZF的記憶已經在我腦中如夢幻泡影,消失無蹤,爲了配置多模塊還又去查了資料,爲了避免此種情況再次發生,做個記錄吧。

        首先,我們要新建一個ZF項目,目錄結構如下。

     

       我們想要配置多模塊呢,首先要在,application下面建一個modules文件夾,然後創建模塊文件夾,這裏我以default和admin舉例。default爲前臺,admin爲後臺,符合最基礎的網站所需了。在modules下面新建default以及admin文件夾,然後分別把controllers,models以及views剪切到這兩個文件夾內。此時,文件目錄如下所示。並且將Bootstrap.php文件分別複製到兩個目錄裏。

      

          首先,我們去修改application.ini文件。刪除以下這行。       

  1. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"  
         然後添加以下內容。
  1. resources.frontController.controllerDirectory.default =APPLICATION_PATH "/modules/default/controllers"  
  2. resources.frontController.controllerDirectory.admin =APPLICATION_PATH "/modules/admin/controllers"  
  3. resources.FrontController.moduleDirectory =APPLICATION_PATH "/modules"  
  4. resources.FrontController.moduleControllerDirectoryName ="controllers"  
  5. resources.FrontController.defaultModule= "default"  
  6. resources.modules[] = ""  
       這裏我們看到,我們設置了default模塊爲默認模塊。也就是說default模塊裏面的controller和model的類名都不需要另外處理,而其它模塊裏面的controller及model的類名都需要加模塊前綴哦,這裏後面會詳細講到。

       然後我們去修改application/Bootstrap.php文件爲以下內容。

      

  1. <?php  
  2.   
  3. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap  
  4. {  
  5.     protected function _initAppAutoload() {  
  6.         $autoloader = new Zend_Application_Module_Autoloader(array(  
  7.                 'namespace' => 'App',  
  8.                 'basePath'  => dirname(__FILE__),  
  9.         ));  
  10.         return $autoloader;  
  11.     }  
  12.   
  13. }  
      到這裏還沒有結束,我們需要去修改對應的模塊裏面的Bootstrap.php文件的內容。

      先修改application/modules/default/Bootstrap.php,修改爲以下內容:

  1. <?php  
  2.   
  3. class Default_Bootstrap extends Zend_Application_Module_Bootstrap {  
  4.       
  5.     protected function _initAutoload() {    
  6.         $autoloader = new Zend_Application_Module_Autoloader(array(    
  7.                 'namespace' => '',    
  8.                 'basePath' => APPLICATION_PATH . '/modules/default'));    
  9.         return $autoloader;    
  10.     }   
  11. }  
      然後再修改爲 application/modules/admin/Bootstrap.php,修改爲以下內容:
  1. <?php  
  2.   
  3. class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {  
  4.       
  5.     protected function _initAutoload() {    
  6.         $autoloader = new Zend_Application_Module_Autoloader(array(    
  7.                 'namespace' => '',    
  8.                 'basePath' => APPLICATION_PATH . '/modules/admin'));    
  9.         return $autoloader;    
  10.     }   
  11.   
  12. }  
      以上的修改要注意兩點,第一,注意類名需要加模塊前綴,第二,注意模塊裏面的文件名繼承的是Zend_Application_Module_Bootstrap而不是Zend_Application_Bootstrap_Bootstrap。如果繼承文件錯誤的話,會報錯:Maximum function nesting level of '100' reached, aborting!

      我們再進行最後一步,就可以進行多模塊的訪問了。因爲default是默認模塊,所以我們不需要去修改,我們要去修改的是admin模塊裏面的內容。

     打開admin模塊裏面的IndexController.php文件,修改類名爲:

  1. class Admin_IndexController extends Zend_Controller_Action  
  2. {  
  3. }  
      此時我們可以測試一下,我們訪問http://localhost/project/public則訪問的是default模塊的首頁,當訪問http://localhost/project/public/admin時訪問的是後臺首頁。

     


       我們說完了多模塊配置的contoller訪問之後,再來提一下model的訪問。

       首先我們去修改配置文件,application.ini。在production中添加如下內容。

  1. db.adapter = PDO_MYSQL  
  2. db.params.host = localhost  
  3. db.params.dbname = voice_sms  
  4. db.params.username = root  
  5. db.params.password = 123456  
  6. db.params.charset = UTF8  
        然後我們去連接數據庫,在application/Bootstrap.php裏面添加這個方法
  1. protected function _initDatabase() {  
  2.     $options = $this->getApplication()->getOptions();  
  3.     $db = Zend_Db::factory( $options'db' ][ 'adapter' ], $options'db' ][ 'params' ] );  
  4.     Zend_Db_Table_Abstract::setDefaultAdapter( $db );  
  5.     Zend_Registry::set( 'DB'$db );  
  6.     return $db;  
  7. }  
       先說default模塊。

       在application/default/models裏面添加一個model文件,SmsInformation.php,此文件的內容爲:

  1. class Model_SmsInformation  
  2. {  
  3.     private $_tableName;  
  4.     private $_connect;  
  5.       
  6.     /** 
  7.      * construct function 
  8.      */  
  9.     public function __construct() {  
  10.         $this->_tableName = 'smsinformation';  
  11.         $this->_connect= Zend_Registry::get( 'DB' );  
  12.     }  
  13. }  
     我們在在application/default/controller/IndexController.php中用以下語句則可實例化此model  
  1. $smsInformationModel = new Model_SmsInformation();  
      然後說admin模塊。

     在application/admin/models裏面添加一個model文件,SmsInformation.php,此文件的內容爲:

  1. class Admin_Model_SmsInformation  
  2. {  
  3.     private $_tableName;  
  4.     private $_connect;  
  5.       
  6.     /** 
  7.      * construct function 
  8.      */  
  9.     public function __construct() {  
  10.         $this->_tableName = 'smsinformation';  
  11.         $this->_connect= Zend_Registry::get( 'DB' );  
  12.     }  
  13. }  
       請注意,類名有模塊前綴哦。

      我們在在application/admin/controller/IndexController.php中用以下語句則可實例化此model  

  1. $smsInformationModel = new Admin_Model_SmsInformation();  

     
       最後還有layout配置,在兩個模塊下面分別新建layouts/scripts文件夾,裏面放入默認佈局文件layout.phtml。

       目錄結構如下:

      

       layout.phtml的文件內容爲:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3.     <?php $baseUrl = $this->baseUrl();?>  
  4.     <head>  
  5.         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  6.         <?php   
  7.             echo $this->headTitle();  
  8.             $this->headLink()->appendStylesheet($baseUrl . "/css/admin.css");  
  9.             echo $this->headLink();  
  10.             $this->headScript()->appendFile($baseUrl . "/js/jquery-2.0.2.min.js");  
  11.             echo $this->headScript();  
  12.         ?>  
  13.     </head>  
  14.     <body>      
  15.         <div class="container">  
  16.             <?php echo $this->layout()->content; ?>  
  17.         </div>  
  18.     </body>  
  19. </html>  

       將application.ini中加入兩句話:
  1. default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts/scripts/"  
  2. admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts/"  

      然後去修改application/Bootstrap.php文件。

      在Bootstrap類中添加一個方法

  1. /** 
  2.  * about multi-layout configuration 
  3.  */  
  4. protected function _initLayoutHelper()  
  5. {  
  6.     $this->bootstrap('frontController');  
  7.     $layout= Zend_Controller_Action_HelperBroker::addHelper(  
  8.             new Rockux_Controller_Action_Helper_LayoutLoader());  
  9. }  

      在此文件中再添加一個類
  1. /** 
  2.  * Layout 
  3.  *  
  4.  * @package   Applicaiton 
  5.  * @author    Qiao Chen <[email protected]> 
  6.  * @version   $$Id: Bootstrap.php  2013-9-22 
  7.  */  
  8. class Rockux_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract  
  9. {  
  10.       
  11.     public function preDispatch(){  
  12.         $bootstrap=$this->getActionController()->getInvokeArg('bootstrap');  
  13.         $config=$bootstrap->getOptions();  
  14.         $module=$this->getRequest()->getModuleName();  
  15.         if(isset($config[$module]['resources']['layout']['layoutPath'])){  
  16.             $layoutPath=$config[$module]['resources']['layout']['layoutPath'];  
  17.             $this->getActionController()->getHelper('layout')->setLayoutPath($layoutPath);  
  18.         }  
  19.     }  
  20.   
  21. }  

      對應的模塊會去找到對應的layout。

      再說幾個layout的常見用法。

      如果不使用layout,可用以下語句。

  1. $this->_helper->layout()->disableLayout();  
      如果使用此模塊中其它layout,可用以下語句。
  1. $this->_helper->layout()->setLayout("loginlayout");  

      到這裏就一切OK了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章