首先我们先了解一下如何创建一个CComponent,手册讲述如下:
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方法的格式如下,
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部份,在这里不是详述重点
下面是应用需求,在一个网站前端,常常会有一个则栏,而这个侧栏所需要的数据是一样的,并且有两个数据封装,按照过往手法是写一个通用方法,在需要的页面内通过调用方法进行数据组装,并附值到模板,但相比起组件还是不够灵活。在CComponent是以对象方式访问方法。
1.下面是代码实现方式
在extensions新建component目录,并创建SSidebarComponent类继承Yii 的CComponent接口
1 2 3 | class SSidebarComponent extends CComponent { } |
为了方便查询并减小代码重复,我们先创建一个CDbCriteria的通用查询原型
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表的查询结果
1 2 3 4 | public function getAccount() { return UserAccountTrack::model()->findAll( $this ->_criteria()); } |
创建第二个数据对象方法
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现在已实现数据的调用过程,是不是比传统的方法更灵活,代码写得更规范了
好了,今天就写到这样,有什么问题欢迎留言!
原创内容转载请注明出处: