[BUGFIX] Make Extbase respect sys_language_mode=strict 61/31061/2
authorGeorg Ringer <georg.ringer@gmail.com>
Mon, 16 Jun 2014 17:40:52 +0000 (19:40 +0200)
committerGeorg Ringer <georg.ringer@gmail.com>
Mon, 23 Jun 2014 06:39:45 +0000 (08:39 +0200)
The Extbase query parser currently doesn't respect strict language mode
because it doesn't consider records that are only present in a localized
language version, but not in the default language.

As a consequence, records only present in a localized language version
are not fetched at all while for counting/paging the count of the default
language version is used.

This change adds a check for strict language mode and additional query
parts to solve this issue.

Releases: 6.3, 6.2
Resolves: #47183
Change-Id: Ifb0ff6dda648fb4a686992ee6f7c00419a3ee934
Reviewed-on: https://review.typo3.org/31061
Reviewed-by: Georg Ringer
Tested-by: Georg Ringer
typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbQueryParser.php

index c5d0938..ff4167a 100644 (file)
@@ -599,11 +599,24 @@ class Typo3DbQueryParser implements \TYPO3\CMS\Core\SingletonInterface {
                                if (isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])
                                        && $querySettings->getLanguageUid() > 0
                                ) {
-                                       $additionalWhereClause .= ' OR (' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '=0' .
-                                               ' AND ' . $tableName . '.uid NOT IN (SELECT ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] .
-                                               ' FROM ' . $tableName .
-                                               ' WHERE ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] . '>0' .
-                                               ' AND ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '>0';
+
+                                       $mode = $querySettings->getLanguageMode();
+                                       if ($mode === 'strict') {
+                                               $additionalWhereClause = $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '=-1' .
+                                                       ' OR (' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . ' = ' . (int)$querySettings->getLanguageUid() .
+                                                       ' AND ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] . '=0' .
+                                                       ') OR (' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '=0' .
+                                                       ' AND ' . $tableName . '.uid IN (SELECT ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] .
+                                                       ' FROM ' . $tableName .
+                                                       ' WHERE ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] . '>0' .
+                                                       ' AND ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '=' . (int)$querySettings->getLanguageUid() ;
+                                       } else {
+                                               $additionalWhereClause .= ' OR (' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '=0' .
+                                                       ' AND ' . $tableName . '.uid NOT IN (SELECT ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] .
+                                                       ' FROM ' . $tableName .
+                                                       ' WHERE ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'] . '>0' .
+                                                       ' AND ' . $tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'] . '>0';
+                                       }
 
                                        // Add delete clause to ensure all entries are loaded
                                        if (isset($GLOBALS['TCA'][$tableName]['ctrl']['delete'])) {