Как создать собственный DataProvider в Yii с помощью CDataProvider?

Я в такой ситуации, как показано ниже. Я извлекаю некоторые данные, используя CSqlDataProvider и его разбиение на страницы (размер страницы), которые внутренне используют ограничение и смещение. И после этого я получаю

$ rawData = $ sqldp-> getData ();

Теперь мне нужно сделать некоторую обработку и добавить дополнительные данные. Так что теперь я получаю

$ modRawData = модификация ($ rawData);

Теперь, если я создаю один CArrayDataProvider, чтобы преобразовать его в Dataprovider, чтобы я мог использовать CListView.

Но моя проблема здесь. Теперь я не могу сделать разбивку на страницы. Если я использую CLinkPager, это возможно. Но есть ли другой способ, чтобы я мог создать свой собственный DATAPROVIDER и может обрабатывать разбиение на страницы при создании dataProvider.

Вы можете установить 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 ), )); 

и теперь вы можете использовать свой $dataProvider в CListView или CGridView, например

 $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 может соответствовать вашим стандартным потребностям без большой работы, хотя в некоторых случаях может потребоваться дополнительная работа по фильтрации и сортировке. Вы можете проверить его страницу документации, чтобы узнать больше.

Наконец я получил ответ. И да, я могу создать свой собственный DataProvider, расширив CDataProvider. Но мне нужно было реализовать только три функции

fetchData, fetchKeys, calculateTotalItemCount

И, наконец, вам нужно написать свою собственную логику в fetchData по своему усмотрению.