首页 > Yii中的CComponent应用实例

Yii中的CComponent应用实例

首先我们先了解一下如何创建一个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现在已实现数据的调用过程,是不是比传统的方法更灵活,代码写得更规范了

更多相关:

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...

  • initializeGL函数由于是初始化,所以只调用一次 而resizeGL和paintGL会多次调用 resizeGL在正常的情况下,触发的条件是,窗口大小发生变化时,resizeGL被调用,之后会触发paint事件,从而调用paintGL()事件处理器。 paintGL在正常的情况下,只要你移动窗口的位置,就会马上触发pain...

  • 思考:在析构函数中delete this指针,运行下面代码会产生什么样的结果呢? #include   using namespace std;    class A{  public:  A(){  cout<<"A()"<

  • (1)如果用定时器的话,初始的时候注册一个定时器的回调函数,原型是 glutTimerFunc(unsigned int millis, void (*func)(int value), int value);         参数对应关系为:glutTimerFunc(毫秒数, 回调函数指针, 区别值); (2)写自己的回调函数 v...

  • 0x00 前置信息 VLC是一个非常庞大的工程,我从它的架构及流程入手进行分析,涉及到一些很细的概念先搁置一边,日后详细分析。 0x01 源码结构(Android Java相关的暂未分析) # build-android-arm-linux-androideabi/:第三方库。 # modules/:模块代码。 # modules/...