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

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