Программирование, веб-кодинг

Постраничная навигация (pagination) в Yii2 и Yii1

Постраничная навигация (pagination) в Yii2 и Yii1

Пагинация в Yii2

Когда записей выбирается из базы данных много, то в Yii предусмотрено постраничное разбиение.

Подключаем в контроллере класс для пагинации

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

В Yii2 появился pageSizeParam, который в $_GET запросе передает установленный pageSize и его можно обрабатывать из $_GET запроса. Отключается строкой $pages->pageSizeParam = false;

В виде

// подключаем виджет постраничной разбивки
use yii\widgets\LinkPager;
// проходим цикл по данным модели, тут упрощённо, у вас может быть сложнее html-оформление
foreach ($models as $model) {
    // выводим название организации (пример)
    echo $model->name;
}
// отображаем постраничную разбивку
echo LinkPager::widget([
    'pagination' => $pages,
    'registerLinkTags' => true
]);

registerLinkTags - параметр, прописывает в хедер ссылки на текущую, предыдущую и следующую страницы. По-умолчанию он выключен в false, чтобы не было конфликтов, если у вас несколько пагинаций на одной странице. Нам это пока не грозит, поэтому включаем. Если вы используете включение пагинации сразу в виде и с настройками по-умолчанию, то там тоже можно задавать эти настройки.

<?= ListView::widget([
            'dataProvider' => $dataProvider,
            'itemOptions' => ['class' => 'item'],
            'itemView' => '_view',
            'layout' => '{items}{pager}',
            'pager' => ['registerLinkTags' => true],
        ]) ?>


Пагинация в Yii1

Для Yii1 в контроллере

$criteria = new CDbCriteria();
...
$count = Post::model()->count($criteria);
$pages=new CPagination($count);
$pages->pageSize = Yii::app()->params['per_page'];
$pages->applyLimit($criteria);
$post = Post::model()->findAll($criteria);
$this->render('index',
     array(
         'post'      => $post,
         'paginator' => $pages,
        ));

Создаем критерии выборки. С помощью метода count(), считаем сколько записей выбирутся по этим критериям. Создаем объект пагинации и передаем ему общее число записей $count. Устанавливаем количество записей на странице (pageSize) и применяем пагинатор к нашим критериям. В этот момент в критерии добавятся limit и offset в зависимости от текущей старницы (приватная переменная объекта CPagination $_currentPage устанавливается в зависимости от $_GET параметра, задаваемого переменной $pageVar и по умолчанию равного ‘page’). В Yii2 теперь критерии limit и offset мы устанавливаем сами явно.

В представлении используем виджет пагинатора так

<?php
    $this->widget('CLinkPager', array(
        'pages' => $paginator,
        'htmlOptions'=> array('class'=>'pagination'),
    ))
?>


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();    


Ещё читать источник: http://developer.uz/blog/pagination-in-yii2-and-in...

По мотивам – http://www.webapplex.ru/postranichnaya-navigacziya-v-yii-2.x