Yii: 在CGridView控件中使用数组做为数据源
在某些场合下,表格数据来自于多个没有直接关联关系的表格,并且需要经过合并,分解以及更多复杂的处理。
通常是做统计报告的时候需要这样处理,这时,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/
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。