Project

General

Profile

Bug #91453

Updated by Philipp Seiler over 4 years ago

* Have a page-setup with two languages. 
 * Setup News-Extension for e.g. List view and Detail view on different pages. 
 * Those pages are all translated. 
 * Pages are language-strict, no language-fallbacks for page content is needed. Content is copied or re-created in the translated language. 
 * News-Records usually only exist in the root language (UID 0), they are never or only rarely translated. However, News of the root-language should still all be displayed on the translated pages as fallbacks as well. Therefore the *NewsRepository* is hooked and adjusted, so that *languageFallbacks* are applied. Query is adjusted in the *NewsRepositoryHook*: 

 <pre>$query->getQuerySettings()->setLanguageOverlayMode(true); 
 $query->getQuerySettings()->setLanguageMode('content_fallback');</pre> 

 This worked perfectly until TYPO3 v9.5.15. v9.5.14 still worked. Problem is a change in the *PersistedAliasMapper* and its *findByRouteFieldValue*-method. 

 *PersistedAliasMapper* @ v9.5.14: 
 <pre>$queryBuilder = $this->createQueryBuilder(); 
 $result = $queryBuilder 
     ->select(...$this->persistenceFieldNames) 
     ->where($queryBuilder->expr()->eq( 
         $this->routeFieldName, 
         $queryBuilder->createNamedParameter($value, \PDO::PARAM_STR) 
     )) 
     ->execute() 
     ->fetch(); 
 return $result !== false ? $result : null;</pre> 


 *PersistedAliasMapper* @ v9.5.15: 
 <pre>$languageAware = $this->languageFieldName !== null && $this->languageParentFieldName !== null; 

 $queryBuilder = $this->createQueryBuilder(); 
 $constraints = [ 
     $queryBuilder->expr()->eq( 
         $this->routeFieldName, 
         $queryBuilder->createNamedParameter($value, \PDO::PARAM_STR) 
     ), 
 ]; 

 $languageIds = null; 
 if ($languageAware) { 
     $languageIds = $this->resolveAllRelevantLanguageIds(); 
     $constraints[] = $queryBuilder->expr()->in( 
         $this->languageFieldName, 
         $queryBuilder->createNamedParameter($languageIds, Connection::PARAM_INT_ARRAY) 
     ); 
 } 

 $results = $queryBuilder 
     ->select(...$this->persistenceFieldNames) 
     ->where(...$constraints) 
     ->execute() 
     ->fetchAll(); 
 // return first result record in case table is not language aware 
 if (!$languageAware) { 
     return $results[0] ?? null; 
 } 
 // post-process language fallbacks 
 return $this->resolveLanguageFallback($results, $this->languageFieldName, $languageIds);</pre> 

 The problem is easily found: In the new method, an extra constraint for *sys_language_uid* for the current FE-language page UID is applied, although the News of the resolved News-Slug is not translated. This leads to the News not being found by the *RouteEnhancer*. 

 A simple check if *l10n_parent* and *sys_language_uid* are present in the record's TCA are not enough. Complete language configuration including fallbacks need to be kept in mind here.

Back