在某些场合下,表格数据来自于多个没有直接关联关系的表格,并且需要经过合并,分解以及更多复杂的处理。
通常是做统计报告的时候需要这样处理,这时,CGridView支持的CActiveRecordProvider就不够用了(当然也可以通过生成中间表来处理)。
Yii中提供了另外一种更加灵活的方式来使用CGridView,即通过数组数据来提供数据源。
具体方法是首先构造出数组数据,然后转换为framework/web/CArrayDataProvider对象,然后传递给CGridView的dataProvider属性。
1、控制器中:
$deals = Yii::app()->db->createCommand('select id, `phone`, count(`id`) as count from
'.Deal::tableName()." WHERE `phone` = $keyword AND `status`=1 GROUP BY `phone`;")->queryAll();
$vendors = Yii::app()->db->createCommand('select id, `phone`, count(`id`) as count from
'.Vendor::tableName()." WHERE `phone` = $keyword AND `status`=1 GROUP BY `phone`;")->queryAll();
$data = array_merge($deals,$vendors);
$repdp = new CArrayDataProvider($data, array(
'id'=>'report',
'sort'=>array(
'attributes'=>array(
'count',
),
),
'pagination'=>array(
'pageSize'=>10,
),
));
$this->render('List', array('repdp'=>$repdp));
2、视图中:
<?php
$this->widget('application.extensions.grid.CGridView', array(
'id'=>'ugcrep-grid',
'dataProvider'=>$repdp,
'columns'=>array(
'phone',
'count',
)
));?>
如果想进一步使用过滤器filter,由于缺少对应的数据模型,得自行创建一个model对象,具体方法可参见参考文档2。
也可以简单点在表格外创建一个专门的搜索表单,然后处理相应的搜索逻辑即可。
by iefreer
参考:
http://stackoverflow.com/questions/9538777/using-an-array-as-the-data-source-for-cgridview
http://www.yiiframework.com/forum/index.php/topic/16435-cgridview-filters-with-carraydataprovider/