【问题标题】:How to create my own DataProvider in Yii using CDataProvider?如何使用 CDataProvider 在 Yii 中创建我自己的 DataProvider?
【发布时间】:2014-07-07 12:31:47
【问题描述】:

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

$rawData = $sqldp->getData();

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

$modRawData = 修改($rawData);

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

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

【问题讨论】:

    标签: php yii pagination dataprovider


    【解决方案1】:

    您可以直接设置 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 以了解更多信息。

    【讨论】:

    • 通过这种方法,我将无法使用 CGridView 的分页。相反,我将不得不编写一个 CLinkPager。我不想做的。另外我想在从数据库中获取数据后做一些处理。认为您应该先阅读问题。
    • 介意我从数据库中获取数据后的处理性质吗?
    • @Danila Ganchar $criteria=new CDbCriteria(); $count = count(Yii::app()->db->createCommand($query)->queryAll()); $pages=new CPagination($count); $pages->pageSize=10; $pages->applyLimit($criteria); $providerreports = Yii::app()->db->createCommand($query)->queryAll($criteria);这是在我能够创建分页的帮助下的代码,但现在的问题是所有记录都显示在一页上。就像如果有 200 条记录,那么所有 200 条记录都显示在第一页,但根据代码应该只显示 10 条记录
    • @Danila Ganchar 这是我的视图代码:- widget('CLinkPager', array( 'pages' => $pages, )) ?>
    【解决方案2】:

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

    fetchData、fetchKeys、calculateTotalItemCount

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

    【讨论】:

    • 您能否提供一些链接,说明如何在使用分页和 CSort 时扩展 CDataProvider 和实现 fetchData?
    • 发现source of CDataProvider 本身有很好的文档记录并且很好地解释了这个过程。
    猜你喜欢
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 2020-03-24
    • 1970-01-01
    相关资源
    最近更新 更多