模块是一个独立的单元,包含视图、控制器和其它组件,它和一个应用的区别是不能单独部署。
首先,模块目录放在你的应用的modules目录中,我们可以使用yii自带的gii生成器来创建基本的结构,开启gii的方法是修改你的应用config/main.php文件中如下内容
'modules'=>array( 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'你的密码访问时需要输入', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), ),
下面通过 你的应用/index.php?r=gii 访问gii,打开以后选择,左边菜单的Module Generator选项。你将会看到下面的画面
在Module ID 输入模块的名称,我这里输入admin,然后点击Preview按钮。如下图所示,它向你展示了所有将会被生成的文件,允许你在新建之前预览他们 :
然后点击Generate按钮,来生成所有文件。因为Web服务器进程需要写入权限,所以确保你的/protected文件夹对于该应用程序是可写入的。
我们对主配置文件 : protected/config/main.php进行配置,如下的代码需要被修改,添加了'admin', :
'modules'=>array(
'gii'=>array(
'class'=>'system.gii.GiiModule',
'password'=>'你的密码',
),
'admin',
),
保存上面的修改后后,我们的新admin模块已经可以使用了。我们可以先通过以下地址访问一下index.php?r=admin/default/index
我们访问index.php?r=admin/default/index会发现,模块使用了你的应用下的/protected/views/layouts/main.php文件,而我们可能希望使用/protected/modules/admin/views/layouts/main.php文件,让admin模块拥有独立的布局视图。
我们在protected\modules\admin\controllers\DefaultController.php添加如下代码,
public $layout='application.modules.admin.views.layouts.main';
我们把从/protected/views/layouts/main.php 拷贝到/protected/modules/admin/views/layouts/,稍作修改,这样模块就拥有了独立的布局视图.
添加新的模块时,一般会包含图像文件,CSS文件,JavaScript文件等。
模块可以直接从网站主目录中引用。但是如果想要创建一个模块能够在任何地方引用,并且能够避免命名冲突,就要用到assets了。
过程是(这里模块名是admin):
1、把需要用到的资源放在modules/admin/assets下。
2、然后通过 CAssetManager,Yii::app()->assetManager能够自动的将私有资源publish到公共目录下 网站目录/assets
3、Yii会自动在网站目录的/assets下创建一个随机不冲突的文件夹,如2b31b42b,并把你的modules/admin/assets目录下的文件拷贝过去。
例如我的模块是Admin,文件路径通过如下代码获得,修改protected\modules\admin\AdminModule.php文件,
class AdminModule extends CWebModule
{
/*开始*/
private$_assetsUrl;
publicfunction getAssetsUrl()
{
if($this->_assetsUrl===null)
$this->_assetsUrl=Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.modules.admin.assets'));
return$this->_assetsUrl;
}
publicfunction setAssetsUrl($value)
{
$this->_assetsUrl=$value;
}
/*结束*/
}
然后,在/protected/modules/admin/views/layouts/main.php中
使用$this->module->assetsUrl就可以调用你的css等文件了。
代码如下,
<link rel="stylesheet" type="text/css" href="<?php echo $this->module->assetsUrl; ?>/css/screen.css" media="screen, projection" />
4,通过如上操作,该模块只要把admin目录拷贝,就可以多次复用了。