Yii2: Обратная пагинация

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

3 thoughts on “Yii2: Обратная пагинация

    1. nix Автор записи

      Для отображения пагинации используется ненумерованный список с классом pagination. Используйте магию css для его стилизации.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *