博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Yii中的CComponent应用实例
阅读量:5820 次
发布时间:2019-06-18

本文共 2547 字,大约阅读时间需要 8 分钟。

hot3.png

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

好了,今天就写到这样,有什么问题欢迎留言!

原创内容转载请注明出处:

转载于:https://my.oschina.net/u/1251846/blog/191958

你可能感兴趣的文章
【聚能聊有奖话题】Boring隧道掘进机完成首段挖掘,离未来交通还有多远?
查看>>
盘点物联网网关现有联网技术及应用场景
查看>>
考研太苦逼没坚持下来!看苑老师视频有点上头
查看>>
HCNA——RIP的路由汇总
查看>>
zabbix监控php状态(四)
查看>>
实战Django:小型CMS Part2
查看>>
原创]windows server 2012 AD架构试验系列 – 16更改DC计算机名
查看>>
统治世界的十大算法
查看>>
linux svn安装和配置
查看>>
SSH中调用另一action的方法(chain,redirect)
查看>>
数据库基础
查看>>
表格排序
查看>>
关于Android四大组件的学习总结
查看>>
java只能的round,ceil,floor方法的使用
查看>>
由于无法创建应用程序域,因此未能执行请求。错误: 0x80070002 系统找不到指定的文件...
查看>>
新开的博客,为自己祝贺一下
查看>>
【CQOI2011】放棋子
查看>>
采用JXL包进行EXCEL数据写入操作
查看>>
一周总结
查看>>
将txt文件转化为json进行操作
查看>>