zend framework多模块多Layout配置

        上次接触zend framework已经很久远了,10年的事情了。最近在做一个项目,时间不紧,就又把ZF拿出来折腾。而我发现以前做ZF的记忆已经在我脑中如梦幻泡影,消失无踪,为了配置多模块还又去查了资料,为了避免此种情况再次发生,做个记录吧。

        首先,我们要新建一个ZF项目,目录结构如下。

     

       我们想要配置多模块呢,首先要在,application下面建一个modules文件夹,然后创建模块文件夹,这里我以default和admin举例。default为前台,admin为后台,符合最基础的网站所需了。在modules下面新建default以及admin文件夹,然后分别把controllers,models以及views剪切到这两个文件夹内。此时,文件目录如下所示。并且将Bootstrap.php文件分别复制到两个目录里。

      

          首先,我们去修改application.ini文件。删除以下这行。       

resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
         然后添加以下内容。

resources.frontController.controllerDirectory.default =APPLICATION_PATH "/modules/default/controllers"
resources.frontController.controllerDirectory.admin =APPLICATION_PATH "/modules/admin/controllers"
resources.FrontController.moduleDirectory =APPLICATION_PATH "/modules"
resources.FrontController.moduleControllerDirectoryName ="controllers"
resources.FrontController.defaultModule= "default"
resources.modules[] = ""
       这里我们看到,我们设置了default模块为默认模块。也就是说default模块里面的controller和model的类名都不需要另外处理,而其它模块里面的controller及model的类名都需要加模块前缀哦,这里后面会详细讲到。

       然后我们去修改application/Bootstrap.php文件为以下内容。

      

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
	protected function _initAppAutoload() {
		$autoloader = new Zend_Application_Module_Autoloader(array(
				'namespace' => 'App',
				'basePath'  => dirname(__FILE__),
		));
		return $autoloader;
	}

}
      到这里还没有结束,我们需要去修改对应的模块里面的Bootstrap.php文件的内容。

      先修改application/modules/default/Bootstrap.php,修改为以下内容:

<?php

class Default_Bootstrap extends Zend_Application_Module_Bootstrap {
	
    protected function _initAutoload() {  
	    $autoloader = new Zend_Application_Module_Autoloader(array(  
	            'namespace' => '',  
	            'basePath' => APPLICATION_PATH . '/modules/default'));  
	    return $autoloader;  
    } 
}
      然后再修改为 application/modules/admin/Bootstrap.php,修改为以下内容:

<?php

class Admin_Bootstrap extends Zend_Application_Module_Bootstrap {
	
    protected function _initAutoload() {  
	    $autoloader = new Zend_Application_Module_Autoloader(array(  
	            'namespace' => '',  
	            'basePath' => APPLICATION_PATH . '/modules/admin'));  
	    return $autoloader;  
    } 

}
      以上的修改要注意两点,第一,注意类名需要加模块前缀,第二,注意模块里面的文件名继承的是Zend_Application_Module_Bootstrap而不是Zend_Application_Bootstrap_Bootstrap。如果继承文件错误的话,会报错:Maximum function nesting level of '100' reached, aborting!

      我们再进行最后一步,就可以进行多模块的访问了。因为default是默认模块,所以我们不需要去修改,我们要去修改的是admin模块里面的内容。

     打开admin模块里面的IndexController.php文件,修改类名为:

class Admin_IndexController extends Zend_Controller_Action
{
}
      此时我们可以测试一下,我们访问http://localhost/project/public则访问的是default模块的首页,当访问http://localhost/project/public/admin时访问的是后台首页。

     


       我们说完了多模块配置的contoller访问之后,再来提一下model的访问。

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

db.adapter = PDO_MYSQL
db.params.host = localhost
db.params.dbname = voice_sms
db.params.username = root
db.params.password = 123456
db.params.charset = UTF8
        然后我们去连接数据库,在application/Bootstrap.php里面添加这个方法

	protected function _initDatabase() {
		$options = $this->getApplication()->getOptions();
		$db = Zend_Db::factory( $options[ 'db' ][ 'adapter' ], $options[ 'db' ][ 'params' ] );
		Zend_Db_Table_Abstract::setDefaultAdapter( $db );
		Zend_Registry::set( 'DB', $db );
		return $db;
	}
       先说default模块。

       在application/default/models里面添加一个model文件,SmsInformation.php,此文件的内容为:

class Model_SmsInformation
{
	private $_tableName;
	private $_connect;
	
	/**
	 * construct function
	 */
	public function __construct() {
		$this->_tableName = 'smsinformation';
		$this->_connect= Zend_Registry::get( 'DB' );
	}
}
     我们在在application/default/controller/IndexController.php中用以下语句则可实例化此model  
$smsInformationModel = new Model_SmsInformation();
      然后说admin模块。

     在application/admin/models里面添加一个model文件,SmsInformation.php,此文件的内容为:

class Admin_Model_SmsInformation
{
	private $_tableName;
	private $_connect;
	
	/**
	 * construct function
	 */
	public function __construct() {
		$this->_tableName = 'smsinformation';
		$this->_connect= Zend_Registry::get( 'DB' );
	}
}
       请注意,类名有模块前缀哦。

      我们在在application/admin/controller/IndexController.php中用以下语句则可实例化此model  

$smsInformationModel = new Admin_Model_SmsInformation();

     
       最后还有layout配置,在两个模块下面分别新建layouts/scripts文件夹,里面放入默认布局文件layout.phtml。

       目录结构如下:

      

       layout.phtml的文件内容为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
	<?php $baseUrl = $this->baseUrl();?>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
		<?php 
			echo $this->headTitle();
			$this->headLink()->appendStylesheet($baseUrl . "/css/admin.css");
	      	echo $this->headLink();
	      	$this->headScript()->appendFile($baseUrl . "/js/jquery-2.0.2.min.js");
	      	echo $this->headScript();
     	?>
	</head>
	<body>	
		<div class="container">
			<?php echo $this->layout()->content; ?>
		</div>
	</body>
</html>

       将application.ini中加入两句话:

default.resources.layout.layoutPath = APPLICATION_PATH "/modules/default/layouts/scripts/"
admin.resources.layout.layoutPath = APPLICATION_PATH "/modules/admin/layouts/scripts/"

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

      在Bootstrap类中添加一个方法

	/**
	 * about multi-layout configuration
	 */
	protected function _initLayoutHelper()
	{
		$this->bootstrap('frontController');
		$layout= Zend_Controller_Action_HelperBroker::addHelper(
				new Rockux_Controller_Action_Helper_LayoutLoader());
	}

      在此文件中再添加一个类

/**
 * Layout
 * 
 * @package   Applicaiton
 * @author    Qiao Chen <cq279286727@sina.com>
 * @version   $$Id: Bootstrap.php  2013-9-22
 */
class Rockux_Controller_Action_Helper_LayoutLoader extends Zend_Controller_Action_Helper_Abstract
{
	
	public function preDispatch(){
		$bootstrap=$this->getActionController()->getInvokeArg('bootstrap');
		$config=$bootstrap->getOptions();
		$module=$this->getRequest()->getModuleName();
		if(isset($config[$module]['resources']['layout']['layoutPath'])){
			$layoutPath=$config[$module]['resources']['layout']['layoutPath'];
			$this->getActionController()->getHelper('layout')->setLayoutPath($layoutPath);
		}
	}

}

      对应的模块会去找到对应的layout。

      再说几个layout的常见用法。

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

$this->_helper->layout()->disableLayout();
      如果使用此模块中其它layout,可用以下语句。

$this->_helper->layout()->setLayout("loginlayout");

      到这里就一切OK了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值