Постраничная навигация в Yii 2.x

Продолжаем цикл статей, посвященных второй версии 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,
]);

Постраничная навигация, используя SqlDataProvider

Описываем действие в контроллере:

    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'],
        ],
    ]); 

AJAX постраничная разбивка

Поставим задачу перезагружать не всю страницу, а только конкретную область. Для этого добавим класс 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, надеюсь они будут для вас полезными!