diff --git a/typo3/sysext/backend/Classes/Controller/EditDocumentController.php b/typo3/sysext/backend/Classes/Controller/EditDocumentController.php index 257b654de3769d3c0094e06f947b352734e1b7e5..bb4e716c96ea17dcec9853d66808f5d26ec3c822 100644 --- a/typo3/sysext/backend/Classes/Controller/EditDocumentController.php +++ b/typo3/sysext/backend/Classes/Controller/EditDocumentController.php @@ -1517,9 +1517,9 @@ class EditDocumentController // Get all available languages for the page // If editing a page, the translations of the current UID need to be fetched if ($table === 'pages') { - $row = BackendUtility::getRecord($table, $uid, 'l10n_parent'); + $row = BackendUtility::getRecord($table, $uid, $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']); // Ensure the check is always done against the default language page - $langRows = $this->getLanguages($row['l10n_parent'] ?: $uid); + $langRows = $this->getLanguages($row[$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']] ?: $uid); } else { $langRows = $this->getLanguages($pid); } @@ -1726,8 +1726,8 @@ class EditDocumentController // Add join with pages translations to only show active languages $queryBuilder->from('pages', 'o') ->where( - $queryBuilder->expr()->eq('o.sys_language_uid', $queryBuilder->quoteIdentifier('s.uid')), - $queryBuilder->expr()->eq('o.l10n_parent', $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT)) + $queryBuilder->expr()->eq('o.' . $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->quoteIdentifier('s.uid')), + $queryBuilder->expr()->eq('o.' . $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT)) ); } diff --git a/typo3/sysext/backend/Classes/Controller/PageLayoutController.php b/typo3/sysext/backend/Classes/Controller/PageLayoutController.php index 7e5afa411e205cf5c16bf717700f6e33baacc2c5..ef0415c83698b1559499a8a91a3af9f5994543f7 100644 --- a/typo3/sysext/backend/Classes/Controller/PageLayoutController.php +++ b/typo3/sysext/backend/Classes/Controller/PageLayoutController.php @@ -318,7 +318,7 @@ class PageLayoutController 'pages', $queryBuilder->expr()->eq( 'sys_language.uid', - $queryBuilder->quoteIdentifier('pages.sys_language_uid') + $queryBuilder->quoteIdentifier('pages.' . $GLOBALS['TCA']['pages']['ctrl']['languageField']) ) ) ->where( @@ -327,7 +327,7 @@ class PageLayoutController $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'pages.l10n_parent', + 'pages.' . $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) ), $queryBuilder->expr()->orX( @@ -345,7 +345,7 @@ class PageLayoutController ) ) ->groupBy( - 'pages.sys_language_uid', + 'pages.' . $GLOBALS['TCA']['pages']['ctrl']['languageField'], 'sys_language.uid', 'sys_language.pid', 'sys_language.tstamp', @@ -644,11 +644,11 @@ class PageLayoutController ->from('pages') ->where( $queryBuilder->expr()->eq( - 'l10n_parent', + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'sys_language_uid', + $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->createNamedParameter($this->current_sys_language, \PDO::PARAM_INT) ) ) @@ -994,6 +994,8 @@ class PageLayoutController if ($this->pageIsNotLockedForEditors() && $this->getBackendUser()->checkLanguageAccess(0)) { // Edit localized pages only when one specific language is selected if ($this->MOD_SETTINGS['function'] == 1 && $this->current_sys_language > 0) { + $localizationParentField = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions() @@ -1005,11 +1007,11 @@ class PageLayoutController ->from('pages') ->where( $queryBuilder->expr()->eq( - 'l10n_parent', + $localizationParentField, $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'sys_language_uid', + $languageField, $queryBuilder->createNamedParameter($this->current_sys_language, \PDO::PARAM_INT) ) ) diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabasePageLanguageOverlayRows.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabasePageLanguageOverlayRows.php index d2f793c75d0753a31135c338d9cd74e5e51cf68d..ec23b5759b46c057c3ce33e66a6c0b5959286945 100644 --- a/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabasePageLanguageOverlayRows.php +++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/DatabasePageLanguageOverlayRows.php @@ -60,7 +60,10 @@ class DatabasePageLanguageOverlayRows implements FormDataProviderInterface $rows = $queryBuilder->select('*') ->from('pages') - ->where($queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($pid, \PDO::PARAM_INT))) + ->where($queryBuilder->expr()->eq( + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], + $queryBuilder->createNamedParameter($pid, \PDO::PARAM_INT) + )) ->execute() ->fetchAll(); diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaInline.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaInline.php index 6fc3d6dd50e809e81baa1bcc8782fe978e948fdc..cc8f985d9b3c3d5c436782371c844021fe2e2eae 100644 --- a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaInline.php +++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaInline.php @@ -107,8 +107,8 @@ class TcaInline extends AbstractDatabaseRecordProvider implements FormDataProvid $pid = $row['pid']; } $pageRecord = BackendUtility::getRecord('pages', $pid); - if ((int)$pageRecord['l10n_parent'] > 0) { - $pid = (int)$pageRecord['l10n_parent']; + if ((int)$pageRecord[$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']] > 0) { + $pid = (int)$pageRecord[$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']]; } $result['inlineFirstPid'] = (int)$pid; } diff --git a/typo3/sysext/backend/Classes/RecordList/AbstractRecordList.php b/typo3/sysext/backend/Classes/RecordList/AbstractRecordList.php index 5bb83cc77379ab98c2c12d726d8f0516c24c195f..049847ecea473dfa1ce3d988ae9c4daa34e1d60b 100644 --- a/typo3/sysext/backend/Classes/RecordList/AbstractRecordList.php +++ b/typo3/sysext/backend/Classes/RecordList/AbstractRecordList.php @@ -448,6 +448,8 @@ abstract class AbstractRecordList public function initializeLanguages() { // Look up page overlays: + $localizationParentField = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions() @@ -459,15 +461,15 @@ abstract class AbstractRecordList ->from('pages') ->where( $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), - $queryBuilder->expr()->gt('sys_language_uid', $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)) + $queryBuilder->expr()->eq($localizationParentField, $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), + $queryBuilder->expr()->gt($languageField, $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)) ) ) ->execute(); $this->pageOverlays = []; while ($row = $result->fetch()) { - $this->pageOverlays[$row['sys_language_uid']] = $row; + $this->pageOverlays[$row[$languageField]] = $row; } $this->languageIconTitles = $this->getTranslateTools()->getSystemLanguages($this->id); diff --git a/typo3/sysext/backend/Classes/View/PageLayoutView.php b/typo3/sysext/backend/Classes/View/PageLayoutView.php index 928fe7683ad08e4ac0e321486add2eafcd66a493..c43f561523acd84c298724078882ce3ca569c8cd 100644 --- a/typo3/sysext/backend/Classes/View/PageLayoutView.php +++ b/typo3/sysext/backend/Classes/View/PageLayoutView.php @@ -2448,7 +2448,7 @@ class PageLayoutView implements LoggerAwareInterface 'sys_language', 'pages', 'pages', - $queryBuilder->expr()->eq('sys_language.uid', $queryBuilder->quoteIdentifier('pages.sys_language_uid')) + $queryBuilder->expr()->eq('sys_language.uid', $queryBuilder->quoteIdentifier('pages.' . $GLOBALS['TCA']['pages']['ctrl']['languageField'])) ) ->where( $queryBuilder->expr()->eq( @@ -2456,7 +2456,7 @@ class PageLayoutView implements LoggerAwareInterface $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'pages.l10n_parent', + 'pages.' . $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) ), $queryBuilder->expr()->orX( @@ -2474,7 +2474,7 @@ class PageLayoutView implements LoggerAwareInterface ) ) ->groupBy( - 'pages.sys_language_uid', + 'pages.' . $GLOBALS['TCA']['pages']['ctrl']['languageField'], 'sys_language.uid', 'sys_language.pid', 'sys_language.tstamp', @@ -4292,9 +4292,12 @@ class PageLayoutView implements LoggerAwareInterface ->from('pages') ->where( $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), + $queryBuilder->expr()->eq( + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], + $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) + ), $queryBuilder->expr()->gt( - 'sys_language_uid', + $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ) ) @@ -4303,7 +4306,7 @@ class PageLayoutView implements LoggerAwareInterface $this->pageOverlays = []; while ($row = $result->fetch()) { - $this->pageOverlays[$row['sys_language_uid']] = $row; + $this->pageOverlays[$row[$GLOBALS['TCA']['pages']['ctrl']['languageField']]] = $row; } $this->languageIconTitles = $this->getTranslateTools()->getSystemLanguages($this->id); diff --git a/typo3/sysext/core/Classes/Authentication/BackendUserAuthentication.php b/typo3/sysext/core/Classes/Authentication/BackendUserAuthentication.php index f708abc5e61d02388ba9942d28f3ab66c924fbef..1c661673b1fc0ad9a69abdd73d07dc41c3febbe1 100644 --- a/typo3/sysext/core/Classes/Authentication/BackendUserAuthentication.php +++ b/typo3/sysext/core/Classes/Authentication/BackendUserAuthentication.php @@ -579,7 +579,7 @@ class BackendUserAuthentication extends AbstractUserAuthentication } // Return 0 if page is not within the allowed web mount // Always do this for the default language page record - if (!$this->isInWebMount($row['l10n_parent'] ?: $row['uid'])) { + if (!$this->isInWebMount($row[$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']] ?: $row['uid'])) { return Permission::NOTHING; } $out = Permission::NOTHING; diff --git a/typo3/sysext/core/Classes/DataHandling/DataHandler.php b/typo3/sysext/core/Classes/DataHandling/DataHandler.php index 4e889f472a3a93fde25107f948a068c9f04d59b7..9274683cd8d7afa0d1d706b82ed7c0fc4828fa69 100644 --- a/typo3/sysext/core/Classes/DataHandling/DataHandler.php +++ b/typo3/sysext/core/Classes/DataHandling/DataHandler.php @@ -1040,8 +1040,8 @@ class DataHandler implements LoggerAwareInterface if ($theRealPid >= 0) { // Checks if records can be inserted on this $pid. // If this is a page translation, the check needs to be done for the l10n_parent record - if ($table === 'pages' && $incomingFieldArray['sys_language_uid'] > 0 && $incomingFieldArray['l10n_parent'] > 0) { - $recordAccess = $this->checkRecordInsertAccess($table, $incomingFieldArray['l10n_parent']); + if ($table === 'pages' && $incomingFieldArray[$GLOBALS['TCA'][$table]['ctrl']['languageField']] > 0 && $incomingFieldArray[$GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField']] > 0) { + $recordAccess = $this->checkRecordInsertAccess($table, $incomingFieldArray[$GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField']]); } else { $recordAccess = $this->checkRecordInsertAccess($table, $theRealPid); } @@ -1313,10 +1313,7 @@ class DataHandler implements LoggerAwareInterface // Points to a page on which to insert the element, possibly in the top of the page if ($pid >= 0) { // Ensure that the "pid" is not a translated page ID, but the default page ID - $localizationParent = $this->recordInfo('pages', $pid, 'l10n_parent'); - if ($localizationParent['l10n_parent'] > 0) { - $pid = (int)$localizationParent['l10n_parent']; - } + $pid = $this->getDefaultLanguagePageId($pid); // The numerical pid is inserted in the data array $fieldArray['pid'] = $pid; // If this table is sorted we better find the top sorting number @@ -1333,13 +1330,8 @@ class DataHandler implements LoggerAwareInterface } else { // Here we fetch the PID of the record that we point to $record = $this->recordInfo($table, abs($pid), 'pid'); - $pid = $record['pid']; // Ensure that the "pid" is not a translated page ID, but the default page ID - $localizationParent = $this->recordInfo('pages', $pid, 'l10n_parent'); - if ($localizationParent['l10n_parent'] > 0) { - $pid = (int)$localizationParent['l10n_parent']; - } - $fieldArray['pid'] = $pid; + $fieldArray['pid'] = $this->getDefaultLanguagePageId($record['pid']); } return $fieldArray; } @@ -4419,13 +4411,12 @@ class DataHandler implements LoggerAwareInterface // Check if this is a translation of a page, if so then it just needs to be kept "sorting" in sync // Usually called from moveL10nOverlayRecords() - $originalTranslationRecord = null; if ($table === 'pages') { - $fullRecord = $this->recordInfo($table, $uid, 'sys_language_uid, l10n_parent'); - if ($fullRecord['sys_language_uid'] > 0) { - $originalTranslationRecord = $this->recordInfo($table, $fullRecord['l10n_parent'], 'pid,' . $sortRow); + $defaultLanguagePageId = $this->getDefaultLanguagePageId((int)$uid); + if ($defaultLanguagePageId !== (int)$uid) { + $originalTranslationRecord = $this->recordInfo($table, $defaultLanguagePageId, 'pid,' . $sortRow); $updateFields[$sortRow] = $originalTranslationRecord[$sortRow]; - // Ensure that the PID is always the same as the original page + // Ensure that the PID is always the same as the default language page $destPid = $originalTranslationRecord['pid']; } } @@ -5096,8 +5087,8 @@ class DataHandler implements LoggerAwareInterface $fullLanguageAccessCheck = true; if ($table === 'pages') { // If this is a page translation, the full language access check should not be done - $recordInfo = $this->recordInfo($table, $uid, 'l10n_parent'); - if ($recordInfo['l10n_parent'] > 0) { + $defaultLanguagePageId = $this->getDefaultLanguagePageId($uid); + if ($defaultLanguagePageId !== $uid) { $fullLanguageAccessCheck = false; } } @@ -5421,10 +5412,10 @@ class DataHandler implements LoggerAwareInterface // If we may at all delete this page // If this is a page translation, do the check against the perms_* of the default page // Because it is currently only deleting the translation - $fullRecord = $this->recordInfo('pages', $uid, 'l10n_parent'); - if ($fullRecord['l10n_parent'] > 0) { - if ($this->doesRecordExist('pages', (int)$fullRecord['l10n_parent'], 'delete')) { - $isTranslatedPage = $fullRecord['l10n_parent'] > 0; + $defaultLanguagePageId = $this->getDefaultLanguagePageId($uid); + if ($defaultLanguagePageId !== $uid) { + if ($this->doesRecordExist('pages', (int)$defaultLanguagePageId, 'delete')) { + $isTranslatedPage = true; } else { return 'Attempt to delete page without permissions'; } @@ -6089,10 +6080,7 @@ class DataHandler implements LoggerAwareInterface // Update child records if change to pid is required (only if the current record is not on a workspace): if ($thePidToUpdate) { // Ensure that only the default language page is used as PID - $localizationParent = $this->recordInfo('pages', $thePidToUpdate, 'l10n_parent'); - if ($localizationParent['l10n_parent'] > 0) { - $thePidToUpdate = $localizationParent['l10n_parent']; - } + $thePidToUpdate = $this->getDefaultLanguagePageId($thePidToUpdate); // ensure, only live page ids are used as 'pid' values $liveId = BackendUtility::getLiveVersionIdOfRecord('pages', $theUidToUpdate); if ($liveId !== null) { @@ -6479,12 +6467,8 @@ class DataHandler implements LoggerAwareInterface } // permissions check for page translations need to be done on the parent page if ($table === 'pages') { - $defaultLanguagePage = $this->recordInfo($table, $id, 'l10n_parent'); - if ($defaultLanguagePage['l10n_parent'] > 0) { - $res = $this->doesRecordExist($table, $defaultLanguagePage['l10n_parent'], 'edit'); - } else { - $res = $this->doesRecordExist($table, $id, 'edit') ? 1 : 0; - } + $defaultLanguagePageId = $this->getDefaultLanguagePageId($id); + $res = $this->doesRecordExist($table, $defaultLanguagePageId, 'edit') ? 1 : 0; } elseif ($this->doesRecordExist($table, $id, 'edit')) { $res = 1; } @@ -7517,7 +7501,7 @@ class DataHandler implements LoggerAwareInterface $queryBuilder->createNamedParameter($pid, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'sys_language_uid', + $GLOBALS['TCA'][$table]['ctrl']['languageField'], $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ), $queryBuilder->expr()->lt( @@ -8407,12 +8391,7 @@ class DataHandler implements LoggerAwareInterface $pageIdsThatNeedCacheFlush = []; if ($table === 'pages') { // Find out if the record is a get the original page - $row = $this->recordInfo($table, $uid, 'pid,sys_language_uid,l10n_parent'); - if ((int)$row['l10n_parent'] > 0) { - $pageUid = $row['l10n_parent']; - } else { - $pageUid = $uid; - } + $pageUid = $this->getDefaultLanguagePageId($uid); // Builds list of pages on the SAME level as this page (siblings) $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class); @@ -8747,6 +8726,23 @@ class DataHandler implements LoggerAwareInterface * *****************************/ + /** + * Find out if the record is a get the original page + * + * @param int $pageId the page UID (can be the default page record, or a page translation record ID) + * @return int the page UID of the default page record + */ + protected function getDefaultLanguagePageId(int $pageId): int + { + $localizationParentFieldName = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $row = $this->recordInfo('pages', $pageId, $localizationParentFieldName); + $localizationParent = (int)$row[$localizationParentFieldName]; + if ($localizationParent > 0) { + return $localizationParent; + } + return $pageId; + } + /** * Preprocesses field array based on field type. Some fields must be adjusted * before going to database. This is done on the copy of the field array because diff --git a/typo3/sysext/filelist/Classes/FileList.php b/typo3/sysext/filelist/Classes/FileList.php index 680e0813581fed8ac0be61927589a66d8142b3a2..bda21a1afd81f6ecf18729c73e104e35c808ab07 100644 --- a/typo3/sysext/filelist/Classes/FileList.php +++ b/typo3/sysext/filelist/Classes/FileList.php @@ -751,6 +751,8 @@ class FileList public function initializeLanguages() { // Look up page overlays: + $localizationParentField = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions() @@ -762,9 +764,12 @@ class FileList ->from('pages') ->where( $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), + $queryBuilder->expr()->eq( + $localizationParentField, + $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) + ), $queryBuilder->expr()->gt( - 'sys_language_uid', + $languageField, $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ) ) @@ -773,7 +778,7 @@ class FileList $this->pageOverlays = []; while ($row = $result->fetch()) { - $this->pageOverlays[$row['sys_language_uid']] = $row; + $this->pageOverlays[$row[$languageField]] = $row; } $this->languageIconTitles = $this->getTranslateTools()->getSystemLanguages($this->id); diff --git a/typo3/sysext/frontend/Classes/Page/PageRepository.php b/typo3/sysext/frontend/Classes/Page/PageRepository.php index 1ede52426a32af0b1e04d3a7d2a7c199ffc2e8a9..269de786bfdad6416d03c4e31a8ec0bcf7b66c90 100644 --- a/typo3/sysext/frontend/Classes/Page/PageRepository.php +++ b/typo3/sysext/frontend/Classes/Page/PageRepository.php @@ -468,11 +468,11 @@ class PageRepository implements LoggerAwareInterface ->from('pages') ->where( $queryBuilder->expr()->in( - 'l10n_parent', + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($page_ids, Connection::PARAM_INT_ARRAY) ), $queryBuilder->expr()->eq( - 'sys_language_uid', + $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->createNamedParameter($lUid, \PDO::PARAM_INT) ) ) @@ -485,7 +485,7 @@ class PageRepository implements LoggerAwareInterface $row['_PAGES_OVERLAY'] = true; $row['_PAGES_OVERLAY_UID'] = $row['uid']; $row['_PAGES_OVERLAY_LANGUAGE'] = $lUid; - $origUid = $row['l10n_parent']; + $origUid = $row[$GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']]; // Unset vital fields that are NOT allowed to be overlaid: unset($row['uid']); unset($row['pid']); @@ -696,7 +696,7 @@ class PageRepository implements LoggerAwareInterface $queryBuilder->createNamedParameter($pageIds, Connection::PARAM_INT_ARRAY) ), $queryBuilder->expr()->eq( - 'sys_language_uid', + $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ), QueryHelper::stripLogicalOperatorPrefix($this->where_hid_del), diff --git a/typo3/sysext/frontend/Classes/View/AdminPanelView.php b/typo3/sysext/frontend/Classes/View/AdminPanelView.php index 76b21e5adc48d510990ecd717c7494fd4191221f..ea7966f8d1aa3ff4edb85b87c77207fa94964acc 100644 --- a/typo3/sysext/frontend/Classes/View/AdminPanelView.php +++ b/typo3/sysext/frontend/Classes/View/AdminPanelView.php @@ -968,11 +968,11 @@ class AdminPanelView ->from('pages') ->where( $queryBuilder->expr()->eq( - 'l10n_parent', + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'sys_language_uid', + $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->createNamedParameter($tsfe->sys_language_uid, \PDO::PARAM_INT) ) ) diff --git a/typo3/sysext/info/Classes/Controller/TranslationStatusController.php b/typo3/sysext/info/Classes/Controller/TranslationStatusController.php index 84fef815a37a4ae30c1bebe5556ed6d0a42ed113..7a2f1991296df36c277e1d2f342b85fa5e552f44 100644 --- a/typo3/sysext/info/Classes/Controller/TranslationStatusController.php +++ b/typo3/sysext/info/Classes/Controller/TranslationStatusController.php @@ -397,13 +397,13 @@ class TranslationStatusController extends \TYPO3\CMS\Backend\Module\AbstractFunc ->from('pages') ->where( $queryBuilder->expr()->eq( - 'l10n_parent', + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($pageId, \PDO::PARAM_INT) ) ) ->andWhere( $queryBuilder->expr()->eq( - 'sys_language_uid', + $GLOBALS['TCA']['pages']['ctrl']['languageField'], $queryBuilder->createNamedParameter($langId, \PDO::PARAM_INT) ) ) diff --git a/typo3/sysext/recordlist/Classes/RecordList.php b/typo3/sysext/recordlist/Classes/RecordList.php index 183dc284f662881513ef151d8acf471ad11f4fa7..df0fdafa45359ecda538304b26e1f24adc276035 100644 --- a/typo3/sysext/recordlist/Classes/RecordList.php +++ b/typo3/sysext/recordlist/Classes/RecordList.php @@ -618,6 +618,8 @@ class RecordList } } // Then, subtract the languages which are already on the page: + $localizationParentField = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_language'); $queryBuilder->getRestrictions()->removeAll(); $queryBuilder->select('sys_language.uid AS uid', 'sys_language.title AS title') @@ -626,7 +628,7 @@ class RecordList 'sys_language', 'pages', 'pages', - $queryBuilder->expr()->eq('sys_language.uid', $queryBuilder->quoteIdentifier('pages.sys_language_uid')) + $queryBuilder->expr()->eq('sys_language.uid', $queryBuilder->quoteIdentifier('pages.' . $languageField)) ) ->where( $queryBuilder->expr()->eq( @@ -634,7 +636,7 @@ class RecordList $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( - 'pages.l10n_parent', + 'pages.' . $localizationParentField, $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT) ), $queryBuilder->expr()->orX( @@ -652,7 +654,7 @@ class RecordList ) ) ->groupBy( - 'pages.sys_language_uid', + 'pages.' . $languageField, 'sys_language.uid', 'sys_language.pid', 'sys_language.tstamp', diff --git a/typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php b/typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php index acd5fac3fdb07a2b2c7c859ecfc85799d1a2419b..1018922b0ac6db3f9e88e4e69df74294fdf29290 100644 --- a/typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php +++ b/typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php @@ -2071,8 +2071,9 @@ class DatabaseRecordList $params = 'cmd[' . $table . '][' . $row['uid'] . '][delete]=1'; $icon = $this->iconFactory->getIcon('actions-edit-' . $actionName, Icon::SIZE_SMALL)->render(); $linkTitle = htmlspecialchars($this->getLanguageService()->getLL($actionName)); + $l10nParentField = $GLOBALS['TCA'][$table]['ctrl']['transOrigPointerField'] ?? ''; $deleteAction = '<a class="btn btn-default t3js-record-delete" href="#" ' - . ' data-l10parent="' . htmlspecialchars($row['l10n_parent']) . '"' + . ' data-l10parent="' . ($l10nParentField ? htmlspecialchars($row[$l10nParentField]) : '') . '"' . ' data-params="' . htmlspecialchars($params) . '" data-title="' . htmlspecialchars($title) . '"' . ' data-message="' . htmlspecialchars($warningText) . '" title="' . $linkTitle . '"' . '>' . $icon . '</a>'; @@ -4134,6 +4135,8 @@ class DatabaseRecordList public function initializeLanguages() { // Look up page overlays: + $localizationParentField = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class) ->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions() @@ -4145,9 +4148,9 @@ class DatabaseRecordList ->from('pages') ->where( $queryBuilder->expr()->andX( - $queryBuilder->expr()->eq('l10n_parent', $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), + $queryBuilder->expr()->eq($localizationParentField, $queryBuilder->createNamedParameter($this->id, \PDO::PARAM_INT)), $queryBuilder->expr()->gt( - 'sys_language_uid', + $languageField, $queryBuilder->createNamedParameter(0, \PDO::PARAM_INT) ) ) @@ -4156,7 +4159,7 @@ class DatabaseRecordList $this->pageOverlays = []; while ($row = $result->fetch()) { - $this->pageOverlays[$row['sys_language_uid']] = $row; + $this->pageOverlays[$row[$languageField]] = $row; } $this->languageIconTitles = $this->getTranslateTools()->getSystemLanguages($this->id); diff --git a/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php b/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php index 8ed60b116995ff9bc707c7fc0216094739fffac9..004db7bd3e5f6c38f181f67f9c849ef633ca5a3e 100644 --- a/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php +++ b/typo3/sysext/viewpage/Classes/Controller/ViewModuleController.php @@ -306,6 +306,8 @@ class ViewModuleController extends ActionController */ protected function getPreviewLanguages() { + $localizationParentField = $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField']; + $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; $pageIdToShow = (int)GeneralUtility::_GP('id'); $modSharedTSconfig = BackendUtility::getModTSconfig($pageIdToShow, 'mod.SHARED'); if ($modSharedTSconfig['properties']['view.']['disableLanguageSelector'] === '1') { @@ -331,11 +333,11 @@ class ViewModuleController extends ActionController 'sys_language', 'pages', 'o', - $queryBuilder->expr()->eq('o.sys_language_uid', $queryBuilder->quoteIdentifier('sys_language.uid')) + $queryBuilder->expr()->eq('o.' . $languageField, $queryBuilder->quoteIdentifier('sys_language.uid')) ) ->where( $queryBuilder->expr()->eq( - 'o.l10n_parent', + 'o.' . $localizationParentField, $queryBuilder->createNamedParameter($pageIdToShow, \PDO::PARAM_INT) ) ) diff --git a/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php b/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php index 35e6c5bcc17e53a220ad513a3e8a561512cf444b..17dcc1bc1f92cd3597afd7e6b39a18c15a8500fa 100644 --- a/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php +++ b/typo3/sysext/workspaces/Classes/Service/WorkspaceService.php @@ -701,7 +701,7 @@ class WorkspaceService implements SingletonInterface ->from('pages') ->where( $queryBuilder->expr()->eq( - 'l10n_parent', + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($id, \PDO::PARAM_INT) ), $queryBuilder->expr()->eq( @@ -1141,7 +1141,7 @@ class WorkspaceService implements SingletonInterface ->from('pages') ->where( $queryBuilder->expr()->eq( - 'l10n_parent', + $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], $queryBuilder->createNamedParameter($pageId, \PDO::PARAM_INT) ) )