首先我们先了解一下如何创建一个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,CEvent与Behavior及CActiveRecordBehavior

    YII中的CComponent,CEvent与Behavior及CActiveRecordBehavior个人理解 这一块教程少,今天个人理解了下,写了个小例子,有助于理解 完成如下功能,一个JToo ...

  2. yii CComponent组件 实例说明1

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

  3. yii mysql 事务处理_Yii2中事务的使用实例代码详解

    前言 一般我们做业务逻辑,都不会仅仅关联一个数据表,所以,会面临事务问题. 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全 ...

  4. Yii中Action详解

    在此篇中,主要介绍Yii是如何看待Action的.那么在Controller中又是如何如何处理Action的,Action又有哪些需要注意的特性呢? 带着这些问题,我们来看看下面的代码,里面会涉及到Y ...

  5. YII中session和cookie

    一,在Yii中使用session  与原生态php5的session使用差别是,php5使用session_start();$_session['key'] = $value;  在yii中,sess ...

  6. yii中常见问题(2)

    如何显示静态页 重写actions 'help'=>array( 'class'=>'CViewAction', 'basePath'=>'help', //指定目录名 'defau ...

  7. python创建类的实例方法-Python中动态创建类实例的方法

    简介 在Java中我们可以通过反射来根据类名创建类实例,那么在Python我们怎么实现类似功能呢? 其实在Python有一个builtin函数import,我们可以使用这个函数来在运行时动态加载一些模 ...

  8. python去重复行_python去除文件中重复的行实例

    python去除文件中重复的行,我们可以设置一个一个空list,res_list,用来加入没有出现过的字符行! 如果出现在res_list,我们就认为该行句子已经重复了,可以再加入到记录重复句子的li ...

  9. android native java_在Android Native层中创建Java虚拟机实例

    前言 Android应用中JNI代码,是作为本地方法运行的.而大部分情况下,这些JNI方法均需要传递Dalvik虚拟机实例作为第一个参数.例如,你需要用虚拟机实例来创建jstring和其他的Java对 ...

最新文章

  1. 哈佛图书馆墙上的训言
  2. python没有上方工具栏_Python体验(08)-图形界面之工具栏和状态栏
  3. java中exec命令,使用Java中的Runtime.exec()執行Windows命令
  4. RAC IP 地址修改
  5. 11. mysqli 学习
  6. linux定时任务实例,linux定时任务访问url实例
  7. SqliteHelper整理
  8. IP SLA的路径控制
  9. (128)FPGA面试题-用一个二选一的MUX和一个非门实现异或
  10. 2018.3.10 模拟赛——(2)给出字符串
  11. 《圈圈教你玩USB》 第七章 USB MIDI键盘 看书笔记
  12. DelayQueue 分析
  13. 微信小程序学习并搭建
  14. Java 全栈知识体系
  15. WPF制作表示透明区域的马赛克画刷
  16. LeetCode_初级算法_数组
  17. c++模板函数的声明和定义该在什么文件里?
  18. js 实现 将一句英文的首字母转大写,其它转小写
  19. CCF ChinaSoft 2022预告丨形式化方法工业应用前沿分论坛 暨中科国创高可信联合上海控安新品发布...
  20. alt在计算机中代表什么,计算机中alt+enter是什么快捷键

热门文章

  1. python 使用文本注解绘制树节点_整理了 34 个被吹爆了的Python开源框架
  2. python的flag是什么意思_python flag 什么意思
  3. 【caffe速成】caffe图像分类从模型自定义到测试
  4. 【模型解读】network in network中的1*1卷积,你懂了吗
  5. 全球及中国沼气发电行业现状及项目发展动态调研报告2021年版
  6. Ehcache缓存配置
  7. url编码混乱下下载工具如何应对
  8. 位居全国第一- 丰收节交易会·内蒙古:名特优新农产品数量
  9. 重整谋定电商经信研究新格局-李玉庭:人工智能精细化运营
  10. nodejs 全局变量和全局对象