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; | |
} | |
} |