Yii2 pagination

19

Від автора: вітаю вас, друзі. Ми продовжуємо цикл статей, присвячених знайомству з фреймворком Yii2. У цій статті ми з вами розглянемо питання Yii2 pagination, тобто використання посторінкової навігації на сайті.

Отже, в цій статті ми розглянемо роботу з посторінкової навігації на сайті і використовуємо для цього клас Pagination. Використання даного класу може нам знадобитися для користувача частини сайту в тих розділах, де присутні великі масиви даних. Наприклад, це може бути каталог товарів або стрічка новин і т. п. Відразу варто обмовитися, що в адмінської частині сайту, де використовуються віджети даних, можна використовувати провайдер даних і в цьому випадку буде автоматично сформована посторінкова розбиття даних. Проте, для користувача частини сайту віджети даних використовуються рідко і там простіше скористатися класом Pagination.

До прикладу, давайте виведемо всі пости нашого сайту. Для цього в контролері ми отримаємо їх і передамо до подання:

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

І в поданні виведемо дані з потрібним оформленням:

title ?>

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, який побудує посторінкову навігацію:

$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/’ => ‘post/index’,
‘post/’ => ‘post/index’,
],

Yii2 pagination

Після цього посилання пагинации повинні прийняти потрібне нам вигляд:

Yii2 pagination

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