Bug #91453

PersistedAliasMapper not finding record, if non-translated

Added by Philipp Seiler 5 months ago. Updated 5 months ago.

Status:
New
Priority:
Should have
Assignee:
-
Category:
Link Handling, Site Handling & Routing
Target version:
-
Start date:
2020-05-20
Due date:
% Done:

0%

TYPO3 Version:
9
PHP Version:
7.2
Tags:
routeenhancer,route,enhancer,news,mapper,language,translation
Complexity:
Is Regression:
Sprint Focus:

Description

  • 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:
$query->getQuerySettings()->setLanguageOverlayMode(true);
$query->getQuerySettings()->setLanguageMode('content_fallback');

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:

$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;

PersistedAliasMapper @ v9.5.15:

$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);

The problem is easily found: In the new method, an extra constraint for sys_language_uid for the current FE-language 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.


Related issues

Related to TYPO3 Core - Bug #89153: Wrong Extbase record is shown for slug Closed 2019-09-11

History

#1 Updated by Philipp Seiler 5 months ago

  • Description updated (diff)

#2 Updated by Ralph Brugger 5 months ago

Same problem here. Records won't be found resulting in an error 404.
Rolled back to the old findByRouteFieldValue method.

#3 Updated by Oliver Hader 5 months ago

  • Related to Bug #89153: Wrong Extbase record is shown for slug added

Also available in: Atom PDF