diff --git a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php index 836fbdaaab..311e157f9d 100644 --- a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php +++ b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php @@ -546,8 +546,10 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface { if ($source instanceof Qom\SelectorInterface) { $tableName = $source->getSelectorName(); + $forceRecordReloadInWorkspace = false; } elseif ($source instanceof Qom\JoinInterface) { $tableName = $source->getRight()->getSelectorName(); + $forceRecordReloadInWorkspace = true; } else { // No proper source, so we do not have a table name here // we cannot do an overlay and return the original rows instead. @@ -654,8 +656,10 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface { if ($source instanceof Qom\SelectorInterface) { $tableName = $source->getSelectorName(); + $forceRecordReloadInWorkspace = false; } elseif ($source instanceof Qom\JoinInterface) { $tableName = $source->getRight()->getSelectorName(); + $forceRecordReloadInWorkspace = true; } else { // No proper source, so we do not have a table name here // we cannot do an overlay and return the original rows instead. @@ -677,10 +681,9 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface // by the table and if there's only one row in the result set // (applying this to all rows does not work, since the sorting // order would be destroyed and possible limits not met anymore) - if (!empty($workspaceUid) - && BackendUtility::isTableWorkspaceEnabled($tableName) - && count($rows) === 1 - ) { + $isInWorkspaceContext = !empty($workspaceUid) + && BackendUtility::isTableWorkspaceEnabled($tableName); + if ($isInWorkspaceContext && count($rows) === 1) { $versionId = $workspaceUid; $queryBuilder = $this->connectionPool->getQueryBuilderForTable($tableName); $queryBuilder->getRestrictions()->removeAll(); @@ -697,10 +700,48 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface ->fetchAll(); if (!empty($movePlaceholder)) { $rows = $movePlaceholder; + // Records have been "reloaded" + $forceRecordReloadInWorkspace = false; } } $overlaidRows = []; foreach ($rows as $row) { + $originalRow = $row; + // If current row is a translation or we are in a workspace preview, select its parent + if (isset($tableName) && isset($GLOBALS['TCA'][$tableName]) + && isset($GLOBALS['TCA'][$tableName]['ctrl']['languageField']) + && isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']) + && isset($row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']]) + && ( + $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] > 0 + || ($forceRecordReloadInWorkspace && $isInWorkspaceContext) + ) + ) { + $queryBuilder = $this->connectionPool->getQueryBuilderForTable($tableName); + $queryBuilder->getRestrictions()->removeAll(); + $row = $queryBuilder + ->select($tableName . '.*') + ->from($tableName) + ->where( + $queryBuilder->expr()->eq( + $tableName . '.uid', + $queryBuilder->createNamedParameter( + $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] == 0 ? $row['uid'] : $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']], + \PDO::PARAM_INT + ) + ), + $queryBuilder->expr()->eq( + $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'], + $queryBuilder->createNamedParameter( + 0, + \PDO::PARAM_INT + ) + ) + ) + ->setMaxResults(1) + ->execute() + ->fetch(); + } $pageRepository->versionOL($tableName, $row, true); $querySettings = $query->getQuerySettings(); if (is_array($row) && $querySettings->getLanguageOverlayMode()) { @@ -728,6 +769,10 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface } } if ($row !== null && is_array($row)) { + if ($forceRecordReloadInWorkspace && $isInWorkspaceContext) { + // Add additional fields back to the overlaid record + $row = array_merge($originalRow, $row); + } $overlaidRows[] = $row; } }