Yii1的项目中,积累了大量小部件,为了在Yii2中使用,需要做一些必要的修改。
在Yii1的时候,Assets的管理是通过文件方式,通常的做法是在Wiget文件夹中建立一个assets的文件夹,把js,css, 图像,字体等放到这个文件夹下,然后通过下面的代码发布到web目录下:
$assets = dirname(__FILE__) . ‘/assets‘; $baseUrl = Yii::app()->assetManager->publish($assets); Yii::app()->clientScript->registerScriptFile($baseUrl . ‘/simple.js‘, CClientScript::POS_END); Yii::app()->clientScript->registerCssFile($baseUrl . ‘/simple.css‘);
到了Yii2后,发现没有clientScript组件了,取而代之的是Assetbundle,即资源包的概念。要实现上面几行同样的功能,需要建立资源包类,然后类定义如下:
public $sourcePath = ‘@app/modules/attach/widgets/singleUploader/assets‘; public $js = [ ‘simple.js‘, ]; public $css = [ ‘simple.css‘, ]; public $depends = [ ‘yii\web\JqueryAsset‘, ];
把js文件,css文件,以数组的方式赋值给这个Bundle类。简而言之,就是以OO的方式解决资源包的管理问题。$depends成员变量特别值得注意,它定义了这个资源包的依赖关系。比如上面这个定义,依赖于Jquery库,直接引入一个JqueryAsset资源包依赖就可以了,这样就避免了在多个Widget里存放多份Jquery文件的尴尬。
定义资源包后,在小部件的run方法里调用注册,如下:
$view = $this->getView(); UploaderAsset::register($view);
这样就完成了资源文件的拷贝过程,比1.x相比,管理上更方便了。
调用过程和1.x一样,只是现在流行用静态调用,方便IDE代码自动提示,效率进一步得到提升:
use app\modules\attach\widgets\singleUploader\SingleUploadWidget; echo SingleUploadWidget::widget([‘ctrlName‘=>‘user_file‘]);
原文地址:http://my.oschina.net/u/248080/blog/357489