‪TYPO3CMS  ‪main
RedirectRepository.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
22 use TYPO3\CMS\Core\Database\Query\QueryBuilder;
25 
31 {
35  public function ‪findRedirectsByDemand(‪Demand $demand): array
36  {
37  return $this->‪getQueryBuilderForDemand($demand)
38  ->setMaxResults($demand->‪getLimit())
39  ->setFirstResult($demand->‪getOffset())
40  ->executeQuery()
41  ->fetchAllAssociative();
42  }
43 
44  public function ‪countRedirectsByByDemand(‪Demand $demand): int
45  {
46  return (int)$this->‪getQueryBuilderForDemand($demand, true)
47  ->executeQuery()
48  ->fetchOne();
49  }
50 
51  public function ‪countActiveRedirects(): int
52  {
53  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_redirect');
54  return (int)$queryBuilder
55  ->count('uid')
56  ->from('sys_redirect')
57  ->executeQuery()
58  ->fetchOne();
59  }
60 
64  protected function ‪getQueryBuilderForDemand(‪Demand $demand, bool $createCountQuery = false): QueryBuilder
65  {
66  $queryBuilder = $this->‪getQueryBuilder();
67 
68  if ($createCountQuery) {
69  $queryBuilder->count('*');
70  } else {
71  $queryBuilder->select('*');
72  }
73 
74  $queryBuilder->from('sys_redirect');
75 
76  if (!$createCountQuery) {
77  $queryBuilder->orderBy(
78  $demand->‪getOrderField(),
79  $demand->‪getOrderDirection()
80  );
81  if ($demand->‪hasSecondaryOrdering()) {
82  $queryBuilder->addOrderBy($demand->‪getSecondaryOrderField());
83  }
84  }
85 
86  $constraints = [];
87  if ($demand->‪hasSourceHosts()) {
88  $constraints[] = $queryBuilder->expr()->in(
89  'source_host',
90  $queryBuilder->createNamedParameter($demand->‪getSourceHosts(), ‪Connection::PARAM_STR_ARRAY)
91  );
92  }
93 
94  if ($demand->‪hasSourcePath()) {
95  $escapedLikeString = '%' . $queryBuilder->escapeLikeWildcards($demand->‪getSourcePath()) . '%';
96  $constraints[] = $queryBuilder->expr()->like(
97  'source_path',
98  $queryBuilder->createNamedParameter($escapedLikeString)
99  );
100  }
101 
102  if ($demand->‪hasTarget()) {
103  $escapedLikeString = '%' . $queryBuilder->escapeLikeWildcards($demand->‪getTarget()) . '%';
104  $constraints[] = $queryBuilder->expr()->like(
105  'target',
106  $queryBuilder->createNamedParameter($escapedLikeString)
107  );
108  }
109 
110  if ($demand->‪hasStatusCodes()) {
111  $constraints[] = $queryBuilder->expr()->in(
112  'target_statuscode',
113  $queryBuilder->createNamedParameter($demand->‪getStatusCodes(), ‪Connection::PARAM_INT_ARRAY)
114  );
115  }
116 
117  if ($demand->‪hasMaxHits()) {
118  $constraints[] = $queryBuilder->expr()->lt(
119  'hitcount',
120  $queryBuilder->createNamedParameter($demand->‪getMaxHits(), ‪Connection::PARAM_INT)
121  );
122  // When max hits is set, exclude records which explicitly disabled the hitcount feature
123  $constraints[] = $queryBuilder->expr()->eq(
124  'disable_hitcount',
125  $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)
126  );
127  }
128 
129  if ($demand->‪hasCreationType()) {
130  $constraints[] = $queryBuilder->expr()->eq(
131  'creation_type',
132  $queryBuilder->createNamedParameter($demand->‪getCreationType(), ‪Connection::PARAM_INT)
133  );
134  }
135 
136  if ($demand->‪hasProtected()) {
137  $constraints[] = $queryBuilder->expr()->eq(
138  'protected',
139  $queryBuilder->createNamedParameter($demand->‪getProtected(), ‪Connection::PARAM_INT)
140  );
141  }
142 
143  if ($demand->‪hasIntegrityStatus()) {
144  $constraints[] = $queryBuilder->expr()->eq(
145  'integrity_status',
146  $queryBuilder->createNamedParameter($demand->‪getIntegrityStatus())
147  );
148  }
149 
150  if (!empty($constraints)) {
151  $queryBuilder->where(...$constraints);
152  }
153  return $queryBuilder;
154  }
155 
159  public function ‪findHostsOfRedirects(): array
160  {
161  return $this->‪getGroupedRows('source_host', 'name');
162  }
163 
167  public function ‪findStatusCodesOfRedirects(): array
168  {
169  return $this->‪getGroupedRows('target_statuscode', 'code');
170  }
171 
175  public function ‪findCreationTypes(): array
176  {
177  $types = [];
178  $availableTypes = ‪$GLOBALS['TCA']['sys_redirect']['columns']['creation_type']['config']['items'];
179  foreach ($this->‪getGroupedRows('creation_type', 'type') as $row) {
180  foreach ($availableTypes as $availableType) {
181  if ($availableType['value'] === $row['type']) {
182  $types[$row['type']] = $availableType['label'];
183  }
184  }
185  }
186 
187  return $types;
188  }
189 
193  public function ‪findIntegrityStatusCodes(): array
194  {
195  $statusCodes = [];
196  $availableStatusCodes = ‪$GLOBALS['TCA']['sys_redirect']['columns']['integrity_status']['config']['items'];
197  foreach ($this->‪getGroupedRows('integrity_status', 'status_code') as $row) {
198  foreach ($availableStatusCodes as $availableStatusCode) {
199  if ($availableStatusCode['value'] === $row['status_code']) {
200  $statusCodes[$row['status_code']] = $availableStatusCode['label'];
201  }
202  }
203  }
204 
205  return $statusCodes;
206  }
207 
208  protected function ‪getGroupedRows(string $field, string $as): array
209  {
210  return $this->‪getQueryBuilder()
211  ->select(sprintf('%s as %s', $field, $as))
212  ->from('sys_redirect')
213  ->orderBy($field)
214  ->groupBy($field)
215  ->executeQuery()
216  ->fetchAllAssociative();
217  }
218 
219  protected function ‪getQueryBuilder(): QueryBuilder
220  {
221  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_redirect');
222  $queryBuilder->getRestrictions()
223  ->removeAll()
224  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
225  return $queryBuilder;
226  }
227 
228  public function ‪removeByDemand(‪Demand $demand): void
229  {
230  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
231  ->getQueryBuilderForTable('sys_redirect');
232  $queryBuilder
233  ->delete('sys_redirect')
234  ->where(
235  $queryBuilder->expr()->eq('protected', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT))
236  );
237 
238  if ($demand->‪hasMaxHits()) {
239  $queryBuilder->andWhere(
240  $queryBuilder->expr()->lt('hitcount', $queryBuilder->createNamedParameter($demand->‪getMaxHits(), ‪Connection::PARAM_INT))
241  );
242  }
243  if ($demand->‪hasSourceHosts()) {
244  $queryBuilder
245  ->andWhere('source_host IN (:domains)')
246  ->setParameter('domains', $demand->‪getSourceHosts(), ‪Connection::PARAM_STR_ARRAY);
247  }
248  if ($demand->‪hasStatusCodes()) {
249  $queryBuilder
250  ->andWhere('target_statuscode IN (:statusCodes)')
251  ->setParameter('statusCodes', $demand->‪getStatusCodes(), ‪Connection::PARAM_INT_ARRAY);
252  }
253  if ($demand->‪hasOlderThan()) {
254  $timeStamp = $demand->‪getOlderThan()->getTimestamp();
255  $queryBuilder->andWhere(
256  $queryBuilder->expr()->lt('createdon', $queryBuilder->createNamedParameter($timeStamp, ‪Connection::PARAM_INT))
257  );
258  }
259  if ($demand->‪hasSourcePath()) {
260  $queryBuilder
261  ->andWhere($queryBuilder->expr()->like('source_path', ':path'))
262  ->setParameter('path', $demand->‪getSourcePath());
263  }
264 
265  if ($demand->‪hasCreationType()) {
266  $queryBuilder->andWhere(
267  $queryBuilder->expr()->eq('creation_type', $queryBuilder->createNamedParameter($demand->‪getCreationType(), ‪Connection::PARAM_INT))
268  );
269  }
270 
271  $queryBuilder->executeStatement();
272  }
273 }
‪TYPO3\CMS\Redirects\Repository\Demand
Definition: Demand.php:29
‪TYPO3\CMS\Redirects\Repository\Demand\getOffset
‪getOffset()
Definition: Demand.php:294
‪TYPO3\CMS\Redirects\Repository\Demand\getMaxHits
‪getMaxHits()
Definition: Demand.php:136
‪TYPO3\CMS\Redirects\Repository\Demand\hasStatusCodes
‪hasStatusCodes()
Definition: Demand.php:236
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:52
‪TYPO3\CMS\Redirects\Repository\Demand\getOrderField
‪getOrderField()
Definition: Demand.php:156
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findStatusCodesOfRedirects
‪findStatusCodesOfRedirects()
Definition: RedirectRepository.php:167
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\getQueryBuilderForDemand
‪getQueryBuilderForDemand(Demand $demand, bool $createCountQuery=false)
Definition: RedirectRepository.php:64
‪TYPO3\CMS\Redirects\Repository\Demand\getIntegrityStatus
‪getIntegrityStatus()
Definition: Demand.php:221
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findIntegrityStatusCodes
‪findIntegrityStatusCodes()
Definition: RedirectRepository.php:193
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findHostsOfRedirects
‪findHostsOfRedirects()
Definition: RedirectRepository.php:159
‪TYPO3\CMS\Redirects\Repository\Demand\getProtected
‪getProtected()
Definition: Demand.php:216
‪TYPO3\CMS\Redirects\Repository\Demand\getCreationType
‪getCreationType()
Definition: Demand.php:211
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findCreationTypes
‪findCreationTypes()
Definition: RedirectRepository.php:175
‪TYPO3\CMS\Redirects\Repository\Demand\hasMaxHits
‪hasMaxHits()
Definition: Demand.php:141
‪TYPO3\CMS\Redirects\Repository\Demand\hasSourcePath
‪hasSourcePath()
Definition: Demand.php:246
‪TYPO3\CMS\Redirects\Repository\Demand\hasSecondaryOrdering
‪hasSecondaryOrdering()
Definition: Demand.php:176
‪TYPO3\CMS\Redirects\Repository\Demand\hasProtected
‪hasProtected()
Definition: Demand.php:261
‪TYPO3\CMS\Core\Database\Connection\PARAM_STR_ARRAY
‪const PARAM_STR_ARRAY
Definition: Connection.php:77
‪TYPO3\CMS\Redirects\Repository\Demand\getOrderDirection
‪getOrderDirection()
Definition: Demand.php:161
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\getQueryBuilder
‪getQueryBuilder()
Definition: RedirectRepository.php:219
‪TYPO3\CMS\Redirects\Repository\Demand\getTarget
‪getTarget()
Definition: Demand.php:201
‪TYPO3\CMS\Redirects\Repository\Demand\getLimit
‪getLimit()
Definition: Demand.php:206
‪TYPO3\CMS\Redirects\Repository\Demand\getSourceHosts
‪getSourceHosts()
Definition: Demand.php:191
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findRedirectsByDemand
‪findRedirectsByDemand(Demand $demand)
Definition: RedirectRepository.php:35
‪TYPO3\CMS\Redirects\Repository\RedirectRepository
Definition: RedirectRepository.php:31
‪TYPO3\CMS\Redirects\Repository\Demand\hasOlderThan
‪hasOlderThan()
Definition: Demand.php:151
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:41
‪TYPO3\CMS\Redirects\Repository
Definition: Demand.php:18
‪TYPO3\CMS\Redirects\Repository\Demand\getSecondaryOrderField
‪getSecondaryOrderField()
Definition: Demand.php:181
‪TYPO3\CMS\Redirects\Repository\Demand\getStatusCodes
‪getStatusCodes()
Definition: Demand.php:231
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\countRedirectsByByDemand
‪countRedirectsByByDemand(Demand $demand)
Definition: RedirectRepository.php:44
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\removeByDemand
‪removeByDemand(Demand $demand)
Definition: RedirectRepository.php:228
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Redirects\Repository\Demand\hasSourceHosts
‪hasSourceHosts()
Definition: Demand.php:241
‪TYPO3\CMS\Redirects\Repository\Demand\getSourcePath
‪getSourcePath()
Definition: Demand.php:196
‪TYPO3\CMS\Redirects\Repository\Demand\hasTarget
‪hasTarget()
Definition: Demand.php:251
‪TYPO3\CMS\Redirects\Repository\Demand\hasIntegrityStatus
‪hasIntegrityStatus()
Definition: Demand.php:266
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\countActiveRedirects
‪countActiveRedirects()
Definition: RedirectRepository.php:51
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\getGroupedRows
‪getGroupedRows(string $field, string $as)
Definition: RedirectRepository.php:208
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Redirects\Repository\Demand\getOlderThan
‪getOlderThan()
Definition: Demand.php:146
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT_ARRAY
‪const PARAM_INT_ARRAY
Definition: Connection.php:72
‪TYPO3\CMS\Redirects\Repository\Demand\hasCreationType
‪hasCreationType()
Definition: Demand.php:256