Yii中的CComponent应用实例
首先我們先了解一下如何創(chuàng)建一個(gè)CComponent,手冊(cè)講述如下:
?
CComponent 是所有組件類的基類。?
CComponent 實(shí)現(xiàn)了定義、使用屬性和事件的協(xié)議。?
屬性是通過getter方法或/和setter方法定義。訪問屬性就像訪問普通的對(duì)象變量。讀取或?qū)懭雽傩詫⒄{(diào)用應(yīng)相的getter或setter方法,例如:
?
?
| 1 2 | $a=$component->text;???? // equivalent to $a=$component->getText(); $component->text='abc';? // equivalent to $component->setText('abc'); |
getter和setter方法的格式如下,?
| 1 2 3 4 | // getter, defines a readable property 'text' public function getText() { ... } // setter, defines a writable property 'text' with $value to be set to the property public function setText($value) { ... } |
更多請(qǐng)參考手冊(cè)中的CComponent部份,在這里不是詳述重點(diǎn)
?
下面是應(yīng)用需求,在一個(gè)網(wǎng)站前端,常常會(huì)有一個(gè)則欄,而這個(gè)側(cè)欄所需要的數(shù)據(jù)是一樣的,并且有兩個(gè)數(shù)據(jù)封裝,按照過往手法是寫一個(gè)通用方法,在需要的頁(yè)面內(nèi)通過調(diào)用方法進(jìn)行數(shù)據(jù)組裝,并附值到模板,但相比起組件還是不夠靈活。在CComponent是以對(duì)象方式訪問方法。
?
1.下面是代碼實(shí)現(xiàn)方式
在extensions新建component目錄,并創(chuàng)建SSidebarComponent類繼承Yii 的CComponent接口
?
class SSidebarComponent extends CComponent { }?
?
為了方便查詢并減小代碼重復(fù),我們先創(chuàng)建一個(gè)CDbCriteria的通用查詢?cè)?/p> private function _criteria() {$uid = Yii::app()->user->id;$criteria = new CDbCriteria();$criteria->condition = 'user_id = :uid';$criteria->params = array(':uid'=>$uid);$criteria->order = 'id asc';return $criteria; }
?
按照CComponent約定的方式即setter,我們創(chuàng)建第一個(gè)數(shù)據(jù)對(duì)象,即以$component->account即可返回user_account_track表的查詢結(jié)果
public function getAccount() { return UserAccountTrack::model()->findAll($this->_criteria()); }?
創(chuàng)建第二個(gè)數(shù)據(jù)對(duì)象方法
public function getWebsite() { return UserTrack::model()->findAll($this->_criteria()); }?
同理即以$component->account即可返回usertrack表的查詢結(jié)果
?
如果您想在調(diào)用時(shí)對(duì)CComponent某個(gè)屬性進(jìn)行附值,即setter
?
?
public $id; public function setId($value){$this->id = $value; }?
這樣設(shè)置后當(dāng)你引用組件時(shí)就可以通過以下方法附值
?
$component->id = '1';?
2.下面講解調(diào)用過程
被動(dòng)加載在你的控制器下引用組件,如我要在task這個(gè)index下使用側(cè)欄,優(yōu)點(diǎn),按需加載,資源消耗小,缺點(diǎn):手工加載
public function actionIndex($id = null) {$component = Yii::createComponent(array('class'=>'ext.component.SSidebarComponent'));//引用組件$component->id = $id;//如果需要附值,就是這樣$account = $component->account;//實(shí)際是調(diào)用getAccount()的方法及返回值$website = $component->website;//實(shí)際是調(diào)用getWebsite()的方法及返回值 $this->render('publiclist',array('website'=>$website,//附值變量到模板'account'=>$account,//附值變量到模板 )); }?
主動(dòng)加載,優(yōu)點(diǎn),全站調(diào)用,以對(duì)象方法調(diào)用資源,缺點(diǎn):資源消耗增多
/***config/main.php配置*/ component=>array('sidebar'=>array('class'=>'ext.component.SSidebarComponet',), ),/***controller調(diào)用*/ public function actionIndex() {Yii::app()->sidebar->account; }?
?
OK現(xiàn)在已實(shí)現(xiàn)數(shù)據(jù)的調(diào)用過程,是不是比傳統(tǒng)的方法更靈活,代碼寫得更規(guī)范了
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Yii中的CComponent应用实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适配器的应用
- 下一篇: android闹钟提醒