Yii中的CComponent應用實例

首先咱們先了解一下如何建立一個CComponent,手冊講述以下:php


CComponent 是全部組件類的基類。
CComponent 實現了定義、使用屬性和事件的協議。
屬性是經過getter方法或/和setter方法定義。訪問屬性就像訪問普通的對象變量。讀取或寫入屬性將調用應相的getter或setter方法,例如:

前端


1
2
$a = $component ->text;     // equivalent to $a=$component->getText();
$component ->text= 'abc' // equivalent to $component->setText('abc');


getter和setter方法的格式以下,
web

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 ) { ... }

更多請參考手冊中的CComponent部份,在這裏不是詳述重點app


下面是應用需求,在一個網站前端,經常會有一個則欄,而這個側欄所須要的數據是同樣的,而且有兩個數據封裝,按照過往手法是寫一個通用方法,在須要的頁面內經過調用方法進行數據組裝,並附值到模板,但相比起組件仍是不夠靈活。在CComponent是以對象方式訪問方法。yii


1.下面是代碼實現方式ide

在extensions新建component目錄,並建立SSidebarComponent類繼承Yii 的CComponent接口網站


1
2
3
class SSidebarComponent extends CComponent
{
}


爲了方便查詢並減少代碼重複,咱們先建立一個CDbCriteria的通用查詢原型ui

1
2
3
4
5
6
7
8
9
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,咱們建立第一個數據對象,即以$component->account便可返回user_account_track表的查詢結果this

1
2
3
4
public function getAccount()
{     
     return UserAccountTrack::model()->findAll( $this ->_criteria());
}

建立第二個數據對象方法spa

1
2
3
4
public function getWebsite()
{  
    return UserTrack::model()->findAll( $this ->_criteria());
}

同理即以$component->account便可返回usertrack表的查詢結果


若是您想在調用時對CComponent某個屬性進行附值,即setter


1
2
3
4
public $id ;
public function setId( $value ){
     $this ->id = $value ;
}

這樣設置後當你引用組件時就能夠經過如下方法附值

1
$component ->id = '1' ;

2.下面講解調用過程

被動加載在你的控制器下引用組件,如我要在task這個index下使用側欄,優勢,按需加載,資源消耗小,缺點:手工加載

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public function actionIndex( $id = null)
{
     $component = Yii::createComponent( array ( 'class' => 'ext.component.SSidebarComponent' )); //引用組件
             
     $component ->id = $id ; //若是須要附值,就是這樣
             
     $account = $component ->account; //實際是調用getAccount()的方法及返回值
     $website = $component ->website; //實際是調用getWebsite()的方法及返回值           
             
     $this ->render( 'publiclist' , array (
         'website' => $website , //附值變量到模板
         'account' => $account , //附值變量到模板
     ));
}

主動加載,優勢,全站調用,以對象方法調用資源,缺點:資源消耗增多

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
  *config/main.php配置
  */
component=> array (
     'sidebar' => array (
         'class' => 'ext.component.SSidebarComponet' ,
     ),
),
   
/**
  *controller調用
  */
public function actionIndex()
{
     Yii::app()->sidebar->account;
}


OK如今已實現數據的調用過程,是否是比傳統的方法更靈活,代碼寫得更規範了


好了,今天就寫到這樣,有什麼問題歡迎留言!


原創內容轉載請註明出處:yii 中文網站

相關文章
相關標籤/搜索