php笔记之CComponent

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:

  1. //方法绑定了。把$logOjbect对象中的saveLog方法绑定到$form对象(专业点叫‘组件’...)中的onSubmit事件中。  
  2.         $form ->attachEventHandler( 'onSubmit',  array($logOjbect"saveLog") );

4:触发事件并执行绑定的方法

       newCEvent('触发事件的对象,'数组为传入到么对象绑定函数中的参数数据);

eg:

  1. //触发事件并执行其绑定的方法。这里把POST过来的数据传递到$logOjbect对象中的saveLog方法中,由saveLog对数据进行处理. 
  2.         $form->onSubmit(new CEvent($formarray('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.先定义一个行为类。

[php]   view plain copy
  1. /* 
  2.  * 定义一个行为。 
  3.  */  
  4. class MyBehavior extends CBehavior {  
  5.   
  6.     public $name="行为中的name属性<br />";  
  7.   
  8.     public function test1(){  
  9.         echo "行为中的一个方法Test1<br />";  
  10.   
  11.     }  
  12.     public function test2(){  
  13.         echo "行为中的一个方法Test2<br />";  
  14.     }  
  15.   
  16.     public function test3(){  
  17.         echo "行为中的一个方法Test3<br />";  
  18.     }  
  19.   
  20.     public function events() {  
  21.         return array(  
  22.                 'onSubmit' => 'test3',  //指定调用此行为的组件的onSubmit事件发生后,自动调用行为的test2  
  23.         );  
  24.     }  
  25. }  

2.在一个类中(一个控制器组件或者其他地方,这里用控制器组件做示例)中使用上面定义的行为。

[php]   view plain copy
  1. Yii::import('application.behavior.MyBehavior');  
  2. class BehaviorTestController extends Controller  
  3. {  
  4.     //定义一个事件  
  5.     public function onSubmit($event){  
  6.         $this->raiseEvent("onSubmit"$event);  
  7.     }  
  8.   
  9.     public function test1(){  
  10.         echo "优先执行<br />";  
  11.     }  
  12.   
  13.     public function actionIndex(){  
  14.         //给组件绑定一个行为 MyBehavior(当然,这个行为的类文件也必须先引入进来了...)  
  15.         $this->attachBehavior('myapp','MyBehavior');  
  16.         /** 
  17.          *一旦把行为帮到到这个组件当中,这个时候就可以使用行为类当中的所有方法和属性了。 
  18.          *和当前组件的对象(这里是$this)调用自身属性方法一样.. 
  19.          *注意:如果当前组件中存在和行为名称一样的方法,将只会执行组件中的方法。 
  20.          *    如下:$this->test1()只会执行这个控制器组件中的test1方法 
  21.          */  
  22.   
  23.             echo $this->name;//调用行为MyBehavior中的name属性  
  24.             echo $this->test1();//这里将执行当前控制器组件的test1,而不是行为中的test1  
  25.             echo $this->test2();//调用行为中的test2方法  
  26.   
  27.             //触发当前组件的onSbumit事件的时候,将会执行行为中的test3方法。  
  28.             //因为这是在行为类MyBehavior中的events进行了事件绑定  
  29.             $this->onSubmit(new CEvent($this));  
  30.     }  
  31. }  


运行结果如下:

[html]   view plain copy
  1. 行为中的name属性  
  2. 优先执行  
  3. 行为中的一个方法Test2  
  4. 行为中的一个方法Test3 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值