yii框架widget和注册asset的例子
yii框架是一个基于组件的框架,这样代码的重用性就非常的高,如我们想在网站的多个地方调用编辑器,这样我们就可以自定义一个组件,来供我们调用使用
下面以Ueditor组件为例:
1、下载ueditor到protected下面的extensions下面
、
2、在改目录下建立UeditorWidget.php
<?php class UeditorWidget extends CWidget { public $id = 'ueditor'; public $name = 'content'; public $width = '100%'; public $height = '400px'; public $jsFiles = array( '/ueditor.config.js', '/ueditor.all.min.js', ); public function run() { $path = Yii::app()->assetManager->publish(dirname(__FILE__)); foreach($this->jsFiles as $v) { Yii::app()->getClientScript()->registerScriptFile($path.$v); } $this->render('ueditor'); } }
注意:所有的组件都要继承CWidget这个类
3、每个组件都有自己的视图
<script id="<?php echo $this->id;?>" type="text/plain" style="width:<?php echo $this->width;?>;height:<?php echo $this->height;?>;"></script> <script> var ue = UE.getEditor('<?php echo $this->id;?>'); </script>
4、在视图中调用
<?php $this->widget('ext.ueditor.UeditorWidget',array( 'id'=>'eidtor', 'width'=>'100%', 'height'=>'400px', )); ?>
说明:这个只是一个非常简单的配置,因为ueditor这个还有很多的参数,我这只是调用了一个界面出来。可以参见ueditor手册。
一般在自定义组件的时候,经常要将js,css注册到资源中。所以这个注册时非常重要;
public function run() { //publish这个是将改文件目录都给注册到资源文件目录中 $path = Yii::app()->assetManager->publish(dirname(__FILE__)); foreach($this->jsFiles as $v) { //这个是将所需的文件,注册到页面中 Yii::app()->getClientScript()->registerScriptFile($path.$v); } $this->render('ueditor'); }
虽然yii的资源管理很方便,但是在注册资源多了以后也可能会发生效率低下的问题,基本上原因在于每次调用assetManager
的publish
方法时都强制将文件拷贝到资源文件夹下了。 当然,开发的时候,这样比较方便,改动了js、css文件能马上看出效果,但是在线上环境时就加大了服务器的负担。 要解决这个问题只要将CAssetManager
类里的publish
方法的第四个参数$forceCopy
设置为YII_DEBUG
常量就好了,在生产环境时强制复制资源文件,在线上环境不强制复制。