From 1b14468ad99b54dadedd3a667fddd670b29d4dc3 Mon Sep 17 00:00:00 2001 From: Benni Mack <benni@typo3.org> Date: Thu, 16 Nov 2017 15:08:42 +0100 Subject: [PATCH] [TASK] Remove hard-coded l10n_parent fields for pages Due to the change of the pages_language_overlay migration, a lot of hard-coded "l10n_parent" and "sys_language_uid" fields for pages have been introduced. This should be changed into a common function in DataHandler and the TCA option should be used instead. Resolves: #83013 Releases: master Change-Id: I43a33aac1015436109d1ca7b3ea200c78d2a2fb9 Reviewed-on: https://review.typo3.org/54664 Reviewed-by: Susanne Moog <susanne.moog@typo3.org> Tested-by: Susanne Moog <susanne.moog@typo3.org> Tested-by: TYPO3com <no-reply@typo3.com> Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch> Tested-by: Christian Kuhn <lolli@schwarzbu.ch> --- .../Controller/EditDocumentController.php | 8 +- .../Controller/PageLayoutController.php | 16 ++-- .../DatabasePageLanguageOverlayRows.php | 5 +- .../Form/FormDataProvider/TcaInline.php | 4 +- .../Classes/RecordList/AbstractRecordList.php | 8 +- .../backend/Classes/View/PageLayoutView.php | 15 ++-- .../BackendUserAuthentication.php | 2 +- .../core/Classes/DataHandling/DataHandler.php | 76 +++++++++---------- typo3/sysext/filelist/Classes/FileList.php | 11 ++- .../frontend/Classes/Page/PageRepository.php | 8 +- .../frontend/Classes/View/AdminPanelView.php | 4 +- .../TranslationStatusController.php | 4 +- .../sysext/recordlist/Classes/RecordList.php | 8 +- .../Classes/RecordList/DatabaseRecordList.php | 11 ++- .../Controller/ViewModuleController.php | 6 +- .../Classes/Service/WorkspaceService.php | 4 +- 16 files changed, 104 insertions(+), 86 deletions(-) diff --git a/typo3/sysext/backend/Classes/Controller/EditDocumentController.php b/typo3/sysext/backend/Classes/Controller/EditDocumentController.php index 257b654de376..bb4e716c96ea 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 7e5afa411e20..ef0415c83698 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 d2f793c75d07..ec23b5759b46 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 6fc3d6dd50e8..cc8f985d9b3c 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 5bb83cc77379..049847ecea47 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 928fe7683ad0..c43f561523ac 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 f708abc5e61d..1c661673b1fc 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 4e889f472a3a..9274683cd8d7 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 680e0813581f..bda21a1afd81 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 1ede52426a32..269de786bfda 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 76b21e5adc48..ea7966f8d1aa 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 84fef815a37a..7a2f1991296d 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 183dc284f662..df0fdafa4535 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 acd5fac3fdb0..1018922b0ac6 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 8ed60b116995..004db7bd3e5f 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 35e6c5bcc17e..17dcc1bc1f92 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) ) ) -- GitLab