1,首先定义一个组件: eg:
class Test extends CComponent{
}
2:在一个组件(CComponent或者其子类)中定义一个事件,以on开头
eg:public function onClick($event){//event为CCEvent或其子类实例,里面包含了
$this->raiseEvent('onSubmit', $event);//发起一个时间,时间名为Submit;
}
3:绑定事件(注册事件句柄(可以注册多个事件句柄)):
1:定义事件的对象->事件名=$callback 或者 定义事件的对象 ->attachEventHandler( '事件名', $callback );
其中:$callback指字全局函数名的字符串或一个数组,该数组包含两个元素, 第一个元素是一个对象, 第二个元素是这个对象的方法。
eg:
- //方法绑定了。把$logOjbect对象中的saveLog方法绑定到$form对象(专业点叫‘组件’...)中的onSubmit事件中。
- $form ->attachEventHandler( 'onSubmit', array($logOjbect, "saveLog") );
4:触发事件并执行绑定的方法
newCEvent('触发事件的对象,'数组为传入到么对象绑定函数中的参数数据);
eg:
- //触发事件并执行其绑定的方法。这里把POST过来的数据传递到$logOjbect对象中的saveLog方法中,由saveLog对数据进行处理.
- $form->onSubmit(new CEvent($form, array('data'=>$_POST) ) );
-
eg:
class TestComponentController extends CController{
/***
* 定义一个事件,以on开头
* 参数为event,他是VEvent或者其子类的实例,* /
*/
public function onSubmit($event){
//触发事件
///raiseEvent($事件名, 事件参数)
$this->raiseEvent('onSubmit', $event);
}
public function one(){
echo "one";
}
/*带参数*/
public function Twp($data){
echo $data->params['name'] ;
}
public function actionIndex(){
//有两种方式对onsubmit事件进行方法的绑定( 绑定到么个对象,)
//1 $this->onSumbit=$callback;
//2 $this->attachEventHandler('事件名',‘处理函数’);
/*$callback代表一个事件处理程序。
* 一个事件处理程序必须是一个有效的PHP回调。
* 如,一个指字全局函数名的字符串或一个数组,该数组包含两个元素, 第一个元素是一个对象, 第二个元素是这个对象的方法。
*/
$this->onSubmit=array($this,"one");
/*2.绑定方式二*/
$this->attachEventHandler("onSubmit", array($this,twp"));
//newCEvent('触发事件的对象,'数组为传入到绑定函数中的参数数据);
//触发事件,执行绑定的方法
$this->onSubmit(new CEvent($this,array("name"=>"参数一","sex"=>"参数二")));
}
}
组件中的“行为”:行为就是一个特殊的类。
一个行为的运行示例。
1.先定义一个行为类。
- /*
- * 定义一个行为。
- */
- class MyBehavior extends CBehavior {
- public $name="行为中的name属性<br />";
- public function test1(){
- echo "行为中的一个方法Test1<br />";
- }
- public function test2(){
- echo "行为中的一个方法Test2<br />";
- }
- public function test3(){
- echo "行为中的一个方法Test3<br />";
- }
- public function events() {
- return array(
- 'onSubmit' => 'test3', //指定调用此行为的组件的onSubmit事件发生后,自动调用行为的test2
- );
- }
- }
2.在一个类中(一个控制器组件或者其他地方,这里用控制器组件做示例)中使用上面定义的行为。
- Yii::import('application.behavior.MyBehavior');
- class BehaviorTestController extends Controller
- {
- //定义一个事件
- public function onSubmit($event){
- $this->raiseEvent("onSubmit", $event);
- }
- public function test1(){
- echo "优先执行<br />";
- }
- public function actionIndex(){
- //给组件绑定一个行为 MyBehavior(当然,这个行为的类文件也必须先引入进来了...)
- $this->attachBehavior('myapp','MyBehavior');
- /**
- *一旦把行为帮到到这个组件当中,这个时候就可以使用行为类当中的所有方法和属性了。
- *和当前组件的对象(这里是$this)调用自身属性方法一样..
- *注意:如果当前组件中存在和行为名称一样的方法,将只会执行组件中的方法。
- * 如下:$this->test1()只会执行这个控制器组件中的test1方法
- */
- echo $this->name;//调用行为MyBehavior中的name属性
- echo $this->test1();//这里将执行当前控制器组件的test1,而不是行为中的test1
- echo $this->test2();//调用行为中的test2方法
- //触发当前组件的onSbumit事件的时候,将会执行行为中的test3方法。
- //因为这是在行为类MyBehavior中的events进行了事件绑定
- $this->onSubmit(new CEvent($this));
- }
- }
运行结果如下:
- 行为中的name属性
- 优先执行
- 行为中的一个方法Test2
- 行为中的一个方法Test3