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