Продолжаем цикл статей, посвященных второй версии Yii фремворка. Сегодня рассмотрим постраничную навигацию. Если запрос возвращает множество данных, то у yii фремворка есть виджет постраничной навигации. Для разбиения на страницы, мы должны отправить на страницу некоторые данные и их общее количество элементов, размер страницы(количество записей на странице), текущая страница и т. д.
Рассмотрим пример простой постраничной навигации. Для этого будем использовать класс Pagination
Подключаем класс:
use yii\data\Pagination;
Описываем действие в контроллере:
function actionIndex() { // выполняем запрос $query = Companies::find()->where(['status' => 3]); // делаем копию выборки $countQuery = clone $query; // подключаем класс Pagination, выводим по 10 пунктов на страницу $pages = new Pagination(['totalCount' => $countQuery->count(), 'pageSize' => 10]); // приводим параметры в ссылке к ЧПУ $pages->pageSizeParam = false; $models = $query->offset($pages->offset) ->limit($pages->limit) ->all(); // Передаем данные в представление return $this->render('index', [ 'models' => $models, 'pages' => $pages, ]); }
В представление вставляем следующий код
// подключаем виджет постраничной разбивки use yii\widgets\LinkPager; // проходим цикл по данным модели foreach ($models as $model) { // выводим название организации (пример) echo $model->name; } // отображаем постраничную разбивку echo LinkPager::widget([ 'pagination' => $pages, ]);
Описываем действие в контроллере:
public function actionIndex() { // подсчитываем общее количество пунктов $totalCount = Yii::$app->db->createCommand('SELECT COUNT(*) FROM Companies Where status=:status', [':status' => 3])->queryScalar(); // выполняем запрос $sql = 'SELECT COUNT(*) FROM Companies Where status=:status'; $dataProvider = new SqlDataProvider([ 'sql' => $sql, 'params' => [':status' => 3], 'totalCount' => (int)$totalCount, 'pagination' => [ // количество пунктов на странице 'pageSize' => 10, ] ]); // передача данных в представление return $this->render('index', ['dataProvider' => $dataProvider]); }
Выводим данные в представлении:
// подключаем класс use yii\grid\GridView; echo GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'name', 'city' 'address', //..... ['class' => 'yii\grid\ActionColumn'], ], ]);
Поставим задачу перезагружать не всю страницу, а только конкретную область. Для этого добавим класс Pjax и рассмотрим код представления
// подключаем класс таблицы use yii\grid\GridView; // подключаем класс Pjax use yii\widgets\Pjax; // Начало блока Pjax Pjax::begin(); echo GridView::widget([ 'dataProvider' => $dataProvider, 'columns' => [ ['class' => 'yii\grid\SerialColumn'], 'id', 'name', 'city' 'address', //..... ['class' => 'yii\grid\ActionColumn'], ], ]); // конец блока Pjax Pjax::end();
Итак, сегодня мы рассмотрели основные примеры c комментариями постраничной разбивки в Yii 2.x, надеюсь они будут для вас полезными!