From a1f59825dfa971aef0a3359d205c37aad76b1bff Mon Sep 17 00:00:00 2001
From: Sebastian Michaelsen <sebastian@michaelsen.io>
Date: Tue, 8 Dec 2020 12:27:15 +0100
Subject: [PATCH] [BUGFIX] Respect query settings for version overlay enable
 fields

Resolves: #93027
Releases: main, 11.5
Change-Id: I65b4b84a12cf4985d14a62217b075e5c421e0ee6
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/67072
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: core-ci <typo3@b13.com>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../Generic/Storage/Typo3DbBackend.php        |  2 +-
 .../Functional/Persistence/Fixtures/blogs.xml | 28 ++++++++++
 .../Functional/Persistence/WorkspaceTest.php  | 52 ++++++++++++++++++-
 3 files changed, 80 insertions(+), 2 deletions(-)

diff --git a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php
index 431187ab0004..6ed71657f58d 100644
--- a/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php
+++ b/typo3/sysext/extbase/Classes/Persistence/Generic/Storage/Typo3DbBackend.php
@@ -523,7 +523,7 @@ class Typo3DbBackend implements BackendInterface, SingletonInterface
             );
         }
         // Handle workspace overlays
-        $pageRepository->versionOL($tableName, $row, true);
+        $pageRepository->versionOL($tableName, $row, true, $querySettings->getIgnoreEnableFields());
         if (is_array($row) && $querySettings->getLanguageOverlayMode()) {
             if ($tableName === 'pages') {
                 $row = $pageRepository->getPageOverlay($row, $querySettings->getLanguageUid());
diff --git a/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/blogs.xml b/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/blogs.xml
index 3a09cb188dc1..a6274a15f12d 100644
--- a/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/blogs.xml
+++ b/typo3/sysext/extbase/Tests/Functional/Persistence/Fixtures/blogs.xml
@@ -96,4 +96,32 @@
 		<t3ver_state>0</t3ver_state>
 		<t3ver_wsid>1</t3ver_wsid>
 	</tx_blogexample_domain_model_blog>
+	<tx_blogexample_domain_model_blog>
+		<uid>103</uid>
+		<pid>0</pid>
+		<title>WorkspaceOverlay Blog2HiddenInWorkspace</title>
+		<description>WorkspaceOverlay Blog2HiddenInWorkspace Description</description>
+		<logo></logo>
+		<l18n_diffsource></l18n_diffsource>
+		<hidden>1</hidden>
+		<deleted>0</deleted>
+		<posts>1</posts>
+		<t3ver_oid>2</t3ver_oid>
+		<t3ver_state>0</t3ver_state>
+		<t3ver_wsid>1</t3ver_wsid>
+	</tx_blogexample_domain_model_blog>
+	<tx_blogexample_domain_model_blog>
+		<uid>104</uid>
+		<pid>0</pid>
+		<title>WorkspaceOverlay Blog4HiddenInLiveAndWorkspace</title>
+		<description>WorkspaceOverlay Blog4HiddenInLiveAndWorkspace Description</description>
+		<logo></logo>
+		<l18n_diffsource></l18n_diffsource>
+		<hidden>1</hidden>
+		<deleted>0</deleted>
+		<posts>1</posts>
+		<t3ver_oid>4</t3ver_oid>
+		<t3ver_state>0</t3ver_state>
+		<t3ver_wsid>1</t3ver_wsid>
+	</tx_blogexample_domain_model_blog>
 </dataset>
diff --git a/typo3/sysext/extbase/Tests/Functional/Persistence/WorkspaceTest.php b/typo3/sysext/extbase/Tests/Functional/Persistence/WorkspaceTest.php
index 96b6a93ae3cc..db108c4585c3 100644
--- a/typo3/sysext/extbase/Tests/Functional/Persistence/WorkspaceTest.php
+++ b/typo3/sysext/extbase/Tests/Functional/Persistence/WorkspaceTest.php
@@ -97,6 +97,56 @@ class WorkspaceTest extends FunctionalTestCase
         self::assertSame(5, $query->execute()->count());
     }
 
+    /**
+     * @test
+     * @dataProvider contextDataProvider
+     * @param string $context
+     */
+    public function fetchingHiddenBlogInWorkspace(string $context): void
+    {
+        // Set up Context for Workspace=1
+        if ($context === 'FE') {
+            $this->setupSubjectInFrontend();
+        } else {
+            $this->setupSubjectInBackend();
+        }
+
+        $query = $this->blogRepository->createQuery();
+
+        $querySettings = $query->getQuerySettings();
+        $querySettings->setStoragePageIds([0]);
+        $query->matching(
+            $query->logicalOr(
+                $query->like('title', '%Blog2%'),
+                $query->like('title', '%Blog4%'),
+                $query->like('title', '%Blog6%')
+            )
+        );
+        $query->setOrderings(['title' => QueryInterface::ORDER_ASCENDING]);
+
+        // Respect hidden flags, only show the item that was hidden in live, but is now visible in workspace
+        $querySettings->setIgnoreEnableFields(false);
+        $items = $query->execute();
+        $foundItems = [];
+        foreach ($items as $item) {
+            $foundItems[] = $item->getTitle();
+        }
+        self::assertEquals(['WorkspaceOverlay Blog6Enabled'], $foundItems);
+
+        // Allow hidden records to show up (resulting in 3 blog items)
+        $querySettings->setIgnoreEnableFields(true);
+        $items = $query->execute();
+        $foundItems = [];
+        foreach ($items as $item) {
+            $foundItems[] = $item->getTitle();
+        }
+        self::assertEquals([
+            'WorkspaceOverlay Blog2HiddenInWorkspace',
+            'WorkspaceOverlay Blog4HiddenInLiveAndWorkspace',
+            'WorkspaceOverlay Blog6Enabled',
+        ], $foundItems);
+    }
+
     /**
      * @test
      * @dataProvider contextDataProvider
@@ -119,7 +169,7 @@ class WorkspaceTest extends FunctionalTestCase
 
         $blogs = $query->execute()->toArray();
 
-        self::assertCount(4, $blogs);
+        self::assertCount(3, $blogs);
 
         // Check first blog was overlaid with workspace preview
         $firstBlog = array_shift($blogs);
-- 
GitLab