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

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