45 public function has($identifier) {
47 return $this->templateCache->has($identifier);
54 public function get($identifier) {
56 if (!isset($this->syntaxTreeInstanceCache[$identifier])) {
57 $this->templateCache->requireOnce($identifier);
58 $templateClassName =
'FluidCache_' . $identifier;
59 $this->syntaxTreeInstanceCache[$identifier] =
new $templateClassName();
61 return $this->syntaxTreeInstanceCache[$identifier];
69 public function store($identifier, \
TYPO3\CMS\
Fluid\Core\Parser\ParsingState $parsingState) {
71 $this->variableCounter = 0;
72 $generatedRenderFunctions =
'';
74 if ($parsingState->getVariableContainer()->exists(
'sections')) {
75 $sections = $parsingState->getVariableContainer()->get(
'sections');
77 foreach ($sections as $sectionName => $sectionRootNode) {
82 $convertedLayoutNameNode = $parsingState->hasLayout() ? $this->
convert($parsingState->getLayoutNameNode()) : array(
'initialization' =>
'',
'execution' =>
'NULL');
84 $classDefinition =
'class FluidCache_' . $identifier .
' extends \\TYPO3\\CMS\\Fluid\\Core\\Compiler\\AbstractCompiledTemplate';
86 $templateCode = <<<EOD
89 public function getVariableContainer() {
91 return new \TYPO3\CMS\Fluid\Core\ViewHelper\TemplateVariableContainer();
93 public function getLayoutName(\
TYPO3\CMS\
Fluid\Core\Rendering\RenderingContextInterface \$renderingContext) {
97 public function hasLayout() {
105 $templateCode = sprintf($templateCode,
107 $convertedLayoutNameNode[
'initialization'],
108 $convertedLayoutNameNode[
'execution'],
109 ($parsingState->hasLayout() ?
'TRUE' :
'FALSE'),
110 $generatedRenderFunctions);
111 $this->templateCache->set($identifier, $templateCode);
122 return preg_replace(
'([^a-zA-Z0-9_\\x7f-\\xff])',
'_', $identifier);
132 $templateCode = <<<EOD
136 public function %s(\
TYPO3\CMS\
Fluid\Core\Rendering\RenderingContextInterface \$renderingContext) {
143 return sprintf($templateCode, $comment, $expectedFunctionName, $converted[
'initialization'], $converted[
'execution']);
155 protected function convert(\
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\AbstractNode $node) {
156 if ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\TextNode) {
158 } elseif ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\NumericNode) {
160 } elseif ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\ViewHelperNode) {
162 } elseif ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\ObjectAccessorNode) {
164 } elseif ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\ArrayNode) {
166 } elseif ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\RootNode) {
168 } elseif ($node instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\BooleanNode) {
171 throw new \TYPO3\CMS\Fluid\Exception(
'Syntax tree node type "' . get_class($node) .
'" is not supported.');
182 'initialization' =>
'',
194 'initialization' =>
'',
195 'execution' => $node->getValue()
208 $initializationPhpCode =
'// Rendering ViewHelper ' . $node->getViewHelperClassName() . chr(10);
211 $argumentsVariableName = $this->
variableName(
'arguments');
212 $initializationPhpCode .= sprintf(
'%s = array();', $argumentsVariableName) . chr(10);
214 $alreadyBuiltArguments = array();
215 foreach ($node->getArguments() as $argumentName => $argumentValue) {
216 $converted = $this->
convert($argumentValue);
217 $initializationPhpCode .= $converted[
'initialization'];
218 $initializationPhpCode .= sprintf(
'%s[\'%s\'] = %s;', $argumentsVariableName, $argumentName, $converted[
'execution']) . chr(10);
219 $alreadyBuiltArguments[$argumentName] = TRUE;
222 foreach ($node->getUninitializedViewHelper()->prepareArguments() as $argumentName => $argumentDefinition) {
223 if (!isset($alreadyBuiltArguments[$argumentName])) {
224 $initializationPhpCode .= sprintf(
'%s[\'%s\'] = %s;', $argumentsVariableName, $argumentName, var_export($argumentDefinition->getDefaultValue(), TRUE)) . chr(10);
229 $renderChildrenClosureVariableName = $this->
variableName(
'renderChildrenClosure');
230 $initializationPhpCode .= sprintf(
'%s = %s;', $renderChildrenClosureVariableName, $this->
wrapChildNodesInClosure($node)) . chr(10);
232 if ($node->getUninitializedViewHelper() instanceof \TYPO3\CMS\Fluid\Core\ViewHelper\Facets\CompilableInterface) {
234 $viewHelperInitializationPhpCode =
'';
235 $convertedViewHelperExecutionCode = $node->getUninitializedViewHelper()->compile($argumentsVariableName, $renderChildrenClosureVariableName, $viewHelperInitializationPhpCode, $node, $this);
236 $initializationPhpCode .= $viewHelperInitializationPhpCode;
237 if ($convertedViewHelperExecutionCode !== self::SHOULD_GENERATE_VIEWHELPER_INVOCATION) {
239 'initialization' => $initializationPhpCode,
240 'execution' => $convertedViewHelperExecutionCode
246 $viewHelperVariableName = $this->
variableName(
'viewHelper');
248 $initializationPhpCode .= sprintf(
'%s = $self->getViewHelper(\'%s\', $renderingContext, \'%s\');', $viewHelperVariableName, $viewHelperVariableName, $node->getViewHelperClassName()) . chr(10);
249 $initializationPhpCode .= sprintf(
'%s->setArguments(%s);', $viewHelperVariableName, $argumentsVariableName) . chr(10);
250 $initializationPhpCode .= sprintf(
'%s->setRenderingContext($renderingContext);', $viewHelperVariableName) . chr(10);
252 $initializationPhpCode .= sprintf(
'%s->setRenderChildrenClosure(%s);', $viewHelperVariableName, $renderChildrenClosureVariableName) . chr(10);
254 $initializationPhpCode .=
'// End of ViewHelper ' . $node->getViewHelperClassName() . chr(10);
257 'initialization' => $initializationPhpCode,
258 'execution' => sprintf(
'%s->initializeArgumentsAndRender()', $viewHelperVariableName)
269 'initialization' =>
'',
270 'execution' => sprintf(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\ObjectAccessorNode::getPropertyPath($renderingContext->getTemplateVariableContainer(), \'%s\', $renderingContext)', $node->getObjectPath())
280 $initializationPhpCode =
'// Rendering Array' . chr(10);
283 $initializationPhpCode .= sprintf(
'%s = array();', $arrayVariableName) . chr(10);
285 foreach ($node->getInternalArray() as $key => $value) {
286 if ($value instanceof \
TYPO3\CMS\
Fluid\Core\Parser\SyntaxTree\AbstractNode) {
287 $converted = $this->
convert($value);
288 $initializationPhpCode .= $converted[
'initialization'];
289 $initializationPhpCode .= sprintf(
'%s[\'%s\'] = %s;', $arrayVariableName, $key, $converted[
'execution']) . chr(10);
290 } elseif (is_numeric($value)) {
292 $initializationPhpCode .= sprintf(
'%s[\'%s\'] = %s;', $arrayVariableName, $key, $value) . chr(10);
299 'initialization' => $initializationPhpCode,
300 'execution' => $arrayVariableName
310 switch (count($node->getChildNodes())) {
313 'initialization' =>
'',
314 'execution' =>
'NULL' 317 $converted = $this->
convert(current($node->getChildNodes()));
322 $initializationPhpCode = sprintf(
'%s = \'\';', $outputVariableName) . chr(10);
324 foreach ($node->getChildNodes() as $childNode) {
325 $converted = $this->
convert($childNode);
327 $initializationPhpCode .= $converted[
'initialization'] . chr(10);
328 $initializationPhpCode .= sprintf(
'%s .= %s;', $outputVariableName, $converted[
'execution']) . chr(10);
332 'initialization' => $initializationPhpCode,
333 'execution' => $outputVariableName
344 $initializationPhpCode =
'// Rendering Boolean node' . chr(10);
345 if ($node->getComparator() !== NULL) {
346 $convertedLeftSide = $this->
convert($node->getLeftSide());
347 $convertedRightSide = $this->
convert($node->getRightSide());
350 'initialization' => $initializationPhpCode . $convertedLeftSide[
'initialization'] . $convertedRightSide[
'initialization'],
351 'execution' => sprintf(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\BooleanNode::evaluateComparator(\'%s\', %s, %s)', $node->getComparator(), $convertedLeftSide[
'execution'], $convertedRightSide[
'execution'])
355 $converted = $this->
convert($node->getSyntaxTreeNode());
357 'initialization' => $initializationPhpCode . $converted[
'initialization'],
358 'execution' => sprintf(
'TYPO3\\CMS\\Fluid\\Core\\Parser\\SyntaxTree\\BooleanNode::convertToBoolean(%s)', $converted[
'execution'])
368 return str_replace(array(
'\\',
'\''), array(
'\\\\',
'\\\''), $text);
377 $closure .=
'function() use ($renderingContext, $self) {' . chr(10);
379 $closure .= $convertedSubNodes[
'initialization'];
380 $closure .= sprintf(
'return %s;', $convertedSubNodes[
'execution']) . chr(10);
392 return '$' . $prefix . $this->variableCounter++;
convertBooleanNode(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\BooleanNode $node)
convertArrayNode(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\ArrayNode $node)
generateCodeForSection(array $converted, $expectedFunctionName, $comment)
escapeTextForUseInSingleQuotes($text)
wrapChildNodesInClosure(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\AbstractNode $node)
convertNumericNode(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\NumericNode $node)
const SHOULD_GENERATE_VIEWHELPER_INVOCATION
convertObjectAccessorNode(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\ObjectAccessorNode $node)
sanitizeIdentifier($identifier)
convert(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\AbstractNode $node)
store($identifier, \TYPO3\CMS\Fluid\Core\Parser\ParsingState $parsingState)
convertViewHelperNode(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\ViewHelperNode $node)
convertTextNode(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\TextNode $node)
setTemplateCache(\TYPO3\CMS\Core\Cache\Frontend\PhpFrontend $templateCache)
convertListOfSubNodes(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\AbstractNode $node)