28
Сен
2017

Yii2 pagination

Yii2 pagination

От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы с вами рассмотрим вопрос Yii2 pagination, т.е. использование постраничной навигации на сайте.

Итак, в этой статье мы рассмотрим работу с постраничной навигацией на сайте и используем для этого класс Pagination. Использование данного класса может нам потребоваться для пользовательской части сайта в тех разделах, где присутствуют большие массивы данных. Например, это может быть каталог товаров или лента новостей и т.п. Сразу стоит оговориться, что в админской части сайта, где используются виджеты данных, можно использовать провайдер данных и в этом случае будет автоматически сформирована постраничная разбивка данных. Однако, пользовательской части сайта виджеты данных используются редко и там проще воспользоваться классом Pagination.

К примеру, давайте выведем все посты нашего сайта. Для этого в контроллере мы получим их и передадим в представление:

public function actionIndex()
{
    $posts = Post::find()->all();
    return $this->render('index', compact('posts'));
}

И в представлении выведем данные с нужным оформлением:

<?php foreach($posts as $post): ?>
    <div class="panel panel-default">
        <div class="panel-heading"><?= $post->title ?></div>
    </div>
<?php endforeach; ?>

Yii2 pagination

В результате мы получили вывод наименований всех имеющихся статей. Сейчас статей немного, всего 21 в моем случае. А представьте, если их будет сотня или тысяча? Или еще больше? В этом случае пользователь получит длиннющую страницу со всеми статьями. А если статей достаточно большое количество, то такая страница будет загружаться очень долго.

Вот для таких случаев как раз и необходима постраничная разбивка данных, когда на первой странице представлена первая «порция» данных, а на следующие «порции» мы даем ссылки в виде постраничной навигации (пагинации).

Давайте немного перепишем код получения данных, обратившись к классу Pagination.

public function actionIndex()
{
    //$posts = Post::find()->all();
    $query = Post::find();
    $pages = new Pagination(['totalCount' => $query->count()]);
    $posts = $query->offset($pages->offset)
        ->limit($pages->limit)
        ->all();
    return $this->render('index', compact('posts', 'pages'));
}

В представление добавим использование виджета LinkPager, который построит постраничную навигацию:

<?= LinkPager::widget([
    'pagination' => $pages,
]); ?>

И в итоге мы получим теперь только часть данных (по умолчанию это 20 записей), а следующие части будут доступны по ссылкам сгенерированной постраничной навигации.

Yii2 pagination

Поскольку у меня количество записей – 21, а по умолчанию класс Pagination выбирает по 20 записей на страницу, — мы получили две страницы: на первой странице выводятся первые 20 записей, на второй – оставшаяся последняя. Давайте попробуем немного настроить пагинацию. Например, 20 записей на страницу может быть достаточно много, давайте уменьшим это число до 5 записей на страницу. Для этого используем параметр pageSize с необходимым значением:

$pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 5]);

Yii2 pagination

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

Yii2 pagination

Давайте попробуем добиться такого варианта — http://yii2/post/page/2. Для этого добавим еще пару параметров к настройкам:

$pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 5, 'forcePageParam' => false, 'pageSizeParam' => false]);

И пару правил для маршрутов в файл config/web.php:

'rules' => [
    'post/page/<page:\d+>' => 'post/index',
    'post/' => 'post/index',
],

Yii2 pagination

После этого ссылки пагинации должны принять нужным нам вид:

Yii2 pagination

На этом сегодня все. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.

Share

Тебе может это понравится...