如何使用CDataProvider在Yii中创建自己的DataProvider?

时间:2014-05-19 13:50:39

标签: php yii pagination dataprovider

我的情况如下。我使用CSqlDataProvider及其分页(页面大小)获取一些数据,内部使用限制和偏移量。之后我得到

  

$ rawData = $ sqldp-> getData();

现在我需要进行一些处理并添加其他数据。所以现在我得到

  

$ modRawData = modification($ rawData);

现在如果我创建一个CArrayDataProvider将其转换为Dataprovider,以便我可以使用CListView。

但我的问题在这里。现在我无法做分页。如果我使用CLinkPager它可能。但是有没有其他方法可以创建我自己的DATAPROVIDER并在创建dataProvider时处理分页。

2 个答案:

答案 0 :(得分:2)

您可以直接设置CArrayDataProvider,如下所示:

$rawData=Yii::app()->db->createCommand('SELECT * FROM table')->queryAll(); //fetches array of associative arrays representing selected rows
            $dataProvider=new CArrayDataProvider($rawData, array(
                'id'=>'consumer', //this is an identifier for the array data provider
                'sort'=>false,
                'keyField'=>'id', //this is what will be considered your key field
                'pagination'=>array(
                    'pageSize'=>30, //eureka! you can configure your pagination from here
                ),
            ));

您现在可以在CListView或CGridView中使用$dataProvider,例如

$this->widget('zii.widgets.grid.CGridView',array(
    'id'=>'consumer-grid',
    'dataProvider'=>$data,
    'columns'=>array( // this array should include the attributes you want to display
        'id',
        'name',
        'additional_column_1',
    ),

));

CArrayDataProvider的潜力可以匹配满足您的标准需求而无需太多工作,尽管在某些情况下可能需要一些额外的工作来进行过滤和排序。您可以查看documentation page以了解详情。

答案 1 :(得分:1)

最后我得到了答案。是的,我可以通过扩展CDataProvider来创建我的自定义DataProvider。但我只需要实现三个功能

fetchData,fetchKeys,calculateTotalItemCount

最后,您需要根据需要将自己的逻辑编写到fetchData中。