Задача: есть страница-форма, где выводятся какие-то данные. Нужно выводить эти данные постранично. 95% мануалов из гугла научат вас как сделать пейджер прямо в SQL запросе, но что если ваши данные формируются не одним SQL запросом, а несколькими, да еще потом и обрабатываются различными функциями? Тут нам на помощь приходит Drupal\Core\Pager\PagerManagerInterface
<?php
use Drupal\Core\Pager\PagerManagerInterface;
/**
* The pager manager.
*/
protected PagerManagerInterface $pagerManager;
/**
* {@inheritdoc}
*/
public function __construct(PagerManagerInterface $pager_manager) {
$this->pagerManager = $pager_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('pager.manager'),
);
}
/**
* Returns pager array.
*/
public function pagerArray(array $items, int $itemsPerPage): ?array {
$total = \count($items);
$currentPage = $this->pagerManager->createPager($total, $itemsPerPage)->getCurrentPage();
$chunks = \array_chunk($items, $itemsPerPage);
$currentPageItems = $chunks[$currentPage];
return $currentPageItems;
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
//...
// и вот он наш массив с данными, тут-то и происходит магия
$options = $this->pagerArray($options, 10);
//...
$form['table'] = [
'#type' => 'tableselect',
'#header' => $header,
'#options' => $options,
];
$form['pager'] = [
'#type' => 'pager',
];
return $form;
}
?>