Как создать пагинацию для записей в Drupal 8?

Все хорошо и удобно сделано в drupal. Можно легко научиться работать с нодами из кода. Сейчас будем разбираться, как создать пагинацию для нод и других сущностей в Drupal 8. Это для случая, когда нод/сущностей становится слишком много и нужно их выборку разбить на подстраницы с адресом [site url]/page/1..N.

В предыдущих моих статьях мы создали собственный модуль b83 и сущность Example.

Таблица сущности Example в БД у нас уже есть. Давайте заполним ее тестовыми данными.

Для этого создадим файл b83.install в директории модуля b83.

Здесь мы создали функцию b83_update_8101(), т.е. вызываем хук drupal — hook_update_N. В этой функции мы подключаемся к хранилищу сущностей example, а затем при помощи метода create() заполняем столбцы таблицы example.

Что здесь надо иметь ввиду. Поскольку мы создаем новые сущности типа Example, нет необходимости указывать id и uuid — они и так будут уникальными ключами.

Также мы не заполняем поля created, поскольку это поле в классе сущности мы определили в BaseFieldDefinition его как created. Поэтому при создании сущности в него будет автоматически подставлен текущая дата timestamp.

Теперь нам необходимо из-под админа перейти по адресу: [site url]/update.php . Далее мы проходим по шагам этого мастера и в итоге получаем заполненную 34 новыми строками таблицу examples.

Теперь создадим в папке модуля b83/src/Controller файл контроллера Test.php с методом content(), который будет выводить страницу с пагинацией:

В начале при помощи метода aggregate() интерфейса entityQueryAggregate мы подсчитываем общее количество строк в таблице example. Далее при помощи сервиса pager.manager мы создаем pager и получаем номер текущей страницы. $num_per_page — количество записей на странице, а $offset — смещение относительно начала выборки базы данных в методе select.

При помощи интерфейса entityQuery мы получаем id записей с учетом смещения и количества записей на странице, отсортированных в нужном нам порядке. По сути, это аналог записи SELECT id FROM example ORDER BY id ASC LIMIT $offset, $num_per_page .

Теперь в цикле мы при помощи хранилища entityTypeManager загружаем поочередно сущности методом load() и формируем массив $rows. Для формата даты я использую \Drupal::service('date.formatter')->format(). Значения полей таблицы example получаем так: $example->order_total->value .

Я не стал создавать шаблон темы для этого примера. Воспользовался стандартным рендер-массивом '#theme' => 'table', который автоматически генерирует таблицы с заголовками и строками данных.

Теперь осталось вывести pager и собственно саму таблицу данных.

Так, контроллер готов. Сейчас нам надо сделать маршрут для новой страницы.

В директории модуля создадим файл b83.routing.yml :

Здесь:

path: url страницы
_controller: путь до метода контроллера, который будет отвечать за рендеринг содержимого контента страницы
_title: заголовок страницы
_permission: имя разрешения для просмотра данной страницы

Коль уж мы создали разрешение drupal, давайте создадим в директории модуля и файлик b83.permissions.yml :

Если захотите настроить права доступа для разных ролей — можете это сделать на странице [site url]/admin/people/permissions .

На этом все. Проверяем работу. Модуль b83 должен быть включен в админке. Также можно сбросить кэш, к примеру через команду linux — drush cr или также из админки.

Если все ОК, то при открытии страницы [site url]/my-test-page вы увидите что-то похожее на:

создание пагинации drupal 8

Для удобства выкладываю вам [исходники] этой статьи.

Надеюсь, вам было интересно. Пишите комментарии, ставьте рейтинг сегодняшней статье. На этом пока все.

Щелкните ниже, чтобы поставить оценку!
Всего: 0 В среднем: 0

Написать комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

шестнадцать − шесть =