YII中的CComponent,CEvent与Behavior示例_nuoyazhou110-ChinaUnix博客

网友投稿 645 2022-09-23

YII中的CComponent,CEvent与Behavior示例_nuoyazhou110-ChinaUnix博客

YII中的CComponent,CEvent与Behavior示例_nuoyazhou110-ChinaUnix博客

YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior

完成如下功能,一个JTool类,继承CComponent,当其长度改变时,调用事件,输出"change me".

JTool.php在protected/components 下

classJToolextendsCComponent{private$_width;publicfunctiongetWidth(){return$this->_width?$this->_width:1;}publicfunctionsetWidth($width){if($this->hasEventHandler('onChange')){$this->onChange(newCEvent());}$this->_width=$width;}publicfunctiononChange($event){$this->raiseEvent('onChange',$event);}}

OK,功能已经实现了,找个控制器,执行

$j=newJTool();$j->onChange=array($this,"showChange");//给事件绑定handleshowChange$j->width=100;//调用setWidth,解发绑定的事件showChangefunctionshowChange(){echo'changedme';}

现在我们想给JTool添加一个功能,返回长度的100倍,我们可以继承JTool.php写一个方法

classJToolSubextendsJTool{publicfunctionget100width(){return$this->width*100;}}

OK,功能实现了,这个执行就简单了new JToolSub调用方法即可

上边的这两种办法,就是仅完成功能,下边演示Behavior及events来实现如何用Behavior来实现上边的增加一个方法,返回长度的100倍的功能呢?写类JBeJBe.php在protected/behavior 下

classJBeextendsCBehavior{publicfunctionget100width(){return$this->Owner->width*100;}}

OK,功能已经实现了,找个控制器,执行

$j=newJTool();$j->attachBehavior('JBe','application.behavior.JBe');echo$j->get100width();

如何用Behavior实现JTool中的长度改变时,调用一个事件的功能呢?

写类JBe

classJBeextendsCBehavior{publicfunctionevents(){returnarray_merge(parent::events(),array('onChange'=>'change',));}publicfunctionchange(){echo'changed';}publicfunctionget100width(){return$this->Owner->width*100;}}

OK,功能实现随便找个控制器,执行

$j=newJTool();$j->attachBehavior('JBe','application.behavior.JBe');$j->width=100;

这里的要点是events方法

返回的数组array('onChange'=>'change')定义了事件(event)和对应的事件处理方法(event hander)

事件是是Compents(JTool中)定义的,即JTool中的onChange

处理方法同由Behavior(JBe中)类定义的,即JBe中的change

这样子再看CActiveRecordBehavior,其是绑定给CActiveRecord 这个组件的,绑定方法重写behaviors()

CActiveRecordBehavior中的events() 方法返回事件及事处理函数的对应,如:

'onBeforeSave'=>'beforeSave'

即组件CActiveRecord中的onBeforeSave这个事件对应的处理函数是

CActiveRecordBehavior中的beforeSave方法

这样子CActiveRecord在调用save()时,触发事件onBeforeSave,调用CActiveRecordBehavior对应的处理函数beforeSave

我们只要写一个CActiveRecordBehavior的子类,重写其中的beforeSave,执行一些操作,然后给CActiveRecord绑定即可

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:学Python,从列表推导到zip()函数,这五种技巧应知应会(zip函数Python)
下一篇:滑动窗口与拥塞窗口_流云哭翠-ChinaUnix博客
相关文章

 发表评论

暂时没有评论,来抢沙发吧~