Пагинация

Главные вкладки

Аватар пользователя mmjmm mmjmm 31 марта 2022 в 17:41

Здравствуйте.
У меня на некоторой странице(контроллере) выводится информация из созданной мной таблицы БД.
На этой странице мне нужно создать пагинацию (постраничную навигацию) средствами Друпал, уже готовым pager, например, что бы выводилось по 10 записей на странице.
Подскажите, пожалуйста, каким образом это можно сделать?

Комментарии

Аватар пользователя OldWarrior OldWarrior 31 марта 2022 в 17:55
1
<?php
...
$connection = \Drupal::service('database');
$query $connection->select('MY_TABLE''MY_TABLE_ALIAS')->fields('MY_TABLE_ALIAS');
...
$query->orderBy('MY_FIELD''DESC');
...
// Здесь limit(40) - кол-во рядов на страницу.
$pager  $query->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit(40);
$result $pager->execute()->fetchAll(\PDO::FETCH_ASSOC);

foreach (

$result as $index => $row) {
  
// Что-то делаем с полученными рядами...
}

// Магия, добавляем в $build пейджер. Может быть и $form. 
// Короче - используемый рендер-массив.
$build['pager'] = [
  
'#type'   => 'pager',
  
'#weight' => 100,
];
...
return 
$build;
...
?>
Аватар пользователя mmjmm mmjmm 1 апреля 2022 в 7:07

Сработало, если ввожу в адресную строку , например, page=1, выводится вторая часть лимита данных. Все хорошо.
Но как создать визуальную навигацию страниц?

Аватар пользователя OldWarrior OldWarrior 1 апреля 2022 в 12:49
1

usms6@yandex.ru wrote: Но как создать визуальную навигацию страниц?

Я же написал выше:

<?php
...
// Магия, добавляем в $build пейджер. Может быть и $form. 
// Короче - используемый рендер-массив.
$build['pager'] = [
  
'#type'   => 'pager',
  
'#weight' => 100,
];
...
?>

Больше ничего не нужно. Формируемый таким образом стандартный пейджер сам распознаёт текущую страницу и общее кол-во страниц. Возможно, только $build нужно заменить на переменную с вашим рендер-массивом. И обязательно, разумеется, нужно вернуть этот массив из вашего метода контроллера или формы.

Аватар пользователя marassa marassa 1 апреля 2022 в 7:34

Реализация средствами Друпал отдельных произвольных кусков сайта - это говнокодинг неправильный путь. Правильный - вывести Вашу кастомную таблицу средствами Views с помощью, например, модуля Views database connector. Тогда не будут возникать вопросы как сделать пагинацию, как сделать сортировку, как сделать фильтрацию и т.д. и т.п.
Ещё более правильный путь - не создавать свою таблицу мимо Друпал, а хранить Ваши данные в виде сущностей Друпал.

Аватар пользователя mmjmm mmjmm 1 апреля 2022 в 11:56

В данном случае создано вручную много взаимосвязаных таблиц в БД.
Моя задача сейчас - работать с записями таблиц не как с сущностями.
Поэтому приходится делать так.
И я не знаю, как вывести нумерацию страниц для перехода между ними.

Аватар пользователя marassa marassa 1 апреля 2022 в 12:02

Ну если уж так нравится всё делать вручную, то какая проблема вручную на php сформировать кнопочки с соответствующими ссылками на page=N?

Аватар пользователя mmjmm mmjmm 1 апреля 2022 в 12:16

Вот я интересуюсь, есть ли для этого соответствующие модули друпал или вручную прописать только в таком случае?