Постраничный вывод
Когда статей становится сотни, выводить их одним списком нельзя: страница грузится долго и неудобна. Постраничный вывод (пагинация) делит список на страницы по несколько записей и добавляет ссылки для перехода между ними. В CodeIgniter он встроен в модель.
Метод paginate
Замените в контроллере findAll() на paginate():
// app/Controllers/Posts.php
public function index(): string
{
$posts = model(PostModel::class);
return view('posts/index', [
'posts' => $posts->orderBy('id', 'DESC')->paginate(10),
'pager' => $posts->pager,
]);
}paginate(10) возвращает десять записей нужной страницы. Номер страницы модель сама читает из адреса: /posts?page=2. Свойство $posts->pager — объект, который знает, сколько всего страниц, и умеет рисовать ссылки.
Ссылки в шаблоне
<!-- app/Views/posts/index.php -->
<ul>
<?php foreach ($posts as $post): ?>
<li><?= esc($post['title']) ?></li>
<?php endforeach ?>
</ul>
<?= $pager->links() ?>Под списком появится ряд ссылок с номерами страниц. Откройте /posts и нажмите «2» — адрес станет /posts?page=2, а список покажет следующие десять статей.
Простые ссылки
Вместо номеров можно вывести только «назад» и «вперёд»:
<nav class="pager">
<?= $pager->simpleLinks() ?>
</nav>Сведения о страницах
| Метод | Что возвращает |
|---|---|
$pager->getCurrentPage() | Номер текущей страницы |
$pager->getPageCount() | Число страниц |
$pager->getTotal() | Общее число записей |
$pager->getPerPage() | Число записей на странице |
Например, строка <p>Страница <?= $pager->getCurrentPage() ?> из <?= $pager->getPageCount() ?></p> выведет «Страница 2 из 5».
Вместе с условиями
paginate() стоит в конце цепочки, как findAll(), и учитывает все условия:
$posts = model(PostModel::class);
$list = $posts->where('status', 1)
->orderBy('created_at', 'DESC')
->paginate(10);Число страниц считается только по опубликованным статьям.
Настройки
Настройки лежат в app/Config/Pager.php. Свойство $perPage задаёт число записей по умолчанию — тогда paginate() можно вызывать без аргумента. Свойство $templates перечисляет шаблоны ссылок:
// app/Config/Pager.php
public array $templates = [
'default_full' => 'CodeIgniter\Pager\Views\default_full',
'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
'blog' => 'App\Views\pagers\blog',
];
public int $perPage = 10;Чтобы изменить разметку ссылок, скопируйте встроенный шаблон default_full.php из папки vendor/codeigniter4/framework/system/Pager/Views в app/Views/pagers/blog.php, поправьте в нём теги и классы и вызовите $pager->links('default', 'blog').
Частая ошибка
Свойство pager заполняется только после вызова paginate() на том же объекте модели. Если записи получены через findAll() или pager взят у другого объекта, созданного через new PostModel(), шаблон упадёт с ошибкой «Call to a member function links() on null». Сохраните модель в переменную, вызовите у неё paginate() и у неё же возьмите pager, как в первом примере.