用YII assets
1.assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问
1 首先把自己开发模块用到的 css 或者 js 等客户端脚本,放到 modules/自己模块名/assets 目录中
比如:modules/admin/assets
2 在自己的代码中用下面的代码 发布这些 客户端代码到公共 assets 目录
Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.modules.admin.assets'));
这个publish 方法 返回一个绝对路径,指向刚刚发布到外部 assets的目录。
另注意:publish 方法不会重复发布内容。参考 publish方法的$forceCopy=false 参数
3 然后再模块里就可以用 使用$this->module->assetsUrl就可以调用你的css等文件了。
注意:$this->module 是 ccontroller 的属性,代表当前控制器所属的 module。上面例子中就是 admin
这样模块代码中就实现了充分的独立性灵活性,使得代码可以灵活复用。
<?php /** * Admin module class */ class StatisticsModule extends CWebModule { /** * Default admin theme */ public $theme = 'default'; private $_assetsUrl; public function init() { // Yii::app()->theme = 'admin/' . $this->theme; // Set theme url // Yii::app()->themeManager->setBaseUrl( Yii::app()->theme->baseUrl ); // Yii::app()->themeManager->setBasePath( Yii::app()->theme->basePath ); // Set error handler //Yii::app()->errorHandler->errorAction = 'admin/error/error'; /* Make sure we run the master module init function */ // Yii::app()->getAssetManager()->publish($baseJsPath, false, -1, YII_DEBUG); //使用前强制更新asset parent::init(); } public function getAssetsUrl() { if($this->_assetsUrl===null) $this->_assetsUrl=Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.modules.statistics.assets')); return $this->_assetsUrl; } public function setAssetsUrl($value) { $this->_assetsUrl=$value; } }