From 031920a282afd5df42251829638e38eaefa6e726 Mon Sep 17 00:00:00 2001 From: Oliver Bartsch <bo@cedev.de> Date: Wed, 25 Jan 2023 21:05:58 +0100 Subject: [PATCH] [BUGFIX] Use correct language constraint in PageLayoutController When calculating the number of hidden elements for the currently displayed language columns in the page module, the corresponding language constraint is now properly set. Considering more then one language is now only done, in case language mode with a language > 0 is selected. Additionally, L=-1 is now properly taken into account. Some further cleanup of the method is done. The actually defined field names of corresponding enable columns are now used instead of the static ones. Resolves: #99720 Releases: main, 11.5 Change-Id: I751ea0d2f2de88d5eb208215bb81543fc01ca32b Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/77617 Tested-by: Oliver Bartsch <bo@cedev.de> Reviewed-by: Fabien Udriot <fudriot@omic.ch> Tested-by: core-ci <typo3@b13.com> Reviewed-by: Oliver Bartsch <bo@cedev.de> --- .../Controller/PageLayoutController.php | 55 +++++++++++-------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/typo3/sysext/backend/Classes/Controller/PageLayoutController.php b/typo3/sysext/backend/Classes/Controller/PageLayoutController.php index 149a139f5b85..cc539391cfe5 100644 --- a/typo3/sysext/backend/Classes/Controller/PageLayoutController.php +++ b/typo3/sysext/backend/Classes/Controller/PageLayoutController.php @@ -695,7 +695,7 @@ class PageLayoutController $configuration->setLanguageMode(true); } - $numberOfHiddenElements = $this->getNumberOfHiddenElements($configuration->getLanguageColumns()); + $numberOfHiddenElements = $this->getNumberOfHiddenElements($configuration->getLanguageMode()); $pageActionsInstruction = JavaScriptModuleInstruction::forRequireJS('TYPO3/CMS/Backend/PageActions'); if ($this->context->isPageEditable()) { @@ -900,14 +900,15 @@ class PageLayoutController * Other functions * ******************************/ + /** * Returns the number of hidden elements (including those hidden by start/end times) * on the current page (for the current sys_language) * - * @param array $languageColumns + * @param bool $isLanguageModeActive * @return int */ - protected function getNumberOfHiddenElements(array $languageColumns): int + protected function getNumberOfHiddenElements(bool $isLanguageModeActive): int { $andWhere = []; $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tt_content'); @@ -926,53 +927,63 @@ class PageLayoutController ) ); - if (!empty($languageColumns)) { - // Multi-language view is active - if ($this->current_sys_language > 0) { - $queryBuilder->andWhere( - $queryBuilder->expr()->in( - 'sys_language_uid', - [0, $queryBuilder->createNamedParameter($this->current_sys_language, Connection::PARAM_INT)] - ) - ); - } - } else { + if ($this->current_sys_language === 0) { + // Default language is active (in columns or language mode) - consider "all languages" and the default $queryBuilder->andWhere( - $queryBuilder->expr()->eq( - 'sys_language_uid', - $queryBuilder->createNamedParameter($this->current_sys_language, Connection::PARAM_INT) + $queryBuilder->expr()->in( + $GLOBALS['TCA']['tt_content']['ctrl']['languageField'], + [-1, 0] + ) + ); + } elseif ($isLanguageModeActive && $this->current_sys_language !== -1) { + // Multi-language view with any translation is active - + // consider "all languages", the default and the translation + $queryBuilder->andWhere( + $queryBuilder->expr()->in( + $GLOBALS['TCA']['tt_content']['ctrl']['languageField'], + [-1, 0, $queryBuilder->createNamedParameter($this->current_sys_language, Connection::PARAM_INT)] + ) + ); + } elseif ($this->current_sys_language > 0) { + // Columns mode with any translation is active - consider "all languages" and the translation + $queryBuilder->andWhere( + $queryBuilder->expr()->in( + $GLOBALS['TCA']['tt_content']['ctrl']['languageField'], + [-1, $queryBuilder->createNamedParameter($this->current_sys_language, Connection::PARAM_INT)] ) ); } if (!empty($GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['disabled'])) { $andWhere[] = $queryBuilder->expr()->neq( - 'hidden', + $GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['disabled'], $queryBuilder->createNamedParameter(0, Connection::PARAM_INT) ); } if (!empty($GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['starttime'])) { + $starttimeField = $GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['starttime']; $andWhere[] = $queryBuilder->expr()->andX( $queryBuilder->expr()->neq( - 'starttime', + $starttimeField, $queryBuilder->createNamedParameter(0, Connection::PARAM_INT) ), $queryBuilder->expr()->gt( - 'starttime', + $starttimeField, $queryBuilder->createNamedParameter($GLOBALS['SIM_ACCESS_TIME'], Connection::PARAM_INT) ) ); } if (!empty($GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['endtime'])) { + $endtimeField = $GLOBALS['TCA']['tt_content']['ctrl']['enablecolumns']['endtime']; $andWhere[] = $queryBuilder->expr()->andX( $queryBuilder->expr()->neq( - 'endtime', + $endtimeField, $queryBuilder->createNamedParameter(0, Connection::PARAM_INT) ), $queryBuilder->expr()->lte( - 'endtime', + $endtimeField, $queryBuilder->createNamedParameter($GLOBALS['SIM_ACCESS_TIME'], Connection::PARAM_INT) ) ); -- GitLab