*/ class ConfigurationPageResolver { /** * @var SystemTemplateRepository */ protected $systemTemplateRepository; /** * @var TwoLevelCache */ protected $twoLevelCache; /** * @var TwoLevelCache */ protected $runtimeCache; /** * ConfigurationPageResolver constructor. * @param PageRepository|null $pageRepository * @param TwoLevelCache|null $twoLevelCache * @param SystemTemplateRepository $systemTemplateRepository */ public function __construct(PageRepository $pageRepository = null, TwoLevelCache $twoLevelCache = null, SystemTemplateRepository $systemTemplateRepository = null) { $this->runtimeCache = $twoLevelCache ?? GeneralUtility::makeInstance(TwoLevelCache::class, /** @scrutinizer ignore-type */ 'cache_runtime'); $this->systemTemplateRepository = $systemTemplateRepository ?? GeneralUtility::makeInstance(SystemTemplateRepository::class); } /** * This method fetches the rootLine and calculates the id of the closest template in the rootLine. * The result is stored in the runtime cache. * * @param integer $startPageId * @return integer */ public function getClosestPageIdWithActiveTemplate($startPageId) { if ($startPageId === 0) { return 0; } $cacheId = 'ConfigurationPageResolver' . '_' . 'getClosestPageIdWithActiveTemplate' . '_' . $startPageId; $methodResult = $this->runtimeCache->get($cacheId); if (!empty($methodResult)) { return $methodResult; } $methodResult = $this->calculateClosestPageIdWithActiveTemplate($startPageId); $this->runtimeCache->set($cacheId, $methodResult); return $methodResult; } /** * This method fetches the rootLine and calculates the id of the closest template in the rootLine. * * @param integer $startPageId * @return int */ protected function calculateClosestPageIdWithActiveTemplate($startPageId) { $rootlineUtility = GeneralUtility::makeInstance(RootlineUtility::class, $startPageId); try { $rootline = $rootlineUtility->get(); } catch (\RuntimeException $e) { return $startPageId; } $closestPageIdWithTemplate = $this->systemTemplateRepository->findOneClosestPageIdWithActiveTemplateByRootLine($rootline); if ($closestPageIdWithTemplate === 0) { return $startPageId; } return (int)$closestPageIdWithTemplate; } }