32a33 > use TYPO3\CMS\Core\Utility\MathUtility; 341c342,343 < $languageAspect->getOverlayType() === $languageAspect::OVERLAYS_MIXED ? '1' : 'hideNonTranslated' --- > $languageAspect->getOverlayType() === $languageAspect::OVERLAYS_MIXED ? '1' : 'hideNonTranslated', > $languageAspect->getFallbackChain() 394a397,398 > > $overlays = []; 396a401 > $languageUids = array_merge([$languageUid], $this->getLanguagesChain()); 408a414 > $overlays = $this->getOverlaysForLanguageUids($page_ids, $languageUids); 468a475,571 > > /** > * Checks whether the passed (localized) page is accessible with the current language settings > * > * @param array $page > * @param int|null $languageUid > * @return bool > */ > public function pageIsSuitableForLanguage(array $page, int $languageUid = null): bool > { > if ($languageUid === null) { > $languageUid = $this->sys_language_uid; > } > > if ($languageUid > 0) { > $languageUids = array_merge([$languageUid], $this->getLanguagesChain()); > return in_array((int)$page['sys_language_uid'], $languageUids, true); > } > > return GeneralUtility::hideIfDefaultLanguage($page['l18n_cfg']); > } > > /** > * Returns the cleaned fallback chain from the language aspect > * > * @return int[] > */ > protected function getLanguagesChain(): array > { > $languageAspect = GeneralUtility::makeInstance(Context::class)->getAspect('language'); > $languageUids = array_unique(array_filter($languageAspect->getFallbackChain(), function ($item) { > return MathUtility::canBeInterpretedAsInteger($item); > })); > > return $languageUids; > } > > /** > * Returns the first match of overlays for pages in the passed languages. > * > * @param array $pageUids > * @param array $languageUids > * @return array > */ > protected function getOverlaysForLanguageUids(array $pageUids, array $languageUids): array > { > // Remove "0" > $languageUids = array_filter($languageUids); > > $languageField = $GLOBALS['TCA']['pages']['ctrl']['languageField']; > $overlays = []; > > foreach ($pageUids as $pageId) { > $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); > $queryBuilder->setRestrictions(GeneralUtility::makeInstance(FrontendRestrictionContainer::class)); > $result = $queryBuilder->select('*') > ->from('pages') > ->where( > $queryBuilder->expr()->eq( > $GLOBALS['TCA']['pages']['ctrl']['transOrigPointerField'], > $queryBuilder->createNamedParameter($pageId, \PDO::PARAM_INT) > ), > $queryBuilder->expr()->in( > $GLOBALS['TCA']['pages']['ctrl']['languageField'], > $queryBuilder->createNamedParameter($languageUids, Connection::PARAM_INT_ARRAY) > ) > ) > ->execute(); > > // Create a list of rows ordered by values in $languageUids > $orderedListByLanguages = array_flip($languageUids); > while ($row = $result->fetch()) { > $orderedListByLanguages[$row[$languageField]] = $row; > } > > foreach ($orderedListByLanguages as $languageUid => $row) { > if (is_array($row)) { > // Found a result for the current language id > $this->versionOL('pages', $row); > if (is_array($row)) { > $row['_PAGES_OVERLAY'] = true; > $row['_PAGES_OVERLAY_UID'] = $row['uid']; > $row['_PAGES_OVERLAY_LANGUAGE'] = $languageUid; > // Unset vital fields that are NOT allowed to be overlaid: > unset($row['uid'], $row['pid']); > $overlays[$pageId] = $row; > > // Language fallback found, stop querying further languages > break; > } > } > } > unset($orderedListByLanguages); > } > > return $overlays; > } 477a581 > * @param array fallbackChain for translations 481c585 < public function getRecordOverlay($table, $row, $sys_language_content, $OLmode = '') --- > public function getRecordOverlay($table, $row, $sys_language_content, $OLmode = '', $fallbackChain=[]) 510c614,615 < $olrow = $queryBuilder->select('*') --- > $languageChain = $sys_language_content . (count($fallbackChain) ? ',' . $fallbackChain[0] : ''); > $query = $queryBuilder->select('*') 517c622 < $queryBuilder->expr()->eq( --- > $queryBuilder->expr()->in( 519c624 < $queryBuilder->createNamedParameter($sys_language_content, \PDO::PARAM_INT) --- > $queryBuilder->createNamedParameter(GeneralUtility::intExplode(',', $languageChain), Connection::PARAM_INT_ARRAY) 526,528c631,634 < ->setMaxResults(1) < ->execute() < ->fetch(); --- > ->add('orderBy', 'FIELD(' . $tableControl['languageField'] . ', ' . $languageChain . ')', true) > ->setMaxResults(1); > $dbResource = $query->execute(); > $olrow = $dbResource->fetch();