На этот раз поговорим о том, как реализовать обратную пагинацию в yii 2.0 при помощи расширения loveorigami/yii2-reversed-pagination.
В случаях, когда большие и не очень объемы данных не помещаются на одной странице, пагинация помогает ориентироваться и переключаться между разными страницами данных. В общем случае, пагинатор нумерует страницы по порядку, начиная с первой.
Общее количество страниц можно вычислить по формуле:
[latex]\huge P=\frac{N}{n}[/latex], где:
- P — количество страниц;
- N — общее количество записей;
- n — число записей на страницу.
Обратная пагинация бывает удобна в некоторых случаях, например в блогах, старые записи всегда будут оставаться на страницах с одним номером, и ссылки в закладках пользователей никогда не потеряют актуальность — от этого в выигрыше все, и блогер и читатель. Первые записи на первых страницах, последние на последних, но отображение перечня страниц (так называемая пагинация) идет слева направо, от больших номеров к меньшим, он новых материалов к старым.
Реализация обратно пагинации не сильно сложна. Достаточно написать свои классы ReverseLinkPager и ReversePagination, расширяющие стандартные классы php-фреймворка yii 2.0 yii\widgets\LinkPager и yii\data\Pagination, соответственно. За тем использовать эти классы в представлении для вывода данных.
Конечно, в качестве упражнения каждому будет полезно собственноручно реализовать такой функционал, если он понадобился. Но только в целях обучения. Изобретать свой велосипед здесь не нужно.
Товарищ loveorigami уже изрядно попотел и выложил результат своей работы в виде расширения yii2-reversed-pagination. Его я и посоветую использовать всем, кому нужен результат без костылей.
Про установку рассказывать не буду, она описана в документации расширения.
Как подключить обратную пагинацию
Для обратной пагинации в yii2 нужно в контроллере использовать наше расширение вместо пагинатора по-умолчанию:
public function actionIndex()
{
$query = Article::find()->all();
$countQuery = clone $query;
$pages = new \loveorigami\pagination\ReversePagination(
[
'totalCount' => $countQuery->count(),
'pageSize' => 10, // or in config Yii::$app->params['pageSize']
]
);
$pages->pageSizeParam = false;
$models = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return $this->render('index',
[
'models' => $models,
'pages' => $pages,
]
);
}
и в представлении вывести виджет расширения:
foreach($models as $model):
// display a model...
endforeach;
echo \loveorigami\pagination\ReverseLinkPager::widget([
'pagination' => $pages,
'registerLinkTags' => true
]);
+1
Как оформить пагинацию, изменить стили?
Для отображения пагинации используется ненумерованный список с классом pagination. Используйте магию css для его стилизации.