2 declare(strict_types = 1);
55 return 'Introduce URL parts ("slugs") to all existing pages';
63 return 'TYPO3 includes native URL handling. Every page record has its own speaking URL path'
64 .
' called "slug" which can be edited in TYPO3 Backend. However, it is necessary that all pages have'
65 .
' a URL pre-filled. This is done by evaluating the page title / navigation title and all of its rootline.';
75 $updateNeeded =
false;
89 DatabaseUpdatedPrerequisite::class
110 $connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable($this->table);
111 $queryBuilder = $connection->createQueryBuilder();
112 $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
113 $statement = $queryBuilder
117 $queryBuilder->expr()->orX(
118 $queryBuilder->expr()->eq($this->fieldName, $queryBuilder->createNamedParameter(
'')),
119 $queryBuilder->expr()->isNull($this->fieldName)
123 ->orderBy(
'alias',
'desc')
125 ->addOrderBy(
't3ver_wsid',
'asc')
127 ->addOrderBy(
'pid',
'asc')
128 ->addOrderBy(
'sorting',
'asc')
132 $suggestedSlugs = [];
140 $fieldConfig[
'generatorOptions'][
'fields'] = [
'tx_realurl_pathsegment,title'];
141 $evalInfo = !empty($fieldConfig[
'eval']) ? GeneralUtility::trimExplode(
',', $fieldConfig[
'eval'],
true) : [];
142 $hasToBeUniqueInSite = in_array(
'uniqueInSite', $evalInfo,
true);
143 $hasToBeUniqueInPid = in_array(
'uniqueInPid', $evalInfo,
true);
144 $slugHelper = GeneralUtility::makeInstance(SlugHelper::class, $this->table, $this->fieldName, $fieldConfig);
145 while ($record = $statement->fetch()) {
146 $recordId = (int)$record[
'uid'];
147 $pid = (int)$record[
'pid'];
148 $languageId = (int)$record[
'sys_language_uid'];
149 $pageIdInDefaultLanguage = $languageId > 0 ? (int)$record[
'l10n_parent'] : $recordId;
150 $slug = $suggestedSlugs[$pageIdInDefaultLanguage][$languageId] ??
'';
153 if (!empty($record[
'alias'])) {
154 $slug = $slugHelper->sanitize(
'/' . $record[
'alias']);
159 $queryBuilder = $connection->createQueryBuilder();
160 $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
161 $liveVersion = $queryBuilder
165 $queryBuilder->expr()->eq(
'uid', $queryBuilder->createNamedParameter($record[
't3ver_oid'], \PDO::PARAM_INT))
166 )->execute()->fetch();
167 $pid = (int)$liveVersion[
'pid'];
169 $slug = $slugHelper->generate($record, $pid);
173 ->fromArray($record, $pid, $recordId);
174 if ($hasToBeUniqueInSite && !$slugHelper->isUniqueInSite($slug, $state)) {
175 $slug = $slugHelper->buildSlugForUniqueInSite($slug, $state);
177 if ($hasToBeUniqueInPid && !$slugHelper->isUniqueInPid($slug, $state)) {
178 $slug = $slugHelper->buildSlugForUniqueInPid($slug, $state);
183 [$this->fieldName => $slug],
197 $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
198 $queryBuilder = $connectionPool->getQueryBuilderForTable($this->table);
199 $queryBuilder->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
201 $numberOfEntries = $queryBuilder
205 $queryBuilder->expr()->orX(
206 $queryBuilder->expr()->eq($this->fieldName, $queryBuilder->createNamedParameter(
'')),
207 $queryBuilder->expr()->isNull($this->fieldName)
212 return $numberOfEntries > 0;
224 $context = GeneralUtility::makeInstance(Context::class);
225 $currentTimestamp = $context->getPropertyFromAspect(
'date',
'timestamp');
227 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);
228 $statement = $queryBuilder
232 $queryBuilder->expr()->eq(
'mpvar', $queryBuilder->createNamedParameter(
'')),
233 $queryBuilder->expr()->orX(
234 $queryBuilder->expr()->eq(
'expire', $queryBuilder->createNamedParameter(0)),
235 $queryBuilder->expr()->gt(
'expire', $queryBuilder->createNamedParameter($currentTimestamp))
238 ->orderBy(
'expire',
'ASC')
240 $suggestedSlugs = [];
241 while ($row = $statement->fetch()) {
243 $pagePath = rawurldecode($row[
'pagepath']);
244 if (!isset($suggestedSlugs[(
int)$row[
'page_id']][(
int)$row[
'language_id']])) {
245 $suggestedSlugs[(int)$row[
'page_id']][(
int)$row[
'language_id']] =
'/' . trim($pagePath,
'/');
248 return $suggestedSlugs;
259 $tableExists = GeneralUtility::makeInstance(ConnectionPool::class)
260 ->getConnectionForTable(
$table)