Test Setup Failed
Pull Request — master (#4194)
by Craig
05:31
created

Paginator::setRouteParameters()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 1
eloc 2
nc 1
nop 1
dl 0
loc 5
rs 10
c 1
b 0
f 1
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the Zikula package.
7
 *
8
 * Copyright Zikula Foundation - https://ziku.la/
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13
14
namespace Zikula\Bundle\CoreBundle\Doctrine;
15
16
use Doctrine\ORM\QueryBuilder as DoctrineQueryBuilder;
17
use Doctrine\ORM\Tools\Pagination\CountWalker;
18
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
19
20
/**
21
 * @author Javier Eguiluz <[email protected]>
22
 * Most of this file is copied from https://github.com/javiereguiluz/symfony-demo/blob/master/src/Pagination/Paginator.php
23
 *
24
 * usage:
25
 *     in Repository class:
26
 *         return (new Paginator($qb))->paginate($page);
27
 *     in controller:
28
 *         return $this->render('blog/index.'.$_format.'.twig', [
29
 *             'paginator' => $latestPosts,
30
 *         ]);
31
 *     results in template {% for post in paginator.results %}
32
 *     include template: {{ include(paginator.template) }}
33
 */
34
class Paginator
35
{
36
    private const PAGE_SIZE = 25;
37
38
    private $queryBuilder;
39
40
    private $currentPage;
41
42
    private $pageSize;
43
44
    private $results;
45
46
    private $numResults;
47
48
    private $route;
49
50
    private $routeParameters;
51
52
    private $template = '@Core/Paginator/Paginator.html.twig';
53
54
    public function __construct(DoctrineQueryBuilder $queryBuilder, int $pageSize = self::PAGE_SIZE)
55
    {
56
        $this->queryBuilder = $queryBuilder;
57
        $this->pageSize = $pageSize;
58
    }
59
60
    public function paginate(int $page = 1): self
61
    {
62
        $this->currentPage = max(1, $page);
63
        $firstResult = ($this->currentPage - 1) * $this->pageSize;
64
65
        $query = $this->queryBuilder
66
            ->setFirstResult($firstResult)
67
            ->setMaxResults($this->pageSize)
68
            ->getQuery();
69
70
        if (0 === \count($this->queryBuilder->getDQLPart('join'))) {
71
            $query->setHint(CountWalker::HINT_DISTINCT, false);
72
        }
73
74
        $paginator = new DoctrinePaginator($query, true);
75
76
        $useOutputWalkers = \count($this->queryBuilder->getDQLPart('having') ?: []) > 0;
77
        $paginator->setUseOutputWalkers($useOutputWalkers);
78
79
        $this->results = $paginator->getIterator();
80
        $this->numResults = $paginator->count();
81
82
        return $this;
83
    }
84
85
    public function getCurrentPage(): int
86
    {
87
        return $this->currentPage;
88
    }
89
90
    public function getLastPage(): int
91
    {
92
        return (int) ceil($this->numResults / $this->pageSize);
93
    }
94
95
    public function getPageSize(): int
96
    {
97
        return $this->pageSize;
98
    }
99
100
    public function hasPreviousPage(): bool
101
    {
102
        return $this->currentPage > 1;
103
    }
104
105
    public function getPreviousPage(): int
106
    {
107
        return max(1, $this->currentPage - 1);
108
    }
109
110
    public function hasNextPage(): bool
111
    {
112
        return $this->currentPage < $this->getLastPage();
113
    }
114
115
    public function getNextPage(): int
116
    {
117
        return min($this->getLastPage(), $this->currentPage + 1);
118
    }
119
120
    public function hasToPaginate(): bool
121
    {
122
        return $this->numResults > $this->pageSize;
123
    }
124
125
    public function getNumResults(): int
126
    {
127
        return $this->numResults;
128
    }
129
130
    public function getResults(): \Traversable
131
    {
132
        return $this->results;
133
    }
134
135
    public function setRoute(string $route): self
136
    {
137
        $this->route = $route;
138
139
        return $this;
140
    }
141
142
    public function getRoute(): string
143
    {
144
        return $this->route;
145
    }
146
147
    public function setRouteParameters(array $parameters): self
148
    {
149
        $this->routeParameters = $parameters;
150
151
        return $this;
152
    }
153
154
    public function setRouteParameter(string $name, string $value): void
155
    {
156
        $this->routeParameters[$name] = $value;
157
    }
158
159
    public function getRouteParameters(): array
160
    {
161
        return $this->routeParameters;
162
    }
163
164
    public function setTemplate(string $templateName): void
165
    {
166
        $this->template = $templateName;
167
    }
168
169
    public function getTemplate(): string
170
    {
171
        return $this->template;
172
    }
173
}
174