/** * Builds an array of additional key / values which must go into the calculation of the cache entry identifier for * a cached content segment. * * @param array $configuration * @param string $typoScriptPath * @param object $tsObject The actual TypoScript object * @return array */ protected function buildCacheIdentifierValues($configuration, $typoScriptPath, $tsObject) { $cacheIdentifierValues = array(); if (isset($configuration['entryIdentifier'])) { if (isset($configuration['entryIdentifier']['__objectType'])) { $cacheIdentifierValues = $this->runtime->evaluate($typoScriptPath . '/__meta/cache/entryIdentifier', $tsObject); } else { $cacheIdentifierValues = $this->runtime->evaluate($typoScriptPath . '/__meta/cache/entryIdentifier<TYPO3.TypoScript:GlobalCacheIdentifiers>', $tsObject); } } else { foreach ($this->runtime->getCurrentContext() as $key => $value) { if (is_string($value) || is_bool($value) || is_integer($value) || $value instanceof CacheAwareInterface) { $cacheIdentifierValues[$key] = $value; } } } return $cacheIdentifierValues; }
/** * Post process output for caching information * * The content cache stores cache segments with markers inside the generated content. This method creates cache * segments and will process the final outer result (currentPathIsEntryPoint) to remove all cache markers and * store cache entries. * * @param array $evaluateContext The current evaluation context * @param object $tsObject The current TypoScript object (for "this" in evaluations) * @param mixed $output The generated output after caching information was removed * @return mixed The post-processed output with cache segment markers or cleaned for the entry point */ public function postProcess(array $evaluateContext, $tsObject, $output) { if ($this->enableContentCache && $evaluateContext['cacheForPathEnabled'] && $evaluateContext['cacheForPathDisabled']) { $contextArray = $this->runtime->getCurrentContext(); if (isset($evaluateContext['configuration']['context'])) { $contextVariables = []; foreach ($evaluateContext['configuration']['context'] as $contextVariableName) { $contextVariables[$contextVariableName] = $contextArray[$contextVariableName]; } } else { $contextVariables = $contextArray; } $cacheTags = $this->buildCacheTags($evaluateContext['configuration'], $evaluateContext['typoScriptPath'], $tsObject); $cacheMetadata = array_pop($this->cacheMetadata); $output = $this->contentCache->createDynamicCachedSegment($output, $evaluateContext['typoScriptPath'], $contextVariables, $evaluateContext['cacheIdentifierValues'], $cacheTags, $cacheMetadata['lifetime'], $evaluateContext['cacheDiscriminator']); } elseif ($this->enableContentCache && $evaluateContext['cacheForPathEnabled']) { $cacheTags = $this->buildCacheTags($evaluateContext['configuration'], $evaluateContext['typoScriptPath'], $tsObject); $cacheMetadata = array_pop($this->cacheMetadata); $output = $this->contentCache->createCacheSegment($output, $evaluateContext['typoScriptPath'], $evaluateContext['cacheIdentifierValues'], $cacheTags, $cacheMetadata['lifetime']); } elseif ($this->enableContentCache && $evaluateContext['cacheForPathDisabled'] && $this->inCacheEntryPoint) { $contextArray = $this->runtime->getCurrentContext(); if (isset($evaluateContext['configuration']['context'])) { $contextVariables = []; foreach ($evaluateContext['configuration']['context'] as $contextVariableName) { if (isset($contextArray[$contextVariableName])) { $contextVariables[$contextVariableName] = $contextArray[$contextVariableName]; } else { $contextVariables[$contextVariableName] = null; } } } else { $contextVariables = $contextArray; } $output = $this->contentCache->createUncachedSegment($output, $evaluateContext['typoScriptPath'], $contextVariables); } if ($evaluateContext['cacheForPathEnabled'] && $evaluateContext['currentPathIsEntryPoint']) { $output = $this->contentCache->processCacheSegments($output, $this->enableContentCache); $this->inCacheEntryPoint = null; $this->addCacheSegmentMarkersToPlaceholders = false; } return $output; }