您的位置:首页 > 数据库

CActiveDataProvider, CArrayDataProvider, CSqlDataProvider填充CGridView数据经验谈

2013-07-03 02:34 639 查看
转自:http://yxmhero1989.blog.163.com/blog/static/112157956201301074352103/

这开始介绍Zii组件之前,先简要介绍一下Yii支持的数据源接口 IDataProvider,IDataProvider主要功能是为UI组件如GridView,ListView等提供数据源,同时也支持数据的分页和排序。下图为Yii内置的三种数据源:

CActiveDataProvider 基于Active Record的数据源
CArraryDataProvider 基于数组的数据源
CSqlDataProvider 基于SQL查询的数据源

1.CActiveDataProvider 基于ActiveRecord, 它通过AR的 CActiveRecord::findAll方法读取数据库记录,并通过 criteria属性设置查询条件。

public function actionIndex()
{
$dataProvider=new CActiveDataProvider('ApiUser', array(
'criteria'=>array(
'sort'=>array(
'defaultOrder'=>'createTime DESC',
),
'condition'=>'isDelete=1',//正常用户
'pagination' => array (
'pageSize' => 20
)
)
));

$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}


2.CArrayDataProvider 基于数组,其中属性rawData设置原始数据,一般为数组或者DAO查询结果

//Array数据提供
$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
$array_data = Yii::app()->db->createCommand($sql)->queryAll();
$array_provider = new CArrayDataProvider($array_data, array(
'keyField'=>'uid',   //必须指定一个作为主键
));


3 。CSqlDataProvider 基于SQL查询,通过设置 sql语句来配置,比如:

我比较偷懒 按道理 $dataProvider直接在Controller里面 我只是做个例子 看的更清楚

<h1>客户端意见反馈:</h1>
<?php
$shopsql = "SELECT * FROM {{mobile_feedback}} ORDER BY addTime DESC";
$shopcount = "SELECT COUNT(*)  FROM {{mobile_feedback}} ";
$shopreturn = Yii::app()->apidb->createCommand($shopcount)->queryAll();
$scount = isset($shopreturn[0]['COUNT(*)'])?$shopreturn[0]['COUNT(*)']:0;
$dataProvider = new CSqlDataProvider ( $shopsql, array (
'keyField'=>'id', //sql in select table column default id
'totalItemCount'=>$scount,
'db'=>Yii::app()->apidb,//default Yii::app()->db.
'id'=>'id',
'sort' => array (
'attributes' => array (
'id'
), // sql table columns
'defaultOrder' => array (
'id' => true
)
),
'pagination' => array (
'pageSize' => 20
)
) );

$this->widget ( 'GridView', array (
'dataProvider' => $dataProvider,
'filter'=>$dataProvider,
'columns' => array (
array (
'header' => '用户id',
'value' => '$data["userId"]'
),
array (
'header' => '手机号码',
'value' => '$data["phone"]'
),
array (
'header' => '意见内容',
'value' => '$data["message"]'
),
array (
'header' => '添加时间',
'value' => 'date("Y-m-d",$data["addTime"])',
),
array (
'header' => '平台',
'value' => '$data["platform"]',
),
array (
'header' => '版本',
'value' => '$data["version"]',
),
array(
'header' => '<span>操作</span>',
'class'=>'CButtonColumn',
'htmlOptions'=>array(
'width'=>'100',
),
'template'=>'{view}',
'buttons'=>array(
'view' => array(
'label' =>'打开',
'url' =>'Yii::app()->createUrl("activity/signup/admin",array("id"=>$data["Id"]))',
),
)
),
),
) );

?>


insun提醒大家 使用CSqlDataProvider的时候注意的几点:

①. $data返回的是数组 不要用$data->attributes对象的方式 否则会报错

②.右上角数目不对的话 原因是你的
$shopcount sql取的不对 仔细检查就可以了

③.用到CButtonColumn的时候记得url重写

要么 array(

'header' => '<span>操作</span>',

'class'=>'CButtonColumn',

'htmlOptions'=>array(

'width'=>'100',

),

'template'=>'{update}',

'updateButtonUrl'=>'Yii::app()->createUrl("insun/xxoo")'

),

要么 array(

'header' => '<span>操作</span>',

'class'=>'CButtonColumn',

'htmlOptions'=>array(

'width'=>'100',

),

'template'=>'{view}',

'buttons'=>array(

'view' => array(

'label' =>'打开',

'url' =>'Yii::app()->createUrl("insun/xxoo",array("id"=>$data["Id"]))',

),

)

),

④。$dataProvider = new CSqlDataProvider ( $shopsql, array (

'keyField'=>'id', //sql in select table column default id

'totalItemCount'=>$scount,

'db'=>Yii::app()->apidb,//default Yii::app()->db.

'id'=>'id',

'sort' => array (

'attributes' => array (

'id'

), // sql table columns

'defaultOrder' => array (

'id' => true

)

),

'pagination' => array (

'pageSize' => 20

)

) );

⑤。个人认为CSqlDataProvider不能用filter,因为filter是CModel的。http://www.yiichina.com/forum/thread-1904-1-1.html

Reference:
http://blog.yiibook.com/?p=420 http://www.07net01.com/program/46610.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐