‪TYPO3CMS  11.5
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)
47  // we need to remove the order by part to avoid aggregation field missing errors with PostgresSQL
48  ->resetQueryPart('orderBy')
49  // transform query to a count query
50  ->count('*')
51  ->executeQuery()
52  ->fetchOne();
53  }
54 
58  protected function ‪getQueryBuilderForDemand(‪Demand $demand): QueryBuilder
59  {
60  $queryBuilder = $this->‪getQueryBuilder();
61  $queryBuilder
62  ->select('*')
63  ->from('sys_redirect');
64 
65  $queryBuilder->orderBy(
66  $demand->‪getOrderField(),
67  $demand->‪getOrderDirection()
68  );
69 
70  if ($demand->‪hasSecondaryOrdering()) {
71  $queryBuilder->addOrderBy($demand->‪getSecondaryOrderField());
72  }
73 
74  $constraints = [];
75  if ($demand->‪hasSourceHosts()) {
76  $constraints[] = $queryBuilder->expr()->in(
77  'source_host',
78  $queryBuilder->createNamedParameter($demand->‪getSourceHosts(), Connection::PARAM_STR_ARRAY)
79  );
80  }
81 
82  if ($demand->‪hasSourcePath()) {
83  $escapedLikeString = '%' . $queryBuilder->escapeLikeWildcards($demand->‪getSourcePath()) . '%';
84  $constraints[] = $queryBuilder->expr()->like(
85  'source_path',
86  $queryBuilder->createNamedParameter($escapedLikeString, ‪Connection::PARAM_STR)
87  );
88  }
89 
90  if ($demand->‪hasTarget()) {
91  $escapedLikeString = '%' . $queryBuilder->escapeLikeWildcards($demand->‪getTarget()) . '%';
92  $constraints[] = $queryBuilder->expr()->like(
93  'target',
94  $queryBuilder->createNamedParameter($escapedLikeString, ‪Connection::PARAM_STR)
95  );
96  }
97 
98  if ($demand->‪hasStatusCodes()) {
99  $constraints[] = $queryBuilder->expr()->in(
100  'target_statuscode',
101  $queryBuilder->createNamedParameter($demand->‪getStatusCodes(), Connection::PARAM_INT_ARRAY)
102  );
103  }
104 
105  if ($demand->‪hasMaxHits()) {
106  $constraints[] = $queryBuilder->expr()->lt(
107  'hitcount',
108  $queryBuilder->createNamedParameter($demand->‪getMaxHits(), ‪Connection::PARAM_INT)
109  );
110  // When max hits is set, exclude records which explicitly disabled the hitcount feature
111  $constraints[] = $queryBuilder->expr()->eq(
112  'disable_hitcount',
113  $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT)
114  );
115  }
116 
117  if (!empty($constraints)) {
118  $queryBuilder->where(...$constraints);
119  }
120  return $queryBuilder;
121  }
122 
126  public function ‪findHostsOfRedirects(): array
127  {
128  return $this->‪getQueryBuilder()
129  ->select('source_host as name')
130  ->from('sys_redirect')
131  ->orderBy('source_host')
132  ->groupBy('source_host')
133  ->executeQuery()
134  ->fetchAllAssociative();
135  }
136 
140  public function ‪findStatusCodesOfRedirects(): array
141  {
142  return $this->‪getQueryBuilder()
143  ->select('target_statuscode as code')
144  ->from('sys_redirect')
145  ->orderBy('target_statuscode')
146  ->groupBy('target_statuscode')
147  ->executeQuery()
148  ->fetchAllAssociative();
149  }
150 
151  protected function ‪getQueryBuilder(): QueryBuilder
152  {
153  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_redirect');
154  $queryBuilder->getRestrictions()
155  ->removeAll()
156  ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
157  return $queryBuilder;
158  }
159 
160  public function ‪removeByDemand(‪Demand $demand): void
161  {
162  $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
163  ->getQueryBuilderForTable('sys_redirect');
164  $queryBuilder
165  ->delete('sys_redirect')
166  ->where(
167  $queryBuilder->expr()->eq('protected', $queryBuilder->createNamedParameter(0, ‪Connection::PARAM_INT))
168  );
169 
170  if ($demand->‪hasMaxHits()) {
171  $queryBuilder->andWhere(
172  $queryBuilder->expr()->lt('hitcount', $queryBuilder->createNamedParameter($demand->‪getMaxHits(), ‪Connection::PARAM_INT))
173  );
174  }
175  if ($demand->‪hasSourceHosts()) {
176  $queryBuilder
177  ->andWhere('source_host IN (:domains)')
178  ->setParameter('domains', $demand->‪getSourceHosts(), Connection::PARAM_STR_ARRAY);
179  }
180  if ($demand->‪hasStatusCodes()) {
181  $queryBuilder
182  ->andWhere('target_statuscode IN (:statusCodes)')
183  ->setParameter('statusCodes', $demand->‪getStatusCodes(), Connection::PARAM_INT_ARRAY);
184  }
185  if ($demand->‪hasOlderThan()) {
186  $timeStamp = $demand->‪getOlderThan()->getTimestamp();
187  $queryBuilder->andWhere(
188  $queryBuilder->expr()->lt('createdon', $queryBuilder->createNamedParameter($timeStamp, ‪Connection::PARAM_INT))
189  );
190  }
191  if ($demand->‪hasSourcePath()) {
192  $queryBuilder
193  ->andWhere($queryBuilder->expr()->like('source_path', ':path'))
194  ->setParameter('path', $demand->‪getSourcePath(), ‪Connection::PARAM_STR);
195  }
196 
197  $queryBuilder->executeStatement();
198  }
199 }
‪TYPO3\CMS\Redirects\Repository\Demand
Definition: Demand.php:28
‪TYPO3\CMS\Redirects\Repository\Demand\getOffset
‪getOffset()
Definition: Demand.php:269
‪TYPO3\CMS\Redirects\Repository\Demand\getMaxHits
‪getMaxHits()
Definition: Demand.php:144
‪TYPO3\CMS\Redirects\Repository\Demand\hasStatusCodes
‪hasStatusCodes()
Definition: Demand.php:229
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:49
‪TYPO3\CMS\Redirects\Repository\Demand\getOrderField
‪getOrderField()
Definition: Demand.php:164
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findStatusCodesOfRedirects
‪findStatusCodesOfRedirects()
Definition: RedirectRepository.php:140
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\findHostsOfRedirects
‪findHostsOfRedirects()
Definition: RedirectRepository.php:126
‪TYPO3\CMS\Core\Database\Connection\PARAM_STR
‪const PARAM_STR
Definition: Connection.php:54
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\getQueryBuilderForDemand
‪getQueryBuilderForDemand(Demand $demand)
Definition: RedirectRepository.php:58
‪TYPO3\CMS\Redirects\Repository\Demand\hasMaxHits
‪hasMaxHits()
Definition: Demand.php:149
‪TYPO3\CMS\Redirects\Repository\Demand\hasSourcePath
‪hasSourcePath()
Definition: Demand.php:239
‪TYPO3\CMS\Redirects\Repository\Demand\hasSecondaryOrdering
‪hasSecondaryOrdering()
Definition: Demand.php:184
‪TYPO3\CMS\Redirects\Repository\Demand\getOrderDirection
‪getOrderDirection()
Definition: Demand.php:169
‪TYPO3\CMS\Redirects\Repository\RedirectRepository\getQueryBuilder
‪getQueryBuilder()
Definition: RedirectRepository.php:151
‪TYPO3\CMS\Redirects\Repository\Demand\getTarget
‪getTarget()
Definition: Demand.php:209
‪TYPO3\CMS\Redirects\Repository\Demand\getLimit
‪getLimit()
Definition: Demand.php:214
‪TYPO3\CMS\Redirects\Repository\Demand\getSourceHosts
‪getSourceHosts()
Definition: Demand.php:199
‪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:159
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Redirects\Repository
Definition: Demand.php:18
‪TYPO3\CMS\Redirects\Repository\Demand\getSecondaryOrderField
‪getSecondaryOrderField()
Definition: Demand.php:189
‪TYPO3\CMS\Redirects\Repository\Demand\getStatusCodes
‪getStatusCodes()
Definition: Demand.php:224
‪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:160
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Redirects\Repository\Demand\hasSourceHosts
‪hasSourceHosts()
Definition: Demand.php:234
‪TYPO3\CMS\Redirects\Repository\Demand\getSourcePath
‪getSourcePath()
Definition: Demand.php:204
‪TYPO3\CMS\Redirects\Repository\Demand\hasTarget
‪hasTarget()
Definition: Demand.php:244
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Redirects\Repository\Demand\getOlderThan
‪getOlderThan()
Definition: Demand.php:154