Yii使用技巧大汇总(7)

$j = new JTool(); $j->onChange = "showChange"; //给事件绑定handle showChange $j->width = 100; //调用setWidth,解发绑定的事件showChange function showChange(){ echo 'changed me'; }

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

class JToolSub extends JTool{ public function get100width(){ return $this->width*100; } }

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

上边的这两种办法,就是仅完成功能,下边演示Behavior及events来实现

如何用Behavior来实现上边的增加一个方法,返回长度的100倍的功能呢?
写类JBe

JBe.php在protected/behavior 下

class JBe extends CBehavior{ public function get100width(){ return $this->Owner->width*100; } }

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

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

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

class JBe extends CBehavior{ public function events(){ return array_merge(parent::events(),array( 'onChange'=>'change', )); } public function change(){ echo 'changed'; } public function get100width(){ return $this->Owner->width*100; } }

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

$j = new JTool(); $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绑定即可

如果你自己有个目录下有些类或文件常用,可以在main.php的最上边定义一个路径别名

复制代码 代码如下:

Yii::setPathOfAlias('local','path/to/local-folder');


如果是多个可以在main.php中的array中加一个配置

'aliases'=>array( 'local'=>'path/to/local/' ),

如何得到proteced目录的物理路径?

复制代码 代码如下:

YII::app()->basePath;


widget是发布资源

$url = Yii::app()->getAssetManager()->publish(Yii::getPathOfAlias('application.components.homeuserlived')); cs()->registerCoreScript('jquery'); cs()->registerScriptFile($url.'/location.js' ,CClientScript::POS_HEAD); cs()->registerScriptFile($url.'/YLChinaArea.js' ,CClientScript::POS_HEAD); cs()->registerCssFile($url.'/style.css');

如何写application component, 即在main.php可配置

复制代码 代码如下:

"my"=>array('')


可以通过Yii::app()->my来访问?

继承CApplicationComponent即可,并可以自带Behavior等

yii中读写session的两种方法

$session = Yii::app()->session; $session['terry'] = 30; var_dump($session['key']); Yii::app()->user->setState('tom', '40'); var_dump(Yii::app()->user->getState('key', 'default'));

soap非yii教程,意思是不用yii框架的时候要对象提供webservice的写法

分两种WSDL模式,和非WSDL模式,先看后者

这个也比较简单,服务器端server.php:

<?php ini_set('soap.wsdl_cache_enabled',0); class Student { public function getInfo($name,$age){ if($age == 20){ throw new SoapFault(-1, 'Cannot divide by zero!'); } $xml = "<root><name>".$name."</name>"; $xml .= "<age>".$age."</age></root>"; return $xml; } } $soapS = new SoapServer(null,array('uri' => 'http://www.dayouhui.com')); $soapS->setClass('Student'); $soapS->handle(); ?>

客户端client.php:

<?php $soap = new SoapClient(null,array('location'=>"http://localhost/mysoap/index.php",'uri'=>'inadex.php')); echo $soap->getInfo('a','b');

这样子即可

yii,Componnts那快,忘了,写了个小例子回忆了下
是写一个可以写在main.php中的Components并绑定行为,事件

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2f8106786391352ef2279db1bd51a4b1.html