Skip to content
Snippets Groups Projects
Commit cdaa8c4a authored by Georg Ringer's avatar Georg Ringer
Browse files

[BUGFIX] Make Extbase respect sys_language_mode=strict

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: I36511b2fd7c91f0bed5110c2cf12c04c8bbca9c9
Reviewed-on: https://review.typo3.org/30757
Reviewed-by: Frans Saris
Tested-by: Frans Saris
Reviewed-by: Lorenz Ulrich
Tested-by: Lorenz Ulrich
Reviewed-by: Stefan Froemken
Tested-by: Stefan Froemken
Reviewed-by: Georg Ringer
Tested-by: Georg Ringer
parent 6f809920
No related merge requests found
......@@ -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'])) {
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment