tsConfigTreeBuilder->getPagesTsConfigTree($fullRootLine, $this->tokenizer, $this->cache); // Overloading with user TSconfig if hand over if ($userTsConfig !== null) { $userTsConfigAst = $userTsConfig->getUserTsConfigTree(); $userTsConfigPageOverrides = ''; // @todo: This is ugly and expensive. There should be a better way to do this. Similar in BE page TSconfig controllers. $userTsConfigFlat = $userTsConfigAst->flatten(); foreach ($userTsConfigFlat as $userTsConfigIdentifier => $userTsConfigValue) { if (str_starts_with($userTsConfigIdentifier, 'page.')) { $userTsConfigPageOverrides .= substr($userTsConfigIdentifier, 5) . ' = ' . $userTsConfigValue . chr(10); } } if (!empty($userTsConfigPageOverrides)) { $includeNode = new TsConfigInclude(); $includeNode->setName('pageTsConfig-overrides-by-userTsConfig'); $includeNode->setLineStream($this->tokenizer->tokenize($userTsConfigPageOverrides)); $pagesTsConfigTree->addChild($includeNode); } } // Prepare site constants to be substituted $includeTreeTraverserConditionVerdictAware = new ConditionVerdictAwareIncludeTreeTraverser(); $siteSettingsFlat = []; if ($site instanceof Site) { $siteSettings = $site->getSettings(); if (!$siteSettings->isEmpty()) { $siteSettingsCacheIdentifier = 'site-settings-flat-' . hash('xxh3', json_encode($siteSettings, JSON_THROW_ON_ERROR)); $siteSettingsCacheArray = $this->cache->require($siteSettingsCacheIdentifier); if (isset($siteSettingsCacheArray['flatConstants'])) { $siteSettingsFlat = $siteSettingsCacheArray['flatConstants']; } else { $siteConstants = ''; $siteSettings = $siteSettings->getAllFlat(); foreach ($siteSettings as $nodeIdentifier => $value) { $siteConstants .= $nodeIdentifier . ' = ' . $value . LF; } $siteSettingsNode = new SiteInclude(); $siteSettingsNode->setName('Site constants settings of site "' . $site->getIdentifier() . '"'); $siteSettingsNode->setLineStream($this->tokenizer->tokenize($siteConstants)); $siteSettingsTreeRoot = new RootInclude(); $siteSettingsTreeRoot->addChild($siteSettingsNode); $astBuilderVisitor = $this->container->get(IncludeTreeAstBuilderVisitor::class); $includeTreeTraverserConditionVerdictAware->traverse($siteSettingsTreeRoot, [$astBuilderVisitor]); $siteSettingsFlat = $astBuilderVisitor->getAst()->flatten(); $this->cache->set($siteSettingsCacheIdentifier, 'return unserialize(\'' . addcslashes(serialize(['flatConstants' => $siteSettingsFlat]), '\'\\') . '\');'); } } } // Create AST with constants from site and conditions $includeTreeTraverserConditionVerdictAwareVisitors = []; if (!empty($siteSettingsFlat)) { $setupConditionConstantSubstitutionVisitor = new IncludeTreeSetupConditionConstantSubstitutionVisitor(); $setupConditionConstantSubstitutionVisitor->setFlattenedConstants($siteSettingsFlat); $includeTreeTraverserConditionVerdictAwareVisitors[] = $setupConditionConstantSubstitutionVisitor; } $lastPageFullRecord = []; $pageId = 0; if (!empty($fullRootLine)) { $lastPage = array_last($fullRootLine); $pageId = $lastPage['uid']; $lastPageFullRecord = BackendUtility::getRecord('pages', $pageId) ?: []; } $conditionMatcherVariables = [ 'fullRootLine' => $fullRootLine, 'site' => $site, // @todo We're using the full page row here to provide all necessary fields (e.g. "backend_layout"), // which are currently not included in the rows, RootlineUtility provides by default. We might // want to switch to array_last($fullRootLine) as soon as it contains all fields. 'page' => $lastPageFullRecord, 'pageId' => $pageId, ]; $conditionMatcherVisitor = GeneralUtility::makeInstance(IncludeTreeConditionMatcherVisitor::class); $conditionMatcherVisitor->initializeExpressionMatcherWithVariables($conditionMatcherVariables); $includeTreeTraverserConditionVerdictAwareVisitors[] = $conditionMatcherVisitor; $astBuilderVisitor = $this->container->get(IncludeTreeAstBuilderVisitor::class); $astBuilderVisitor->setFlatConstants($siteSettingsFlat); $includeTreeTraverserConditionVerdictAwareVisitors[] = $astBuilderVisitor; $includeTreeTraverserConditionVerdictAware->traverse($pagesTsConfigTree, $includeTreeTraverserConditionVerdictAwareVisitors); return new PageTsConfig($astBuilderVisitor->getAst(), $conditionMatcherVisitor->getConditionListWithVerdicts()); } }