• 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 <cq279286727@sina.com> 
    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了。

    zend framework多模块多Layout配置

  • 相关阅读:
    试说明一级文件索引结构、二级文件索引结构是如何构造的。
    文件物理结构的比较
    文件的物理结构
    什么是索引文件,要随机存取某一记录时需经过几步操作?
    对文件的存取有哪两种基本方式,各有什么特点?
    文件的逻辑结构有哪两种形式?
    文件组织的两种结构
    WebService或HTTP服务端接收请求转发消息到另一个服务端-实现思路
    Eclipse报Caused by: java.lang.OutOfMemoryError: PermGen space解决思路
    树莓派2操作记录(有记录才能沉淀...)
  • 原文地址:https://www.cnblogs.com/taozi32/p/5561976.html
Copyright © 2020-2023  润新知