现在的位置: 首页 > 综合 > 正文

Yii: 在CGridView控件中使用数组做为数据源

2013年10月19日 ⁄ 综合 ⁄ 共 1363字 ⁄ 字号 评论关闭

在某些场合下,表格数据来自于多个没有直接关联关系的表格,并且需要经过合并,分解以及更多复杂的处理。

通常是做统计报告的时候需要这样处理,这时,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/

抱歉!评论已关闭.