От автора: приветствую вас, друзья. Мы продолжаем цикл статей, посвященных знакомству с фреймворком Yii2. В этой статье мы с вами рассмотрим вопрос Yii2 pagination, т.е. использование постраничной навигации на сайте.
Итак, в этой статье мы рассмотрим работу с постраничной навигацией на сайте и используем для этого класс Pagination. Использование данного класса может нам потребоваться для пользовательской части сайта в тех разделах, где присутствуют большие массивы данных. Например, это может быть каталог товаров или лента новостей и т.п. Сразу стоит оговориться, что в админской части сайта, где используются виджеты данных, можно использовать провайдер данных и в этом случае будет автоматически сформирована постраничная разбивка данных. Однако, пользовательской части сайта виджеты данных используются редко и там проще воспользоваться классом Pagination.
К примеру, давайте выведем все посты нашего сайта. Для этого в контроллере мы получим их и передадим в представление:
1 2 3 4 5 |
public function actionIndex() { $posts = Post::find()->all(); return $this->render('index', compact('posts')); } |
И в представлении выведем данные с нужным оформлением:
1 2 3 4 5 |
<?php foreach($posts as $post): ?> <div class="panel panel-default"> <div class="panel-heading"><?= $post->title ?></div> </div> <?php endforeach; ?> |
В результате мы получили вывод наименований всех имеющихся статей. Сейчас статей немного, всего 21 в моем случае. А представьте, если их будет сотня или тысяча? Или еще больше? В этом случае пользователь получит длиннющую страницу со всеми статьями. А если статей достаточно большое количество, то такая страница будет загружаться очень долго.
Вот для таких случаев как раз и необходима постраничная разбивка данных, когда на первой странице представлена первая «порция» данных, а на следующие «порции» мы даем ссылки в виде постраничной навигации (пагинации).
Давайте немного перепишем код получения данных, обратившись к классу Pagination.
1 2 3 4 5 6 7 8 9 10 |
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, который построит постраничную навигацию:
1 2 3 |
<?= LinkPager::widget([ 'pagination' => $pages, ]); ?> |
И в итоге мы получим теперь только часть данных (по умолчанию это 20 записей), а следующие части будут доступны по ссылкам сгенерированной постраничной навигации.
Поскольку у меня количество записей – 21, а по умолчанию класс Pagination выбирает по 20 записей на страницу, — мы получили две страницы: на первой странице выводятся первые 20 записей, на второй – оставшаяся последняя. Давайте попробуем немного настроить пагинацию. Например, 20 записей на страницу может быть достаточно много, давайте уменьшим это число до 5 записей на страницу. Для этого используем параметр pageSize с необходимым значением:
1 |
$pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 5]); |
Отлично, работает! Давайте попробуем походить по страницам и убедимся, что пагинация работает. Она работает, но вот URL в адресной строке возможно вы захотите поменять. По умолчанию он выглядит примерно так:
Давайте попробуем добиться такого варианта — //yii2/post/page/2. Для этого добавим еще пару параметров к настройкам:
1 |
$pages = new Pagination(['totalCount' => $query->count(), 'pageSize' => 5, 'forcePageParam' => false, 'pageSizeParam' => false]); |
И пару правил для маршрутов в файл config/web.php:
1 2 3 4 |
'rules' => [ 'post/page/<page:\d+>' => 'post/index', 'post/' => 'post/index', ], |
После этого ссылки пагинации должны принять нужным нам вид:
На этом сегодня все. Больше о фреймворке вы можете узнать из наших бесплатных или платных уроков. Также создание простейшего блога на Yii2 можно посмотреть в этом цикле уроков.