Yii 2 содержит 3 типа провайдера данных:
Все 3 типа провайдера данных работают аналогично и взаимозаменяемы. Рассмотрим пример и по очереди будем использовать эти провайдеры. Предположим у нас есть модель News (новости), содержащая 4 поля title (Заголовок новости), text (Текст новости), author (автор новости) и datecreate (Дата создания новости). Выведем ленту новостей на сайт с использованием провайдеров данных.
// подключаем библиотеки use Yii; use app\models\News; use yii\data\SqlDataProvider; public function actionIndex() { // подсчитываем количество опубликованных новостей $totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM news WHERE publication=:publication', [':publication' => 1])->queryScalar(); // объявляем класс SqlDataProvider $dataProvider = new SqlDataProvider([ 'sql' => 'SELECT * FROM news WHERE publication=:publication', //запрос на выборку новостей 'params' => [':publication' => 1], // условие публикации 'totalCount' => $totalCount, // количество новостей // сортировка 'sort' => [ 'attributes' => [ 'header' => [ 'asc' => ['header' => SORT_ASC], // от А до Я 'desc' => ['header' => SORT_DESC], // от Я до А 'default' => SORT_DESC, // сортировка по умолчанию 'label' => 'Заголовок', // название ], 'author' => [ 'asc' => ['author' => SORT_ASC], 'desc' => ['author' => SORT_DESC], 'default' => SORT_DESC, 'label' => 'Автор', ], 'text' => [ 'asc' => ['text' => SORT_ASC], 'desc' => ['text' => SORT_DESC], 'default' => SORT_DESC, 'label' => 'Новость', ], 'datecreate' => [ 'asc' => ['datecreate' => SORT_ASC], 'desc' => ['datecreate' => SORT_DESC], 'default' => SORT_DESC, 'label' => 'Дата новости', ], ], ], 'pagination' => [ // постраничная разбивка 'pageSize' => 10, // 10 новостей на странице ], ]); // передача экземпляра класса в представление return $this->render('index',['dataProvider' =>$dataProvider]); }
Для вывода используем виджет GridView
// подключаем библиотеку use yii\grid\GridView; echo GridView::widget([ // полученные данные 'dataProvider' => $dataProvider, // Отображать 5 страниц 'pager' => ['maxButtonCount' => 5], // колонки с данными 'columns' => [ ['class' => 'yii\grid\SerialColumn'], [ 'label' =>"Заголовок", // название столбца 'attribute' => 'title', // атрибут 'value'=>function($data){return $data["title"];} // объявлена анонимная функция и получен элемент массива (заголовок) ], [ 'label' => 'Дата создания', 'attribute' => 'datecreate', 'value' => function($data) { return date("d.m.Y H:i", $data["datecreate"]); }, ], [ 'label' => 'Текст новости', 'attribute' => 'text', 'value' => function($data) { return $data["text"]; }, ], [ 'label' => 'Автор новости', 'attribute' => 'author', 'value' => function($data) { return $data["author"]; }, ], ['class' => 'yii\grid\ActionColumn'], ], ]);
// подключаем библиотеки use Yii; use app\models\News; use yii\data\ActiveDataProvider; public function actionIndex() { // объявляем класс ActiveDataProvider $dataProvider = new ActiveDataProvider([ 'query' => News::find()->where(['publication' => 1]), // Запрос на выборку опубликованных новостей 'sort' => [ // сортировка по умолчанию 'defaultOrder' => ['title' => SORT_DESC, 'datecreate' => SORT_DESC, 'author' => SORT_DESC, 'text' => SORT_DESC, ], ], 'pagination' => [ // постраничная разбивка 'pageSize' => 10, // 10 новостей на странице ], ]); // передача экземпляра класса в представление return $this->render('index',['dataProvider' =>$dataProvider]); }
Для вывода используем виджет GridView
// подключаем библиотеку use yii\grid\GridView; echo GridView::widget([ // полученные данные 'dataProvider' => $dataProvider, // Отображать 5 страниц 'pager' => ['maxButtonCount' => 5], // колонки с данными 'columns' => [ ['class' => 'yii\grid\SerialColumn'], [ 'label' =>"Заголовок", // название столбца 'attribute' => 'title', // атрибут 'value'=>function($data){return $data->title;} // объявлена анонимная функция и получен результат ], [ 'label' => 'Дата создания', 'attribute' => 'datecreate', 'value' => function($data) { return date("d.m.Y H:i", $data->datecreate); }, ], [ 'label' => 'Текст новости', 'attribute' => 'text', 'value' => function($data) { return $data->text; }, ], [ 'label' => 'Автор новости', 'attribute' => 'author', 'value' => function($data) { return $data->author; }, ], ['class' => 'yii\grid\ActionColumn'], ], ]);
// подключаем библиотеки use Yii; use yii\data\ArrayDataProvider; use yii\db\Query;
public function actionIndex() { // подключаем построитель запросов
$query = new Query;
// подключаем ArrayDataProvider $dataProvider = new ArrayDataProvider([ 'allModels' => $query->from('news')->where(['publication' => 1])->all(), // запрос на выборку новостей 'sort' => [ // подключаем сортировку 'attributes' => ['title', 'datecreater', 'author', 'text'], ], 'pagination' => [ //постраничная разбивка 'pageSize' => 10, // 10 новостей на странице ], ]); return $this->render('index',['dataProvider' =>$dataProvider]);
Для вывода используем виджет GridView
// подключаем библиотеку use yii\grid\GridView; echo GridView::widget([ // полученные данные 'dataProvider' => $dataProvider, // Отображать 5 страниц 'pager' => ['maxButtonCount' => 5], // колонки с данными 'columns' => [ ['class' => 'yii\grid\SerialColumn'], [ 'label' =>"Заголовок", // название столбца 'attribute' => 'title', // атрибут 'value'=>function($data){return $data["title"];} // объявлена анонимная функция и получен элемент массива (заголовок) ], [ 'label' => 'Дата создания', 'attribute' => 'datecreate', 'value' => function($data) { return date("d.m.Y H:i", $data["datecreate"]); }, ], [ 'label' => 'Текст новости', 'attribute' => 'text', 'value' => function($data) { return $data["text"]; }, ], [ 'label' => 'Автор новости', 'attribute' => 'author', 'value' => function($data) { return $data["author"]; }, ], ['class' => 'yii\grid\ActionColumn'], ], ]);