133 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace WapplerSystems\Meilisearch\FrontendEnvironment;
 | 
						|
 | 
						|
use WapplerSystems\Meilisearch\FrontendEnvironment;
 | 
						|
use WapplerSystems\Meilisearch\System\Cache\TwoLevelCache;
 | 
						|
use WapplerSystems\Meilisearch\System\Configuration\ConfigurationManager;
 | 
						|
use WapplerSystems\Meilisearch\System\Configuration\ConfigurationPageResolver;
 | 
						|
use WapplerSystems\Meilisearch\System\Configuration\ExtensionConfiguration;
 | 
						|
use WapplerSystems\Meilisearch\System\Configuration\TypoScriptConfiguration;
 | 
						|
use TYPO3\CMS\Core\SingletonInterface;
 | 
						|
use TYPO3\CMS\Core\TypoScript\ExtendedTemplateService;
 | 
						|
use TYPO3\CMS\Core\Utility\RootlineUtility;
 | 
						|
use TYPO3\CMS\Core\Utility\GeneralUtility;
 | 
						|
 | 
						|
 | 
						|
class TypoScript implements SingletonInterface
 | 
						|
{
 | 
						|
 | 
						|
    private $configurationObjectCache = [];
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * Loads the TypoScript configuration for a given page id and language.
 | 
						|
     * Language usage may be disabled to get the default TypoScript
 | 
						|
     * configuration.
 | 
						|
     *
 | 
						|
     * @param int $pageId Id of the (root) page to get the Meilisearch configuration from.
 | 
						|
     * @param string $path The TypoScript configuration path to retrieve.
 | 
						|
     * @param int $language System language uid, optional, defaults to 0
 | 
						|
     * @return TypoScriptConfiguration The Meilisearch configuration for the requested tree.
 | 
						|
     */
 | 
						|
    public function getConfigurationFromPageId($pageId, $path, $language = 0)
 | 
						|
    {
 | 
						|
        $pageId = $this->getConfigurationPageIdToUse($pageId);
 | 
						|
 | 
						|
        $cacheId = md5($pageId . '|' . $path . '|' . $language);
 | 
						|
        if (isset($this->configurationObjectCache[$cacheId])) {
 | 
						|
            return $this->configurationObjectCache[$cacheId];
 | 
						|
        }
 | 
						|
 | 
						|
        // If we're on UID 0, we cannot retrieve a configuration currently.
 | 
						|
        // getRootline() below throws an exception (since #typo3-60 )
 | 
						|
        // as UID 0 cannot have any parent rootline by design.
 | 
						|
        if ($pageId == 0) {
 | 
						|
            return $this->configurationObjectCache[$cacheId] = $this->buildTypoScriptConfigurationFromArray([], $pageId, $language, $path);
 | 
						|
        }
 | 
						|
 | 
						|
        /** @var $cache TwoLevelCache */
 | 
						|
        $cache = GeneralUtility::makeInstance(TwoLevelCache::class, /** @scrutinizer ignore-type */ 'tx_meilisearch_configuration');
 | 
						|
        $configurationArray = $cache->get($cacheId);
 | 
						|
 | 
						|
 | 
						|
        if (!empty($configurationArray)) {
 | 
						|
            // we have a cache hit and can return it.
 | 
						|
            return $this->configurationObjectCache[$cacheId] = $this->buildTypoScriptConfigurationFromArray($configurationArray, $pageId, $language, $path);
 | 
						|
        }
 | 
						|
 | 
						|
        // we have nothing in the cache. We need to build the configurationToUse
 | 
						|
        $configurationArray = $this->buildConfigurationArray($pageId, $path, $language);
 | 
						|
 | 
						|
        $cache->set($cacheId, $configurationArray);
 | 
						|
 | 
						|
        return $this->configurationObjectCache[$cacheId] = $this->buildTypoScriptConfigurationFromArray($configurationArray, $pageId, $language, $path);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * This method retrieves the closest pageId where a configuration is located, when this
 | 
						|
     * feature is enabled.
 | 
						|
     *
 | 
						|
     * @param int $pageId
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    private function getConfigurationPageIdToUse($pageId)
 | 
						|
    {
 | 
						|
        $extensionConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class);
 | 
						|
        if ($extensionConfiguration->getIsUseConfigurationFromClosestTemplateEnabled()) {
 | 
						|
            /** @var $configurationPageResolve ConfigurationPageResolver */
 | 
						|
            $configurationPageResolver = GeneralUtility::makeInstance(ConfigurationPageResolver::class);
 | 
						|
            $pageId = $configurationPageResolver->getClosestPageIdWithActiveTemplate($pageId);
 | 
						|
            return $pageId;
 | 
						|
        }
 | 
						|
        return $pageId;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * builds an configuration array, containing the meilisearch configuration.
 | 
						|
     *
 | 
						|
     * @param integer $pageId
 | 
						|
     * @param string $path
 | 
						|
     * @param integer $language
 | 
						|
     * @return array
 | 
						|
     */
 | 
						|
    protected function buildConfigurationArray($pageId, $path, $language)
 | 
						|
    {
 | 
						|
        if (is_int($language)) {
 | 
						|
            GeneralUtility::makeInstance(FrontendEnvironment::class)->changeLanguageContext((int)$pageId, (int)$language);
 | 
						|
        }
 | 
						|
        $rootlineUtility = GeneralUtility::makeInstance(RootlineUtility::class, $pageId);
 | 
						|
        try {
 | 
						|
            $rootLine = $rootlineUtility->get();
 | 
						|
        } catch (\RuntimeException $e) {
 | 
						|
            $rootLine = [];
 | 
						|
        }
 | 
						|
 | 
						|
        /** @var $tmpl ExtendedTemplateService */
 | 
						|
        $tmpl = GeneralUtility::makeInstance(ExtendedTemplateService::class);
 | 
						|
        $tmpl->tt_track = false; // Do not log time-performance information
 | 
						|
        $tmpl->runThroughTemplates($rootLine); // This generates the constants/config + hierarchy info for the template.
 | 
						|
        $tmpl->generateConfig();
 | 
						|
 | 
						|
        $getConfigurationFromInitializedTSFEAndWriteToCache = $tmpl->ext_getSetup($tmpl->setup, $path);
 | 
						|
        $configurationToUse = $getConfigurationFromInitializedTSFEAndWriteToCache[0];
 | 
						|
 | 
						|
        return is_array($configurationToUse) ? $configurationToUse : [];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Builds the configuration object from a config array and returns it.
 | 
						|
     *
 | 
						|
     * @param array $configurationToUse
 | 
						|
     * @param int $pageId
 | 
						|
     * @param int $languageId
 | 
						|
     * @param string $typoScriptPath
 | 
						|
     * @return TypoScriptConfiguration
 | 
						|
     */
 | 
						|
    protected function buildTypoScriptConfigurationFromArray(array $configurationToUse, $pageId, $languageId, $typoScriptPath)
 | 
						|
    {
 | 
						|
        $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class);
 | 
						|
        return $configurationManager->getTypoScriptConfiguration($configurationToUse, $pageId, $languageId, $typoScriptPath);
 | 
						|
    }
 | 
						|
 | 
						|
}
 |