Создаем пейджер для страницы и массива кастомных данных

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

ivnish 12 июля 2022 в 14:27
2

Задача: есть страница-форма, где выводятся какие-то данные. Нужно выводить эти данные постранично. 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 $itemsint $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 $formFormStateInterface $form_state) {
  
//...
  
  // и вот он наш массив с данными, тут-то и происходит магия
  
$options $this->pagerArray($options10);
  
  
//...
  
  
$form['table'] = [
    
'#type' => 'tableselect',
    
'#header' => $header,
    
'#options' => $options,
  ];
  
  
$form['pager'] = [
    
'#type' => 'pager',
  ];
  
  return 
$form;
}
?>

Автор

ivnish Drupal FullStack Developer