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

来源:互联网 发布:网络重口现场微博 编辑:程序博客网 时间:2024/06/05 00:20

转自: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
原创粉丝点击