diff --git a/src/Controller/InvoiceController.php b/src/Controller/InvoiceController.php index ac56ad6b..31d91e2c 100644 --- a/src/Controller/InvoiceController.php +++ b/src/Controller/InvoiceController.php @@ -251,12 +251,15 @@ final class InvoiceController extends AbstractController } /** - * @Route(path="/template", name="admin_invoice_template", methods={"GET", "POST"}) + * @Route(path="/template/{page}", requirements={"page": "[1-9]\d*"}, defaults={"page": 1}, name="admin_invoice_template", methods={"GET", "POST"}) * @Security("is_granted('manage_invoice_template')") */ - public function listTemplateAction(): Response + public function listTemplateAction(int $page): Response { - $templates = $this->templateRepository->getPagerfantaForQuery(new BaseQuery()); + $query = new BaseQuery(); + $query->setPage($page); + + $templates = $this->templateRepository->getPagerfantaForQuery($query); return $this->render('invoice/templates.html.twig', [ 'entries' => $templates, diff --git a/src/Repository/InvoiceTemplateRepository.php b/src/Repository/InvoiceTemplateRepository.php index f5a80dd3..ff988307 100644 --- a/src/Repository/InvoiceTemplateRepository.php +++ b/src/Repository/InvoiceTemplateRepository.php @@ -10,10 +10,11 @@ namespace App\Repository; use App\Entity\InvoiceTemplate; +use App\Repository\Paginator\PaginatorInterface; +use App\Repository\Paginator\QueryBuilderPaginator; use App\Repository\Query\BaseQuery; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\QueryBuilder; -use Pagerfanta\Adapter\DoctrineORMAdapter; use Pagerfanta\Pagerfanta; /** @@ -48,15 +49,35 @@ class InvoiceTemplateRepository extends EntityRepository return $qb; } + protected function getPaginatorForQuery(BaseQuery $query): PaginatorInterface + { + $counter = $this->countTemplatesForQuery($query); + $qb = $this->getQueryBuilderForQuery($query); + + return new QueryBuilderPaginator($qb, $counter); + } + public function getPagerfantaForQuery(BaseQuery $query): Pagerfanta { - $paginator = new Pagerfanta(new DoctrineORMAdapter($this->getQueryBuilderForQuery($query), false)); + $paginator = new Pagerfanta($this->getPaginatorForQuery($query)); $paginator->setMaxPerPage($query->getPageSize()); $paginator->setCurrentPage($query->getPage()); return $paginator; } + public function countTemplatesForQuery(BaseQuery $query): int + { + $qb = $this->getQueryBuilderForQuery($query); + $qb + ->resetDQLPart('select') + ->resetDQLPart('orderBy') + ->select($qb->expr()->countDistinct('t.id')) + ; + + return (int) $qb->getQuery()->getSingleScalarResult(); + } + /** * @param InvoiceTemplate $template * @return InvoiceTemplate diff --git a/src/Repository/Query/BaseQuery.php b/src/Repository/Query/BaseQuery.php index 73876485..c08d78fb 100644 --- a/src/Repository/Query/BaseQuery.php +++ b/src/Repository/Query/BaseQuery.php @@ -117,6 +117,8 @@ class BaseQuery } /** + * By setting the current user, you activate (team) permission checks. + * * @param User $user * @return self */ diff --git a/src/Repository/UserRepository.php b/src/Repository/UserRepository.php index 1f3ab900..7291e656 100644 --- a/src/Repository/UserRepository.php +++ b/src/Repository/UserRepository.php @@ -23,7 +23,6 @@ use App\Repository\Query\UserQuery; use Doctrine\ORM\EntityRepository; use Doctrine\ORM\ORMException; use Doctrine\ORM\QueryBuilder; -use Pagerfanta\Adapter\DoctrineORMAdapter; use Pagerfanta\Pagerfanta; use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface; @@ -104,16 +103,13 @@ class UserRepository extends EntityRepository implements UserLoaderInterface public function findByQuery(UserQuery $query) { @trigger_error('UserRepository::findByQuery() is deprecated and will be removed with 2.0', E_USER_DEPRECATED); - $qb = $this->getQueryBuilderForQuery($query); if (BaseQuery::RESULT_TYPE_PAGER === $query->getResultType()) { - $paginator = new Pagerfanta(new DoctrineORMAdapter($qb->getQuery(), false)); - $paginator->setMaxPerPage($query->getPageSize()); - $paginator->setCurrentPage($query->getPage()); - - return $paginator; + return $this->getPagerfantaForQuery($query); } + $qb = $this->getQueryBuilderForQuery($query); + if (BaseQuery::RESULT_TYPE_OBJECTS === $query->getResultType()) { return $qb->getQuery()->execute(); }