10. Пагинация постов. Блог на PHP

20 Июня 2021

Какие темы мы разберем

В 10. Пагинация постов - Блог на PHP, уроке мы рассмотрим следующие темы:

  • Создадим функцию getTotalCount() для получения общего количества постов в базе данных
  • Добавим параметры для обработки разных страниц

Приятного просмотра:

В рамках урока, мы напишем следующий код.

Обновленный обработчик для /blog/{page} добавим в файл index.php. В шаблон blog.twig передадим параметр pagination, в котором будет текущая страница и шаг страницы.

$app->get('/blog[/{page}]', 
    function (Request $request, Response $response, $args) 
    use ($view, $connection) {
    $postMapper = new PostMapper($connection);

    $page = isset($args['page']) ? (int) $args['page'] : 1;
    $limit = 2;

    $posts = $postMapper->getList($page, $limit, 'DESC');

    $totalCount = $postMapper->getTotalCount();
    $body = $view->render('blog.twig', [
        'posts' => $posts,
        'pagination' => [
            'current' => $page,
            'paging' => ceil($totalCount / $limit),
        ],
    ]);
    $response->getBody()->write($body);
    return $response;
});

Добавим новый метод getTotalCount() в класс PostMapper.

public function getTotalCount(): int
{
    $statement = $this->connection->prepare(
        'SELECT count(post_id) as total FROM post'
    );

    $statement->execute();

    return (int) ($statement->fetchColumn() ?? 0);
}

В шаблоне blog.twig необходимо передать параметр pagination для шаблона section/navigation.twig.

{% include 'section/pagination.twig' with pagination %}

И статический шаблон section/pagination.twig перепишем с использованием нового параметра pagination.

<nav aria-label="Blog pagination">
    <ul class="pagination">
        {% if pagination.current > 1 %}
        <li class="page-item">
            <a class="page-link" 
               href="{{ url('blog/' ~ (pagination.current - 1)) }}"
            >Previous</a>
        </li>
        {% endif %}
        {% for page in 1..pagination.paging %}
        <li class="page-item {% if pagination.current == page %} active {% endif %}">
            <a class="page-link" 
               href="{{ url('blog/' ~ page) }}"
            >{{ page }}</a>
        </li>
        {% endfor %}
        {% if pagination.current < pagination.paging %}
        <li class="page-item">
            <a class="page-link" 
               href="{{ url('blog/' ~ (pagination.current + 1)) }}"
            >Next</a>
        </li>
        {% endif %}
    </ul>
</nav>

Скачать код данного урока можно по ссылке.


Макс Пронько

Макс Пронько - Программист, CEO компании Pronko Consulting, пишет о Веб разработке. Автор YouTube канала о разработке. Телеграм группа сайта.

© 2021 Макс Пронько. Все права защищены. Я использую Gatsby и Netlify