Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 12 |
CRAP | |
0.00% |
0 / 27 |
| Paginator | |
0.00% |
0 / 1 |
|
0.00% |
0 / 12 |
210 | |
0.00% |
0 / 27 |
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| paginate | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 14 |
|||
| getCurrentPage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getLastPage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getPageSize | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| hasPreviousPage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getPreviousPage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| hasNextPage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getNextPage | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| hasToPaginate | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getNumResults | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| getResults | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
| <?php | |
| /* | |
| * This file is part of the Symfony package. | |
| * | |
| * (c) Fabien Potencier <fabien@symfony.com> | |
| * | |
| * For the full copyright and license information, please view the LICENSE | |
| * file that was distributed with this source code. | |
| */ | |
| namespace Smalldb\StateMachine\Test\SymfonyDemo\Pagination; | |
| use Doctrine\ORM\QueryBuilder as DoctrineQueryBuilder; | |
| use Doctrine\ORM\Tools\Pagination\CountWalker; | |
| use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator; | |
| /** | |
| * @author Javier Eguiluz <javier.eguiluz@gmail.com> | |
| */ | |
| class Paginator | |
| { | |
| private const PAGE_SIZE = 10; | |
| private $queryBuilder; | |
| private $currentPage; | |
| private $pageSize; | |
| private $results; | |
| private $numResults; | |
| public function __construct(DoctrineQueryBuilder $queryBuilder, int $pageSize = self::PAGE_SIZE) | |
| { | |
| $this->queryBuilder = $queryBuilder; | |
| $this->pageSize = $pageSize; | |
| } | |
| public function paginate(int $page = 1): self | |
| { | |
| $this->currentPage = max(1, $page); | |
| $firstResult = ($this->currentPage - 1) * $this->pageSize; | |
| $query = $this->queryBuilder | |
| ->setFirstResult($firstResult) | |
| ->setMaxResults($this->pageSize) | |
| ->getQuery(); | |
| if (0 === \count($this->queryBuilder->getDQLPart('join'))) { | |
| $query->setHint(CountWalker::HINT_DISTINCT, false); | |
| } | |
| $paginator = new DoctrinePaginator($query, true); | |
| $useOutputWalkers = \count($this->queryBuilder->getDQLPart('having') ?: []) > 0; | |
| $paginator->setUseOutputWalkers($useOutputWalkers); | |
| $this->results = $paginator->getIterator(); | |
| $this->numResults = $paginator->count(); | |
| return $this; | |
| } | |
| public function getCurrentPage(): int | |
| { | |
| return $this->currentPage; | |
| } | |
| public function getLastPage(): int | |
| { | |
| return (int) ceil($this->numResults / $this->pageSize); | |
| } | |
| public function getPageSize(): int | |
| { | |
| return $this->pageSize; | |
| } | |
| public function hasPreviousPage(): bool | |
| { | |
| return $this->currentPage > 1; | |
| } | |
| public function getPreviousPage(): int | |
| { | |
| return max(1, $this->currentPage - 1); | |
| } | |
| public function hasNextPage(): bool | |
| { | |
| return $this->currentPage < $this->getLastPage(); | |
| } | |
| public function getNextPage(): int | |
| { | |
| return min($this->getLastPage(), $this->currentPage + 1); | |
| } | |
| public function hasToPaginate(): bool | |
| { | |
| return $this->numResults > $this->pageSize; | |
| } | |
| public function getNumResults(): int | |
| { | |
| return $this->numResults; | |
| } | |
| public function getResults(): \Traversable | |
| { | |
| return $this->results; | |
| } | |
| } |