Содержание
Производительность является важной особенностью каждого веб-приложения. Одной из самых необходимых вещей в приложениях, которые обрабатывают большие наборы данных, является реализация нумератора страниц. Таким образом, пользователь может перемещаться по сбору данных, не загружая тысячи элементов одновременно. В Symfony 3 KnpPaginatorBundle является идеальным решением, когда вы работаете с Doctrine, однако с появлением Symfony 4 установка и настройка этой утилиты не были хорошо документированы, и большинство разработчиков в конечном итоге реализуют другой пакет ради простота. Но не волнуйтесь, установка этого комплекта будет легкой задачей, если вы будете следовать нашим шагам. KnpPaginatorBundle может разбивать на страницы:
array
Doctrine\ORM\Query
Doctrine\ORM\QueryBuilder
Doctrine\ODM\MongoDB\Query\Query
Doctrine\ODM\MongoDB\Query\Builder
Doctrine\ODM\PHPCR\Query\Query
Doctrine\ODM\PHPCR\Query\Builder\QueryBuilder
Doctrine\Common\Collection\ArrayCollection
— любая коллекция отношений доктрины, включаяModelCriteria
— Выполнить запрос ORM- массив с
Solarium_Client
а такжеSolarium_Query_Select
как элементы
В этой статье мы покажем вам, как установить широко известный KnpPaginatorBundle в ваш проект на основе Symfony 4.
1. Установите и настройте KnpPaginatorBundle
KnpPaginatorBundle — это пакет для Symfony, который позволяет вам использовать SEO-дружественный пагинатор Symfony для разбивки на страницы. Эта утилита:
- Не требует инициализации определенных адаптеров
- Может быть настроен любым необходимым способом и т. Д .: просмотр страниц, подписчики событий.
- Возможность добавления настраиваемой фильтрации, сортировки в зависимости от параметров запроса.
- Разделяя проблемы, paginator отвечает только за создание представления разбивки на страницы, представление разбивки на страницы — для целей представления.
Чтобы установить его в свой проект Symfony, вы можете установить его последнюю версию с помощью composer, используя следующую команду:
composer require knplabs/knp-paginator-bundle
Это установит пакет и автоматически зарегистрирует его на app/config/bundles.php
файл. Для получения дополнительной информации об этом пакете, пожалуйста, посетите официальный репозиторий на Github здесь.
После установки пакета вам нужно всего лишь создать файл конфигурации paginator в каталоге app / config / packages. Этот файл является knp_paginator.yaml
который содержит конфигурацию этой утилиты. Конфигурация зависит от вас, но вы можете использовать конфигурацию по умолчанию, представленную в документации:
# config/packages/paginator.yaml
knp_paginator:
page_range: 5 # number of links showed in the pagination menu (e.g: you have 10 pages, a page_range of 3, on the 5th page you'll see links to page 4, 5, 6)
default_options:
page_name: page # page query parameter name
sort_field_name: sort # sort field query parameter name
sort_direction_name: direction # sort direction query parameter name
distinct: true # ensure distinct results, useful when ORM queries are using GROUP BY statements
filter_field_name: filterField # filter field query parameter name
filter_value_name: filterValue # filter value query paameter name
template:
pagination: '@KnpPaginator/Pagination/sliding.html.twig' # sliding pagination controls template
sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link template
filtration: '@KnpPaginator/Pagination/filtration.html.twig' # filters template
Сохраните файл, очистите кеш вашего проекта.
2. Настройте Paginator в контроллере
Как только плагин установлен и настроен, его использование довольно просто. Просто убедитесь, что ваши контроллеры расширяют Symfony\Bundle\FrameworkBundle\Controller\Controller
класс, поскольку это тот, который позволяет вам получить доступ к нескольким службам с помощью метода get класса. Просто создайте экземпляр paginator и сохраните его в переменной, затем создайте некоторый запрос Doctrine (важный запрос, а не результаты), а затем вызовите метод paginate из paginator и предоставьте его 3 обязательных аргумента:
- Запрос доктрины
- Текущая страница, определенная параметром get «page» и устанавливающая первую страницу по умолчанию, когда этот параметр не существует.
- Лимит элементов на страницу.
Вам нужно перебрать возвращенный элемент метода paginate. Этот объект содержит результаты вашего запроса с ограничением результатов и другими свойствами, к которым вы можете обратиться позже в представлении:
getDoctrine()->getManager();
// Get some repository of data, in our case we have an Appointments entity
$appointmentsRepository = $em->getRepository(Appointments::class);
// Find all the data on the Appointments table, filter your query as you need
$allAppointmentsQuery = $appointmentsRepository->createQueryBuilder('p')
->where('p.status != :status')
->setParameter('status', 'canceled')
->getQuery();
/* @var $paginator \Knp\Component\Pager\Paginator */
$paginator = $this->get('knp_paginator');
// Paginate the results of the query
$appointments = $paginator->paginate(
// Doctrine Query, not results
$allAppointmentsQuery,
// Define the page parameter
$request->query->getInt('page', 1),
// Items per page
5
);
// Render the twig view
return $this->render('default/index.html.twig', [
'appointments' => $appointments
]);
}
}
Теперь, когда вы возвращаете результат разбивки на страницы, вы можете получить доступ к этому объекту в представлении Twig, которое будет отображаться как ответ этого действия в нашем контроллере.
3. Создайте paginator в виде Twig
Как показано на предыдущем шаге, мы отправили объект разбивки на страницы в представление Twig, которое отображает наш ползунок разбивки на страницы и элементы. В нашем примере содержимое нашего представления Twig следующее:
{# ./templates/default/index.html.twig #}
My Application
{% for appointment in appointments %}
-
{{ appointment.title }}
{% endfor %}
{{ knp_pagination_render(appointments) }}
Это создаст список из 5 элементов на каждой странице, как указано в нашем контроллере. knp_pagination_render
Функция отображает слайдер со всеми доступными страницами элементов. При нажатии на каждую сгенерированную ссылку также будет использоваться тот же URL со всеми его параметрами запроса и новый параметр, а именно страница, которая указывает нашему контроллеру, какие элементы возвращать в представление.