From eaccd35fa752d56212440373cadbfe941ef412b1 Mon Sep 17 00:00:00 2001
From: Benni Mack <benni@typo3.org>
Date: Thu, 2 Apr 2020 11:54:40 +0200
Subject: [PATCH] [BUGFIX] Re-Implement record_is_used hook for Fluid-based
 page view

The hook to determine if child records are used is re-implemented.
This makes the fluid based page module behave like the legacy
PageLayoutView when determining if a record was used, allowing
third party extensions to override the core's "is used?" decision.

Resolves: #90927
Releases: master
Change-Id: Ia72cf7479e04ee9c5ae688cf9c37bed697ac4d3e
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64049
Reviewed-by: Kevin Appelt <kevin.appelt@icloud.com>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Claus Due <claus@phpmind.net>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Oliver Bartsch <bo@cedev.de>
Tested-by: Claus Due <claus@phpmind.net>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
---
 .../View/BackendLayout/ContentFetcher.php        | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/typo3/sysext/backend/Classes/View/BackendLayout/ContentFetcher.php b/typo3/sysext/backend/Classes/View/BackendLayout/ContentFetcher.php
index 1d79bec530c2..21859d75df19 100644
--- a/typo3/sysext/backend/Classes/View/BackendLayout/ContentFetcher.php
+++ b/typo3/sysext/backend/Classes/View/BackendLayout/ContentFetcher.php
@@ -104,14 +104,28 @@ class ContentFetcher
         return empty($contentRecords) ? [] : array_merge(...$contentRecords);
     }
 
+    /**
+     * A hook allows to decide whether a custom type has children which were rendered or should not be rendered.
+     *
+     * @return iterable
+     */
     public function getUnusedRecords(): iterable
     {
         $unrendered = [];
+        $hookArray = $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['record_is_used'] ?? [];
+        $pageLayoutView = PageLayoutView::createFromDrawingConfiguration($this->backendLayout->getDrawingConfiguration());
+
         $knownColumnPositionNumbers = $this->backendLayout->getColumnPositionNumbers();
         $rememberer = $this->backendLayout->getRecordRememberer();
         foreach ($this->fetchedContentRecords[$this->backendLayout->getDrawingConfiguration()->getLanguageColumnsPointer()] ?? [] as $contentRecordsInColumn) {
             foreach ($contentRecordsInColumn as $contentRecord) {
-                if (!$rememberer->isRemembered((int)$contentRecord['uid']) && !in_array($contentRecord['colPos'], $knownColumnPositionNumbers)) {
+                $used = $rememberer->isRemembered((int)$contentRecord['uid']);
+                // A hook mentioned that this record is used somewhere, so this is in fact "rendered" already
+                foreach ($hookArray as $hookFunction) {
+                    $_params = ['columns' => $knownColumnPositionNumbers, 'record' => $contentRecord, 'used' => $used];
+                    $used = GeneralUtility::callUserFunction($hookFunction, $_params, $pageLayoutView);
+                }
+                if (!$used) {
                     $unrendered[] = $contentRecord;
                 }
             }
-- 
GitLab