diff --git a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php index 836fbdaaab..8ecb1c9559 100644 --- a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php +++ b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php @@ -704,26 +704,31 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface $pageRepository->versionOL($tableName, $row, true); $querySettings = $query->getQuerySettings(); if (is_array($row) && $querySettings->getLanguageOverlayMode()) { + $languageUid = (int)$querySettings->getLanguageUid(); + if (!$querySettings->getRespectSysLanguage() + && isset($row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']]) + && $row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']] > 0 + && (!$query instanceof Query || !$query->getParentQuery()) + ) { + //no parent query means we're processing the aggregate root. + //respectSysLanguage is false which means that records returned by the query + //might be from different languages (which is desired). + //So we need to force language used for overlay to the language of the current record. + $languageUid = $row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']]; + } + if (isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']) && $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] > 0) { + //force overlay by faking default language record, as getRecordOverlay can only handle default language records + $row['uid'] = $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']]; + $row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']] = 0; + } if ($tableName === 'pages') { $row = $pageRepository->getPageOverlay($row, $querySettings->getLanguageUid()); - } else { - $languageUid = (int)$querySettings->getLanguageUid(); - if (!$querySettings->getRespectSysLanguage() - && isset($row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']]) - && $row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']] > 0 - && (!$query instanceof Query || !$query->getParentQuery()) - ) { - //no parent query means we're processing the aggregate root. - //respectSysLanguage is false which means that records returned by the query - //might be from different languages (which is desired). - //So we need to force language used for overlay to the language of the current record. - $languageUid = $row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']]; - } - if (isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']) && $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] > 0) { - //force overlay by faking default language record, as getRecordOverlay can only handle default language records - $row['uid'] = $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']]; - $row[$GLOBALS['TCA'][$tableName]['ctrl']['languageField']] = 0; + // the data mapper only checks for _LOCALIZED_UID when setting '_localizedUid' property + // and not _PAGES_OVERLAY_UID. This is the easy fix. + if (!empty($row['_PAGES_OVERLAY_UID']) && $row['_PAGES_OVERLAY_UID']) { + $row['_LOCALIZED_UID'] = $row['_PAGES_OVERLAY_UID']; } + } else { $row = $pageRepository->getRecordOverlay($tableName, $row, $languageUid, (string)$querySettings->getLanguageOverlayMode()); } }