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