分享:关于CActiveForm、Jui及beginWidget、endWidget [ 新手入门 ]
感谢一些热心的朋友(如lilongsy等)的帮助,分享一下自己的一点点的理解的东西,不对之处请指教
通过Yii的源码,结合生成的网页可知
当使用类似$this->widget('CActiveForm',array(…………));
通过CActiveForm
这个widget
生成表单的时候,系统会自动注册jquery.yiiactiveform.js
这个文件,并发布到assets
文件夹目录下
通用如果使用了Jui的widget,不管是使用了哪个Jui,系统会自动注册jquery-ui.mine.js
由于引入了这个文件,像JuiDialog
、JuiAutoComplete
等就可以通过创建widget直接使用了
关于$this->beginWidget()
、$this->endWidge()
和$this->widget()
;
疑问为什么写在$this->beginWidget()
和$this->endwidget()
之间的内容会被自动放入到这个widget
中去呢?
这是因为,通过查看源码可知beginWidget
函数会调用init
函数,而init
函数会通过CHtml::openTag()
创建一个标签,而endWidget()
函数会通过CHtml::closeTag()
创建一个标签的闭合,所以beginWidget
和endWidget
之间的内容会被放入到这个widget当中去。
关于beginWidget
的说明:它的作用是创建一个widget
并且初始化(通过init
方法),endWidget
的作用是:执行(通过run
方法)此widget
,并返回此widget
对象.
那么$this->widget()
方法是创建一个widget
并且执行这个widget
,也就是说它包括了benginWidget
和endWidget
两个的功能,因为是直接包括顺序执行了这两个方法,中间没有任何内容的添加,所以此用此方法创建的方法的内容是空的(当然,如果你的init
和run
方法中如果有输出,那肯定是有内容的,这里讨论的是最原始的未经扩展的情况下)。此外对于widget()
方法还会有所不同,此方法的的参数是
public mixed widget(string $className, array $properties=array ( ), boolean $captureOutput=false)
可见此方法有3个参数,并且返回的值是一个不确定的类型(mixed),第一个参数代表处理此widget对应的类名,第二个是一个数组,用来设置初始化此widge
t,第三个参数是一个boolean
型的,这也是为什么返回的值是不确定类型的原因,如果是false的话,返回的是一个widget
对象,如果是true的话返回的是一个字符串,即此widget
的输出内容。
而这里有很重要的一点就是,这里可以解释为什么我们用renderDynamic
调用widget
方法来在缓存页面中输出动态内容的时候,最后一个参数必须设置为true的原因。因为输出的必须是一个字符串而不可能是一个widget
对象。即在视图中$this->renderDynamic('widget','path_of_this_widget',array('params_1'=>'value_1',……),true);
OK,基本就理解了这些……
共 8 条回复
guzuomuse
最后登录:2013-05-27
在线时长:0小时0分
- 粉丝0
- 金钱220
- 威望0
- 积分220