From 7e8a72cfde06597eca5c4d30ecbdb6b3ab7a541d Mon Sep 17 00:00:00 2001 From: Georg Ringer <georg.ringer@gmail.com> Date: Tue, 22 May 2018 16:22:35 +0200 Subject: [PATCH] [BUGFIX] Honor l18n_cfg settings in PageRepository If a page record is fetched from the database, the PageRepository needs to care about the l18n_cfg setting for this page. Resolves: #85063 Releases: master, 8.7 Change-Id: Ib0338a4725a3b569b91f27baa3a59cabee6fe2fb Reviewed-on: https://review.typo3.org/57038 Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de> Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de> Tested-by: TYPO3com <no-reply@typo3.com> Tested-by: Mona Muzaffar <mona.muzaffar@gmx.de> Reviewed-by: Mona Muzaffar <mona.muzaffar@gmx.de> Reviewed-by: Andreas Wolf <andreas.wolf@typo3.org> Tested-by: Andreas Wolf <andreas.wolf@typo3.org> --- .../frontend/Classes/Page/PageRepository.php | 25 +++++++++++++------ .../Tests/Functional/Fixtures/pages.xml | 17 +++++++++++++ .../Functional/Page/PageRepositoryTest.php | 9 +++++++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/typo3/sysext/frontend/Classes/Page/PageRepository.php b/typo3/sysext/frontend/Classes/Page/PageRepository.php index 5c82755afadb..2a62d44ec186 100644 --- a/typo3/sysext/frontend/Classes/Page/PageRepository.php +++ b/typo3/sysext/frontend/Classes/Page/PageRepository.php @@ -235,7 +235,7 @@ class PageRepository implements LoggerAwareInterface * The page record is either served from a first-level cache or loaded from the * database. If no page can be found, an empty array is returned. * - * Language overlay and versioning overlay are applied. Mount Point + * Language overlay and version overlay are applied. Mount Point * handling is not done, an overlaid Mount Point is not replaced. * * The result is conditioned by the public properties where_groupAccess @@ -297,9 +297,16 @@ class PageRepository implements LoggerAwareInterface $row = $queryBuilder->execute()->fetch(); if ($row) { - $this->versionOL('pages', $row); - if (is_array($row)) { - $result = $this->getPageOverlay($row); + $tsfe = $this->getTypoScriptFrontendController(); + if ($tsfe->sys_language_uid > 0 || !GeneralUtility::hideIfDefaultLanguage($row['l18n_cfg'])) { + $this->versionOL('pages', $row); + if (is_array($row)) { + $row = $this->getPageOverlay($row); + + if ($tsfe->sys_language_uid === 0 || isset($row['_PAGES_OVERLAY']) || !GeneralUtility::hideIfNotTranslated($row['l18n_cfg'])) { + $result = $row; + } + } } } $this->cache_getPage[$uid][$cacheKey] = $result; @@ -727,6 +734,10 @@ class PageRepository implements LoggerAwareInterface $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('pages'); $queryBuilder->getRestrictions()->removeAll(); + // Always ensure fetching l18n_cfg for further processing + if ($fields !== '*' && !GeneralUtility::inList($fields, 'l18n_cfg')) { + $fields .= ',l18n_cfg'; + } $res = $queryBuilder->select(...GeneralUtility::trimExplode(',', $fields, true)) ->from('pages') ->where( @@ -757,9 +768,9 @@ class PageRepository implements LoggerAwareInterface // Versioning Preview Overlay $this->versionOL('pages', $page, true); - // Skip if page got disabled due to version overlay - // (might be delete or move placeholder) - if (empty($page)) { + // Skip if page got disabled due to version overlay or default language should be hidden + // (might be deleted or move placeholder) + if (empty($page) || GeneralUtility::hideIfDefaultLanguage($page['l18n_cfg'])) { continue; } diff --git a/typo3/sysext/frontend/Tests/Functional/Fixtures/pages.xml b/typo3/sysext/frontend/Tests/Functional/Fixtures/pages.xml index abb60ee80448..40e7612bacfa 100644 --- a/typo3/sysext/frontend/Tests/Functional/Fixtures/pages.xml +++ b/typo3/sysext/frontend/Tests/Functional/Fixtures/pages.xml @@ -95,6 +95,23 @@ <perms_everybody>15</perms_everybody> </pages> + <pages> + <uid>501</uid> + <pid>1</pid> + <title>Localization 1-501</title> + <deleted>0</deleted> + <l18n_cfg>1</l18n_cfg> + </pages> + <pages> + <uid>502</uid> + <pid>1</pid> + <title>Ãœbersetzung 1-501</title> + <deleted>0</deleted> + <l10n_parent>501</l10n_parent> + <l18n_cfg>1</l18n_cfg> + <sys_language_uid>1</sys_language_uid> + </pages> + <pages> <uid>901</uid> <pid>0</pid> diff --git a/typo3/sysext/frontend/Tests/Functional/Page/PageRepositoryTest.php b/typo3/sysext/frontend/Tests/Functional/Page/PageRepositoryTest.php index b24b527a6a5e..c99603ac033b 100644 --- a/typo3/sysext/frontend/Tests/Functional/Page/PageRepositoryTest.php +++ b/typo3/sysext/frontend/Tests/Functional/Page/PageRepositoryTest.php @@ -95,6 +95,15 @@ class PageRepositoryTest extends \TYPO3\TestingFramework\Core\Functional\Functio $this->assertCount(5, $rows); } + /** + * @test + */ + public function getPageReturnsEmptyArrayWithHideIfDefaultLanguage() + { + $row = $this->pageRepo->getPage(501); + $this->assertSame([], $row); + } + /** * @test */ -- GitLab