2 declare(strict_types = 1);
18 use Symfony\Component\Console\Output\OutputInterface;
19 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
40 return 'pagesLanguageOverlay';
48 return 'Migrate content from pages_language_overlay to pages';
56 return 'The table pages_language_overlay will be removed to align the translation '
57 .
'handling for pages with the rest of the core. This wizard transfers all data to the pages '
58 .
'table by creating new entries and linking them to the l10n parent. This might take a while, '
59 .
'because max. (amount of pages) x (active languages) new entries need be created.';
82 DatabaseUpdatedPrerequisite::class
104 if (isset(
$GLOBALS[
'TCA'][
'pages_language_overlay'][
'columns'])
105 && is_array(
$GLOBALS[
'TCA'][
'pages_language_overlay'][
'columns'])
107 foreach (
$GLOBALS[
'TCA'][
'pages_language_overlay'][
'columns'] as $fieldName => $fieldConfiguration) {
108 if (isset($fieldConfiguration[
'config'][
'MM'])) {
109 $this->output->writeln(
'The pages_language_overlay field ' . $fieldName
110 .
' with its MM relation configuration can not be migrated'
111 .
' automatically. Existing data relations to this field have'
112 .
' to be migrated manually.');
118 GeneralUtility::makeInstance(LoadTcaService::class)->loadExtensionTablesWithoutMigration();
137 $overlayQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages_language_overlay');
138 $overlayQueryBuilder->getRestrictions()->removeAll();
139 $overlayRecords = $overlayQueryBuilder
141 ->from(
'pages_language_overlay')
143 $pagesConnection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable(
'pages');
144 $pagesColumns = $pagesConnection->getSchemaManager()->listTableDetails(
'pages')->getColumns();
145 $pagesColumnTypes = [];
146 foreach ($pagesColumns as $pageColumn) {
147 $pagesColumnTypes[$pageColumn->getName()] = $pageColumn->getType()->getBindingType();
149 while ($overlayRecord = $overlayRecords->fetch()) {
156 $originalPageId = (int)$overlayRecord[
'pid'];
159 foreach ($pagesColumns as $pageColumn) {
160 $name = $pageColumn->getName();
161 if (isset($overlayRecord[$name])) {
162 $values[$name] = $overlayRecord[$name];
163 } elseif (isset($page[$name])) {
164 $values[$name] = $page[$name];
168 $values[
'pid'] = $page[
'pid'];
169 $values[
'l10n_parent'] = $originalPageId;
170 $values[
'l10n_source'] = $originalPageId;
171 $values[
'legacy_overlay_uid'] = $overlayRecord[
'uid'];
172 unset($values[
'uid']);
173 $pagesConnection->insert(
189 if (isset(
$GLOBALS[
'TCA'][
'pages_language_overlay'][
'columns']) && is_array(
$GLOBALS[
'TCA'][
'pages_language_overlay'][
'columns'])) {
190 foreach (
$GLOBALS[
'TCA'][
'pages_language_overlay'][
'columns'] as $fieldName => $fieldConfiguration) {
192 if ($fieldConfiguration[
'config'][
'type'] ===
'inline'
193 && !empty($fieldConfiguration[
'config'][
'foreign_field'])
194 && !empty($fieldConfiguration[
'config'][
'foreign_table'])
195 && !empty($fieldConfiguration[
'config'][
'foreign_table_field'])
197 $foreignTable = trim($fieldConfiguration[
'config'][
'foreign_table']);
198 $foreignField = trim($fieldConfiguration[
'config'][
'foreign_field']);
199 $foreignTableField = trim($fieldConfiguration[
'config'][
'foreign_table_field']);
200 $translatedPagesQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
201 $translatedPagesQueryBuilder->getRestrictions()->removeAll();
202 $translatedPagesRows = $translatedPagesQueryBuilder
203 ->select(
'uid',
'legacy_overlay_uid')
206 $translatedPagesQueryBuilder->expr()->gt(
208 $translatedPagesQueryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
212 while ($translatedPageRow = $translatedPagesRows->fetch()) {
213 $foreignTableQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($foreignTable);
214 $foreignTableQueryBuilder->getRestrictions()->removeAll();
215 $foreignTableQueryBuilder
216 ->update($foreignTable)
217 ->set($foreignField, $translatedPageRow[
'uid'])
218 ->set($foreignTableField,
'pages')
220 $foreignTableQueryBuilder->expr()->eq(
222 $foreignTableQueryBuilder->createNamedParameter($translatedPageRow[
'legacy_overlay_uid'], \PDO::PARAM_INT)
224 $foreignTableQueryBuilder->expr()->eq(
226 $foreignTableQueryBuilder->createNamedParameter(
'pages_language_overlay', \PDO::PARAM_STR)
242 $translatedPagesQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
243 $translatedPagesQueryBuilder->getRestrictions()->removeAll();
244 $translatedPagesRows = $translatedPagesQueryBuilder
245 ->select(
'uid',
'legacy_overlay_uid')
248 $translatedPagesQueryBuilder->expr()->gt(
250 $translatedPagesQueryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
254 while ($translatedPageRow = $translatedPagesRows->fetch()) {
255 $historyTableQueryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'sys_history');
256 $historyTableQueryBuilder->getRestrictions()->removeAll();
257 $historyTableQueryBuilder
258 ->update(
'sys_history')
259 ->set(
'tablename',
'pages')
260 ->set(
'recuid', $translatedPageRow[
'uid'])
262 $historyTableQueryBuilder->expr()->eq(
264 $historyTableQueryBuilder->createNamedParameter($translatedPageRow[
'legacy_overlay_uid'], \PDO::PARAM_INT)
266 $historyTableQueryBuilder->expr()->eq(
268 $historyTableQueryBuilder->createNamedParameter(
'pages_language_overlay', \PDO::PARAM_STR)
283 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
284 $queryBuilder->getRestrictions()->removeAll();
285 $page = $queryBuilder
289 $queryBuilder->expr()->eq(
291 $queryBuilder->createNamedParameter($pageId, \PDO::PARAM_INT)
308 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable(
'pages');
309 $queryBuilder->getRestrictions()->removeAll();
310 $migratedRecord = $queryBuilder
314 $queryBuilder->expr()->eq(
315 'legacy_overlay_uid',
316 $queryBuilder->createNamedParameter($overlayUid, \PDO::PARAM_INT)
321 return !empty($migratedRecord);
332 $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
333 $connection = $connectionPool->getConnectionByName(
'Default');
334 $tableNames = $connection->getSchemaManager()->listTableNames();
335 if (in_array(
'pages_language_overlay', $tableNames,
true)) {
337 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
338 ->getQueryBuilderForTable(
'pages_language_overlay');
339 $numberOfEntries = $queryBuilder->count(
'*')
340 ->from(
'pages_language_overlay')
343 return (
bool)$numberOfEntries;
357 GeneralUtility::makeInstance(ConfigurationManager::class)->enableFeature(
'unifiedPageTranslationHandling');