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

转自: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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值