转自: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', //必须指定一个作为主键
));
我比较偷懒 按道理 $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