首先我们先了解一下如何创建一个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接口

class SSidebarComponent extends CComponent
{
}

为了方便查询并减小代码重复,我们先创建一个CDbCriteria的通用查询原型

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表的查询结果

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

创建第二个数据对象方法

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

同理即以$component->account即可返回usertrack表的查询结果

如果您想在调用时对CComponent某个属性进行附值,即setter

public $id;
public function setId($value){
$this->id = $value;
}

这样设置后当你引用组件时就可以通过以下方法附值

$component->id = '1';

2.下面讲解调用过程

被动加载在你的控制器下引用组件,如我要在task这个index下使用侧栏,优点,按需加载,资源消耗小,缺点:手工加载

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,//附值变量到模板
));
}

主动加载,优点,全站调用,以对象方法调用资源,缺点:资源消耗增多

/**
*config/main.php配置
*/
component=>array(
'sidebar'=>array(
'class'=>'ext.component.SSidebarComponet',
),
), /**
*controller调用
*/
public function actionIndex()
{
Yii::app()->sidebar->account;
}

OK现在已实现数据的调用过程,是不是比传统的方法更灵活,代码写得更规范了

Yii中的CComponent应用实例的更多相关文章

  1. yii CComponent组件 实例说明1

    yii CComponent组件 实例说明 yii中的module,controller都是CComponent的子类,可以说yii的架构基石就是依托在CCompnent基础上的,这里研究下CComp ...

  2. 在YII中使用Redis等缓存

    Yii AR 单行数据-自动缓存机制 | LOCKPHP Yii AR 单行数据-自动LOG机制 CActiveRecordBehavior进阶 | LOCKPHP 缓存 - 权威指南 - Yii F ...

  3. Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)

    英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...

  4. yii中缓存(cache)详解

    缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: 1 ...

  5. Yii框架 多表查询实例

    Yii框架多表查询实例:总共分为两个步骤(以下的代码我全部都写在model中):1.先在主表model中声明关联表中所需要查询的字段. public $surveyls_description; // ...

  6. yii中缓存(cache)详解 - 彼岸あ年華ツ

    缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成 这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: ...

  7. Yii中的错误及异常处理

    Yii中的错误及异常处理 Yii已经默认已经在CApplication上实现了异常和错误的接管,这是通过php的set_exception_handler, set_error_handler实现的. ...

  8. Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  9. yii 中引入js 和css 的方式

    在yii中 我们需要引入css 和 js 的时候,yii 自身有需要的类. 当我在views 视图层中引入css 和 js , <?php Yii::app()->clientScript ...

随机推荐

  1. Verilog篇(三)仿真原理

    首先引入一个例子: `timescale  1ns/100ps module   TB;                                                         ...

  2. 通过canal实现把MySQL数据实时增量到kafka

    说明:我们有一个业务需要把mysql中一些表实时同步到大数据集群hbase上面,我们先通过sqoop把表中数据全量导入到hbase中,然后再通过canal定位的某个binlog的position,来实 ...

  3. 2016NOI冬令营day2

    早上起来发现头不痛了(还是咳) : | 上午先讲自然语言处理!完全不考!完全不涉及!一开始挺有兴趣,后面就完全听不懂了 : | 后来又讲了几道IOI题目(自称只是op),然后就是  从信息熵到数据压缩 ...

  4. PHP开发者成长图

    作为PHP开发者,根据自己给自己的定位和这幅图,是否觉得自己还需要比平时更努力呢~

  5. 什么是IO多路复用?Nginx的处理机制

    先来说一下什么是IO复用? IO复用解决的就是并发行的问题,比如多个用户并发访问一个WEB网站,对于服务端后台而言就会产生多个请求,处理多个请求对于中间件就会产生多个IO流对于系统的读写.那么对于IO ...

  6. bootstrap 日期控件常用选项

    使用bootstrap作为UI基础之后,为了尽可能的保持系统风格的一致性,通常我们不太会考虑再引入My97DatePicker作为日期控件. 作为潜在实现的选择之一,http://www.bootcs ...

  7. lambda表达式Bug——修改捕获变量失败

    解<C++ Primer 5th>的 9-50 练习题时,遇到了 lambda表达式值捕获和引用捕获之区别问题. 欲修改捕获的变量 sum,累加之.但当时忘记值捕获和引用捕获是有区别的.下 ...

  8. zabbix配置自动发现,故障邮件告警

    对网段内的主机进行自动发现,自动加入主机组,自定加入template 创建动作时,类型这里选择discovery 然后将发现的主机加入host group和template: 动作针对的是discov ...

  9. 20145324王嘉澜《网络对抗技术》MSF基础应用

    实践目标 •掌握metasploit的基本应用方式 •掌握常用的三种攻击方式的思路. 实验要求 •一个主动攻击,如ms08_067 •一个针对浏览器的攻击,如ms11_050 •一个针对客户端的攻击, ...

  10. STM32唯一的ID

    请看如下程序: /*------------------------------------------------------------------------------------------ ...