首先咱們先了解一下如何建立一個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 中文網站