vendor/knplabs/knp-paginator-bundle/src/Subscriber/SlidingPaginationSubscriber.php line 29

  1. <?php
  2. namespace Knp\Bundle\PaginatorBundle\Subscriber;
  3. use Knp\Bundle\PaginatorBundle\Pagination\SlidingPagination;
  4. use Knp\Component\Pager\Event\PaginationEvent;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\HttpKernelInterface;
  8. final class SlidingPaginationSubscriber implements EventSubscriberInterface
  9. {
  10.     private ?string $route null;
  11.     /** @var array<string, mixed> */
  12.     private array $params = [];
  13.     /** @var array<string, mixed> */
  14.     private array $options;
  15.     /**
  16.      * @param array<string, mixed> $options
  17.      */
  18.     public function __construct(array $options)
  19.     {
  20.         $this->options $options;
  21.     }
  22.     public function onKernelRequest(RequestEvent $event): void
  23.     {
  24.         if (HttpKernelInterface::MAIN_REQUEST !== $event->getRequestType()) {
  25.             return;
  26.         }
  27.         $request $event->getRequest();
  28.         $this->route $request->attributes->get('_route');
  29.         $this->params \array_replace($request->query->all(), $request->attributes->get('_route_params', []));
  30.         foreach ($this->params as $key => $param) {
  31.             if (\str_starts_with($key'_')) {
  32.                 unset($this->params[$key]);
  33.             }
  34.         }
  35.     }
  36.     public function pagination(PaginationEvent $event): void
  37.     {
  38.         // default sort field and order
  39.         $eventOptions $event->options;
  40.         if (isset($eventOptions['defaultSortFieldName']) && !isset($this->params[$eventOptions['sortFieldParameterName']])) {
  41.             $this->params[$eventOptions['sortFieldParameterName']] = $eventOptions['defaultSortFieldName'];
  42.         }
  43.         if (isset($eventOptions['defaultSortDirection']) && !isset($this->params[$eventOptions['sortDirectionParameterName']])) {
  44.             $this->params[$eventOptions['sortDirectionParameterName']] = $eventOptions['defaultSortDirection'];
  45.         }
  46.         // remove default sort params from pagination links
  47.         if (isset($eventOptions['removeDefaultSortParams']) && true === $eventOptions['removeDefaultSortParams']) {
  48.             $defaultSortFieldName $eventOptions['defaultSortFieldName'];
  49.             $sortFieldParameterName $this->params[$eventOptions['sortFieldParameterName']];
  50.             $isFieldEqual $defaultSortFieldName === $sortFieldParameterName;
  51.             $defaultSortDirection $eventOptions['defaultSortDirection'];
  52.             $sortDirectionParameterName $this->params[$eventOptions['sortDirectionParameterName']];
  53.             $isDirectionEqual $defaultSortDirection === $sortDirectionParameterName;
  54.             if (isset($defaultSortFieldName$sortFieldParameterName$defaultSortDirection$sortDirectionParameterName) && $isFieldEqual && $isDirectionEqual) {
  55.                 unset($this->params[$eventOptions['sortFieldParameterName']], $this->params[$eventOptions['sortDirectionParameterName']]);
  56.             }
  57.         }
  58.         $pagination = new SlidingPagination($this->params);
  59.         $pagination->setUsedRoute($this->route);
  60.         $pagination->setTemplate($this->options['defaultPaginationTemplate']);
  61.         $pagination->setSortableTemplate($this->options['defaultSortableTemplate']);
  62.         $pagination->setFiltrationTemplate($this->options['defaultFiltrationTemplate']);
  63.         $pagination->setPageRange($this->options['defaultPageRange']);
  64.         $pagination->setPageLimit($this->options['defaultPageLimit']);
  65.         $event->setPagination($pagination);
  66.         $event->stopPropagation();
  67.     }
  68.     /**
  69.      * @return array<string, array<int, int|string>>
  70.      */
  71.     public static function getSubscribedEvents(): array
  72.     {
  73.         return [
  74.             'knp_pager.pagination' => ['pagination'1],
  75.         ];
  76.     }
  77. }