2 declare(strict_types = 1);
19 use Doctrine\DBAL\Connection;
117 throw new \InvalidArgumentException(
'tableName must be string', 1537277173);
120 throw new \InvalidArgumentException(
'routeFieldPattern must be string', 1537277174);
123 throw new \InvalidArgumentException(
'routeFieldResult must be string', 1537277175);
126 throw new \InvalidArgumentException(
127 'routeFieldResult must contain substitutable field names',
139 $this->slugUniqueInSite = $this->hasSlugUniqueInSite($this->tableName, ...$this->routeFieldResultNames);
145 public function generate(
string $value): ?string
155 public function resolve(
string $value): ?string
157 if (!preg_match(
'#' . $this->routeFieldPattern .
'#', $value, $matches)) {
162 if ($result[$this->languageParentFieldName] ??
null > 0) {
165 if (isset($result[
'uid'])) {
166 return (
string)$result[
'uid'];
178 if ($result ===
null) {
182 foreach ($this->routeFieldResultNames as $fieldName) {
183 if (!isset($result[$fieldName])) {
186 $routeFieldName =
'{' . $fieldName .
'}';
187 $substitutes[$routeFieldName] = $result[$fieldName];
190 array_keys($substitutes),
191 array_values($substitutes),
192 $this->routeFieldResult
205 return !is_numeric($key);
214 $result = $queryBuilder
216 ->where($queryBuilder->expr()->eq(
218 $queryBuilder->createNamedParameter($value, \PDO::PARAM_INT)
222 return $result !==
false ? $result :
null;
227 $languageAware = $this->languageFieldName !==
null && $this->languageParentFieldName !==
null;
230 $results = $queryBuilder
237 if ($this->slugUniqueInSite) {
238 $results = array_values($this->filterContainedInSite($results));
241 if (!$languageAware) {
242 return $results[0] ??
null;
245 $languageIds = $this->resolveAllRelevantLanguageIds();
246 return $this->resolveLanguageFallback($results, $this->languageFieldName, $languageIds);
251 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
252 ->getQueryBuilderForTable($this->tableName)
253 ->from($this->tableName);
254 $queryBuilder->setRestrictions(
255 GeneralUtility::makeInstance(FrontendRestrictionContainer::class, $this->context)
259 $queryBuilder->getRestrictions()->removeByType(FrontendGroupRestriction::class);
260 return $queryBuilder;
270 $languageAware = $this->languageFieldName !==
null && $this->languageParentFieldName !==
null;
271 $languageExpansion = $languageAware && isset($values[
'uid']);
274 foreach ($values as $fieldName => $fieldValue) {
275 if ($languageExpansion && $fieldName ===
'uid') {
278 $constraints[] = $queryBuilder->
expr()->
eq(
287 if ($languageExpansion) {
292 $constraints[] = $queryBuilder->
expr()->
orX(
293 $queryBuilder->
expr()->
eq(
'uid', $idParameter),
294 $queryBuilder->
expr()->
eq($this->languageParentFieldName, $idParameter)
297 } elseif ($languageAware) {
298 $languageIds = $this->resolveAllRelevantLanguageIds();
299 $constraints[] = $queryBuilder->
expr()->
in(
300 $this->languageFieldName,
314 $languageId = $this->siteLanguage->getLanguageId();
315 if ($record ===
null || $languageId === 0) {
320 if ($this->tableName ===
'pages') {
321 return $pageRepository->getPageOverlay($record, $languageId);
323 return $pageRepository
324 ->getRecordOverlay($this->tableName, $record, $languageId) ?:
null;
332 $context = clone GeneralUtility::makeInstance(Context::class);
337 return GeneralUtility::makeInstance(
338 PageRepository::class,