Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Постраничный вывод

Когда статей становится сотни, выводить их одним списком нельзя: страница грузится долго и неудобна. Постраничный вывод (пагинация) делит список на страницы по несколько записей и добавляет ссылки для перехода между ними. В 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, как в первом примере.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.