Бортовой журнал Ктулху

Постраничная навигация в Yii2

После того как сделана выборка, например, статей из, например, блога, неплохо было бы разбить вывод на страницы для снижения нагрузки на сайт.

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

use yii\data\Pagination;

Далее в контроллере, где нужное действие, описываем ещё и пагинацию

function actionIndex()
{
// выполняем запрос
$query = Companies::find()->where(['status' => 1]);
// делаем копию выборки
$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,
]);
}

В этом примере кода у меня не проконало клонирование, пришлось сделать два запроса, один с count() а второй с выборкой.

// посчитать все статьи
$countQuery = Content::find()
 ->where(['status' => 1])->count();
// сделать выборку
$category = Content::find()
 ->where(['status' => 1])
 ->offset($pages->offset)
 ->limit($pages->limit)
 ->all();

В Yii2 появился pageSizeParam, который в $_GET запросе передает установленный pageSize и его можно обрабатывать из $_GET запроса.

Отключается строкой $pages->pageSizeParam = false;

В виде (view):

// подключаем виджет постраничной разбивки
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],
]) ?>