用数组array代替CActiveRecord构建CArrayDataProvider

当需要构建 GridView的时候;

常常用 CArrayDataProvider 或者 CActiveDataProvider
这是就需要一个CActiveRecord

比如:
 857         $sql = "SELECT * FROM zhuanli_applicantCount where kId=:kId order by percentage desc";
 858           $rawData= model_applicant::model()->findAllBySql($sql,array('kId'=>$KDValue));
 859         $IDARRAY = array();
 860         
 861         $paginationTop = new CPagination(sizeof($rawData));
 862         $paginationTop->pageVar = 'page';
 863         $paginationTop->pageSize= 10;
 864         $paginationButtom = clone $paginationTop;
 865         $dataProvider =   new CArrayDataProvider($rawData, array(
 866             'keyField'=>false,
 867         ));
 868         $this->render('applicantListMore', array(
 869             'dataProvider'=>$dataProvider,
 870             'paginationTop'=>$paginationTop,
 871             'totalItemCount'=>sizeof($rawData),
 872             'paginationButtom'=>$paginationButtom,
 873         ));





如果需要展示的数据主题并不在一个数据表中,而是我们用Coreseek得到的一个数组,或者就是一个普通的数组
如何用数组数据来展现 GridView视图呢?

首先可以去看下$dataProvider =   new CArrayDataProvider($rawData, array(
的数据结构
object(CArrayDataProvider)#37 (10) {
  ["keyField"]=>
  bool(false)
    ["rawData"]=>
  array(24) {
    [0]=>
    array(2) {
      ["provinceId"]=>
      string(2) "11"
      ["provinceName"]=>
      string(9) "江苏省"
    }
……
……
    [23]=>
    array(2) {
      ["provinceId"]=>
      string(2) "15"
      ["provinceName"]=>
      string(9) "江西省"
    }
  }
  ["_id":"CDataProvider":private]=>
  NULL
  ["_data":"CDataProvider":private]=>
  NULL
  ["_keys":"CDataProvider":private]=>
  NULL
  ["_totalItemCount":"CDataProvider":private]=>
  NULL
  ["_sort":"CDataProvider":private]=>
  NULL
  ["_pagination":"CDataProvider":private]=>
  NULL
  ["_e":"CComponent":private]=>
  NULL
  ["_m":"CComponent":private]=>
  NULL
}
好,那我们想要的结果是最后能够
  $dataProvider = new CArrayDataProvider($IDARRAY, array(
那就来构建这个数组

 734         $IDARRAY = array();
 735         $total =0;
 736         $totalItemCount = 0;
 737         if($result['total'])
 738         {
 739             foreach($result['matches'] AS $k=>$v)
 740             {
 741                 $IDARRAY[] = array('site_name'=>$v['attrs']['site_name'],'count'=>$v['attrs']['@count']);
 742                 $total+= $v['attrs']['@count'];
 743             }
 744             $totalItemCount = $result['total'];
 745             $this->sourceMoreIDARRAY=$IDARRAY;
 746             $this->sourceMoreNum=$total;
 747         }       
 748                 
 749         $paginationTop = new CPagination($totalItemCount);
 750         $paginationTop->pageVar = 'page';
 751         $paginationTop->pageSize= 10;
 752         $paginationButtom = clone $paginationTop;
 753          $dataProvider = new CArrayDataProvider($IDARRAY, array(
 754             'keyField'=>false,
 755         ));
 756         
 757         $this->render('sourceListMore', array(
 758             'dataProvider'=>$dataProvider,
 759             'paginationTop'=>$paginationTop,
 760             'totalItemCount'=>$totalItemCount,
 761             'paginationButtom'=>$paginationButtom,
 762         ));
来看下
$dataProvider = new CArrayDataProvider($IDARRAY, array(
object(CArrayDataProvider)#37 (10) {
  ["keyField"]=>
  bool(false)
  ["rawData"]=>
  array(456) {
    [0]=>
    array(2) {
      ["site_name"]=>
      string(0) ""
      ["count"]=>
      int(3046)
    }
    [1]=>
    array(2) {
      ["site_name"]=>
      string(9) "易车网"
      ["count"]=>
      int(904)
    }
    [455]=>
    array(2) {
      ["site_name"]=>
      string(9) "科技讯"
      ["count"]=>
      int(1)
    }
  }
  ["_id":"CDataProvider":private]=>
  NULL
  ["_data":"CDataProvider":private]=>
  NULL
  ["_keys":"CDataProvider":private]=>
  NULL
  ["_totalItemCount":"CDataProvider":private]=>
  NULL
  ["_sort":"CDataProvider":private]=>
  NULL
  ["_pagination":"CDataProvider":private]=>
  NULL
  ["_e":"CComponent":private]=>
  NULL
  ["_m":"CComponent":private]=>
  NULL
}
OK ,成功,其实用着样的方法,比用SQL 是不是要方便很多?


 

但是应该适用于,GridView中 column没几个的情况。
如果有很多Column,一般都是某个数据表的数据要展示,当然就用CActiveRecord
$rawData= model_applicant::model()->findAllBySql($sql,array('kId'=>$KDValue));


posted @ 2013-06-29 21:47  jlins  阅读(956)  评论(0编辑  收藏  举报