vendor/knplabs/knp-paginator-bundle/src/Pagination/SlidingPagination.php line 15

Open in your IDE?
  1. <?php
  2. namespace Knp\Bundle\PaginatorBundle\Pagination;
  3. use Knp\Component\Pager\Pagination\AbstractPagination;
  4. /**
  5.  * @template TKey
  6.  * @template TValue
  7.  *
  8.  * @template-extends AbstractPagination<TKey, TValue>
  9.  *
  10.  * @template-implements SlidingPaginationInterface<TKey, TValue>
  11.  */
  12. final class SlidingPagination extends AbstractPagination implements SlidingPaginationInterface
  13. {
  14.     private ?string $route null;
  15.     /** @var array<string, mixed> */
  16.     private array $params;
  17.     private int $pageRange 5;
  18.     private ?int $pageLimit null;
  19.     private ?string $template null;
  20.     private ?string $sortableTemplate null;
  21.     private ?string $filtrationTemplate null;
  22.     /**
  23.      * @param array<string, mixed> $params
  24.      */
  25.     public function __construct(array $params)
  26.     {
  27.         $this->params $params;
  28.     }
  29.     public function setUsedRoute(?string $route): void
  30.     {
  31.         $this->route $route;
  32.     }
  33.     public function getRoute(): ?string
  34.     {
  35.         return $this->route;
  36.     }
  37.     public function setSortableTemplate(string $template): void
  38.     {
  39.         $this->sortableTemplate $template;
  40.     }
  41.     public function getSortableTemplate(): ?string
  42.     {
  43.         return $this->sortableTemplate;
  44.     }
  45.     public function setFiltrationTemplate(string $template): void
  46.     {
  47.         $this->filtrationTemplate $template;
  48.     }
  49.     public function getFiltrationTemplate(): ?string
  50.     {
  51.         return $this->filtrationTemplate;
  52.     }
  53.     public function setParam(string $namemixed $value): void
  54.     {
  55.         $this->params[$name] = $value;
  56.     }
  57.     public function getParams(): array
  58.     {
  59.         return $this->params;
  60.     }
  61.     public function setTemplate(string $template): void
  62.     {
  63.         $this->template $template;
  64.     }
  65.     public function getTemplate(): ?string
  66.     {
  67.         return $this->template;
  68.     }
  69.     public function setPageRange(int $range): void
  70.     {
  71.         $this->pageRange \abs($range);
  72.     }
  73.     public function setPageLimit(?int $limit): void
  74.     {
  75.         $this->pageLimit $limit;
  76.     }
  77.     /**
  78.      * Get url query with all parameters.
  79.      *
  80.      * @param array<string, mixed> $additionalQueryParams
  81.      *
  82.      * @return array<string, mixed> - list of query parameters
  83.      */
  84.     public function getQuery(array $additionalQueryParams = []): array
  85.     {
  86.         return \array_merge($this->params$additionalQueryParams);
  87.     }
  88.     /**
  89.      * @param string[]|string|null $key
  90.      * @param array<string, mixed> $params
  91.      */
  92.     public function isSorted($key null, array $params = []): bool
  93.     {
  94.         $params \array_merge($this->params$params);
  95.         if (null === $key) {
  96.             return isset($params[$this->getPaginatorOption('sortFieldParameterName')]);
  97.         }
  98.         if (\is_array($key)) {
  99.             $key \implode('+'$key);
  100.         }
  101.         return isset($params[$this->getPaginatorOption('sortFieldParameterName')]) && $params[$this->getPaginatorOption('sortFieldParameterName')] === $key;
  102.     }
  103.     public function getPage(): ?int
  104.     {
  105.         return $this->params[$this->getPaginatorOption('pageParameterName')] ?? null;
  106.     }
  107.     public function getSort(): ?string
  108.     {
  109.         return $this->params[$this->getPaginatorOption('sortFieldParameterName')] ?? null;
  110.     }
  111.     public function getDirection(): ?string
  112.     {
  113.         return $this->params[$this->getPaginatorOption('sortDirectionParameterName')] ?? null;
  114.     }
  115.     public function getPaginationData(): array
  116.     {
  117.         $pageCount $this->getPageCount();
  118.         $current $this->currentPageNumber;
  119.         if ($pageCount $current) {
  120.             $this->currentPageNumber $current $pageCount;
  121.         }
  122.         if ($this->pageRange $pageCount) {
  123.             $this->pageRange $pageCount;
  124.         }
  125.         $delta \ceil($this->pageRange 2);
  126.         if ($current $delta $pageCount $this->pageRange) {
  127.             $pages \range($pageCount $this->pageRange 1$pageCount);
  128.         } else {
  129.             if ($current $delta 0) {
  130.                 $delta $current;
  131.             }
  132.             $offset $current $delta;
  133.             $pages \range($offset 1$offset $this->pageRange);
  134.         }
  135.         $proximity \floor($this->pageRange 2);
  136.         $startPage $current $proximity;
  137.         $endPage $current $proximity;
  138.         if ($startPage 1) {
  139.             $endPage \min($endPage + ($startPage), $pageCount);
  140.             $startPage 1;
  141.         }
  142.         if ($endPage $pageCount) {
  143.             $startPage \max($startPage - ($endPage $pageCount), 1);
  144.             $endPage $pageCount;
  145.         }
  146.         $viewData = [
  147.             'last' => $pageCount,
  148.             'current' => $current,
  149.             'numItemsPerPage' => $this->numItemsPerPage,
  150.             'first' => 1,
  151.             'pageCount' => $pageCount,
  152.             'totalCount' => $this->totalCount,
  153.             'pageRange' => $this->pageRange,
  154.             'startPage' => $startPage,
  155.             'endPage' => $endPage,
  156.         ];
  157.         if ($current 1) {
  158.             $viewData['previous'] = $current 1;
  159.         }
  160.         if ($current $pageCount) {
  161.             $viewData['next'] = $current 1;
  162.         }
  163.         $viewData['pagesInRange'] = $pages;
  164.         $viewData['firstPageInRange'] = \min($pages);
  165.         $viewData['lastPageInRange'] = \max($pages);
  166.         if (null !== $this->getItems()) {
  167.             $viewData['currentItemCount'] = $this->count();
  168.             $viewData['firstItemNumber'] = 0;
  169.             $viewData['lastItemNumber'] = 0;
  170.             if ($viewData['totalCount'] > 0) {
  171.                 $viewData['firstItemNumber'] = (($current 1) * $this->numItemsPerPage) + 1;
  172.                 $viewData['lastItemNumber'] = $viewData['firstItemNumber'] + $viewData['currentItemCount'] - 1;
  173.             }
  174.         }
  175.         return $viewData;
  176.     }
  177.     public function getPageCount(): int
  178.     {
  179.         $count = (int) \ceil($this->totalCount $this->numItemsPerPage);
  180.         if (null !== $this->pageLimit) {
  181.             return \min($count$this->pageLimit);
  182.         }
  183.         return $count;
  184.     }
  185.     public function getPaginatorOptions(): ?array
  186.     {
  187.         return $this->paginatorOptions;
  188.     }
  189.     public function getCustomParameters(): ?array
  190.     {
  191.         return $this->customParameters;
  192.     }
  193. }