function prime( &$tr ) { $tpl = eZTemplate::factory(); $tpl->setIsCachingAllowed( true ); eZTemplateCompiler::setSettings( array( 'compile' => true, 'comments' => false, 'accumulators' => false, 'timingpoints' => false, 'fallbackresource' => false, 'nodeplacement' => false, 'execution' => true, 'generate' => true, 'compilation-directory' => 'benchmarks/eztemplate/compilation' ) ); $expected = $tpl->fetch( 'benchmarks/eztemplate/mark.tpl' ); eZTemplateCompiler::setSettings( array( 'compile' => true, 'comments' => false, 'accumulators' => false, 'timingpoints' => false, 'fallbackresource' => false, 'nodeplacement' => false, 'execution' => true, 'generate' => false, 'compilation-directory' => 'benchmarks/eztemplate/compilation' ) ); $tpl->reset(); $this->TPL = $tpl; }
function templateNodeTransformation($functionName, &$node, $tpl, $parameters, $privateData) { if ($functionName != $this->BlockName) { return false; } $parameters = eZTemplateNodeTool::extractFunctionNodeParameters($node); if (!isset($parameters['name'])) { return false; } $namespaceValue = false; $newNodes = array(); if (isset($parameters["name"])) { $menuIni = eZINI::instance("menu.ini"); $nameData = $parameters["name"]; if (!eZTemplateNodeTool::isConstantElement($nameData)) { return false; } $menuName = eZTemplateNodeTool::elementConstantValue($nameData); if ($menuIni->hasVariable('SelectedMenu', $menuName)) { $menuTemplate = $menuIni->variable("SelectedMenu", $menuName); if ($menuTemplate != null) { $uriString = "design:menu/{$menuTemplate}.tpl"; $resourceName = ""; $templateName = ""; $resource = $tpl->resourceFor($uriString, $resourceName, $templateName); $resourceData = $tpl->resourceData($resource, $uriString, $resourceName, $templateName); $resourceData['use-comments'] = eZTemplateCompiler::isCommentsEnabled(); $includeNodes = $resource->templateNodeTransformation($functionName, $node, $tpl, $resourceData, $parameters, $namespaceValue); if ($includeNodes === false) { return false; } $variableList = array(); foreach (array_keys($parameters) as $parameterName) { if ($parameterName == 'name') { continue; } $parameterData =& $parameters[$parameterName]; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameterData, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, $parameterName)); $variableList[] = $parameterName; } $newNodes = array_merge($newNodes, $includeNodes); foreach ($variableList as $variableName) { $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode(array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, $variableName)); } } else { // to do: not use this function to generate empty code. $newNodes[] = eZTemplateNodeTool::createCodePieceNode(""); } } else { // to do: not use this function to generate empty code. $newNodes[] = eZTemplateNodeTool::createCodePieceNode(""); } } return $newNodes; }
function templateNodeTransformation($functionName, &$node, $tpl, $parameters, $privateData) { if ($functionName != $this->IncludeName) { return false; } $parameters = eZTemplateNodeTool::extractFunctionNodeParameters($node); if (!isset($parameters['uri'])) { return false; } $uriData = $parameters['uri']; if (!eZTemplateNodeTool::isConstantElement($uriData)) { return false; } $namespaceValue = false; $namespaceName = '$currentNamespace'; if (isset($parameters['name'])) { $nameData = $parameters['name']; if (!eZTemplateNodeTool::isConstantElement($nameData)) { return false; } $namespaceValue = eZTemplateNodeTool::elementConstantValue($nameData); $namespaceName = '$namespace'; } $uriString = eZTemplateNodeTool::elementConstantValue($uriData); $resourceName = ""; $templateName = ""; $resource = $tpl->resourceFor($uriString, $resourceName, $templateName); $resourceData = $tpl->resourceData($resource, $uriString, $resourceName, $templateName); $resourceData['use-comments'] = eZTemplateCompiler::isCommentsEnabled(); $includeNodes = $resource->templateNodeTransformation($functionName, $node, $tpl, $resourceData, $parameters, $namespaceValue); if ($includeNodes === false) { return false; } $newNodes = array(); $variableList = array(); $uniqID = md5(uniqid('inc')); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("\$oldRestoreIncludeArray" . "_{$uniqID} = isset( \$restoreIncludeArray ) ? \$restoreIncludeArray : array();\n" . "\$restoreIncludeArray = array();\n"); foreach (array_keys($parameters) as $parameterName) { if ($parameterName == 'uri' or $parameterName == 'name') { continue; } $parameterData =& $parameters[$parameterName]; $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( isset( {$namespaceName} ) and isset( \$vars[{$namespaceName}]['{$parameterName}'] ) )\n" . " \$restoreIncludeArray[] = array( {$namespaceName}, '{$parameterName}', \$vars[{$namespaceName}]['{$parameterName}'] );\n" . "elseif ( !isset( \$vars[( isset( {$namespaceName} ) ? {$namespaceName} : '' )]['{$parameterName}'] ) ) \n" . " \$restoreIncludeArray[] = array( ( isset( {$namespaceName} ) ? {$namespaceName} : '' ), '{$parameterName}', 'unset' );\n"); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameterData, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, $parameterName)); $variableList[] = $parameterName; } $newNodes = array_merge($newNodes, $includeNodes); // Restore previous variables, before including $newNodes[] = eZTemplateNodeTool::createCodePieceNode("foreach ( \$restoreIncludeArray as \$element )\n" . "{\n" . " if ( \$element[2] === 'unset' )\n" . " {\n" . " unset( \$vars[\$element[0]][\$element[1]] );\n" . " continue;\n" . " }\n" . " \$vars[\$element[0]][\$element[1]] = \$element[2];\n" . "}\n" . "\$restoreIncludeArray = \$oldRestoreIncludeArray" . "_{$uniqID};\n"); return $newNodes; }
static function generateVariableDataCode($php, $tpl, $variableData, &$knownTypes, $dataInspection, &$persistence, $parameters, &$resourceData) { $staticTypeMap = array(eZTemplate::TYPE_STRING => 'string', eZTemplate::TYPE_NUMERIC => 'numeric', eZTemplate::TYPE_IDENTIFIER => 'string', eZTemplate::TYPE_ARRAY => 'array', eZTemplate::TYPE_BOOLEAN => 'boolean'); $variableAssignmentName = $parameters['variable']; $variableAssignmentCounter = $parameters['counter']; $spacing = 0; $optimizeNode = false; if (isset($parameters['spacing'])) { $spacing = $parameters['spacing']; } if ($variableAssignmentCounter > 0) { $variableAssignmentName .= $variableAssignmentCounter; } // We need to unset the assignment variable before any elements are processed // This ensures that we don't work on existing variables $php->addCodePiece("unset( \${$variableAssignmentName} );\n", array('spacing' => $spacing)); if (is_array($variableData)) { foreach ($variableData as $index => $variableDataItem) { $variableDataType = $variableDataItem[0]; if ($variableDataType == eZTemplate::TYPE_STRING or $variableDataType == eZTemplate::TYPE_NUMERIC or $variableDataType == eZTemplate::TYPE_IDENTIFIER or $variableDataType == eZTemplate::TYPE_ARRAY or $variableDataType == eZTemplate::TYPE_BOOLEAN) { $knownTypes = array_unique(array_merge($knownTypes, array($staticTypeMap[$variableDataType]))); $dataValue = $variableDataItem[1]; $dataText = $php->thisVariableText($dataValue, 0, 0, false); $php->addCodePiece("\${$variableAssignmentName} = {$dataText};\n", array('spacing' => $spacing)); } else { if ($variableDataType == eZTemplate::TYPE_OPTIMIZED_NODE) { $optimizeNode = true; if (!isset($resourceData['node-object-cached'])) { $tpl->error("eZTemplateCompiler" . ($resourceData['use-comments'] ? ":" . __LINE__ : ""), "Attribute node-object-cached of variable \$resourceData was not found but variable node eZTemplate::TYPE_OPTIMIZED_NODE is still present. This should not happen"); } $php->addCodePiece("\${$variableAssignmentName} = \$nod_{$resourceData['uniqid']};\n"); // If optimized node is not set, use unoptimized code. $php->addCodePiece("if ( !\${$variableAssignmentName} )\n{\n"); } else { if ($variableDataType == eZTemplate::TYPE_OPTIMIZED_ARRAY_LOOKUP) { $code = $resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/\n" : ""; // This code is used a lot so we create a variable for it $phpVar = "\${$variableAssignmentName}"; $indexName = "'{$variableDataItem[1][0][1]}'"; // Add sanity checking $code .= "if ( !isset( {$phpVar}[{$indexName}] ) )\n" . "{\n" . " \$tpl->error( 'eZTemplateCompiler" . ($resourceData['use-comments'] ? ":" . __LINE__ : "") . "', \"PHP variable \\{$phpVar}" . "[{$indexName}] does not exist, cannot fetch the value.\" );\n" . " {$phpVar} = null;\n" . "}\n" . "else\n "; // Add the actual code $code .= "{$phpVar} = {$phpVar}[{$indexName}];\n"; $php->addCodePiece($code); } else { if ($variableDataType == eZTemplate::TYPE_OPTIMIZED_ATTRIBUTE_LOOKUP) { $code = $resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/\n" : ""; $code .= <<<END if ( !is_object( \${$variableAssignmentName} ) ) { \${$variableAssignmentName} = null; } else if ( \${$variableAssignmentName}->hasAttribute( "{$variableDataItem[1][0][1]}" ) ) { \${$variableAssignmentName} = \${$variableAssignmentName}->attribute( "{$variableDataItem[1][0][1]}" ); } END; $php->addCodePiece($code); } else { if ($variableDataType == eZTemplate::TYPE_OPTIMIZED_CONTENT_CALL) { // Line number comment $code = $resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/\n" : ""; // This code is used a lot so we create a variable for it $phpVar = "\${$variableAssignmentName}"; // Add sanity checking $code .= "if ( !is_object( {$phpVar} ) )\n" . "{\n" . " \$tpl->error( 'eZTemplateCompiler" . ($resourceData['use-comments'] ? ":" . __LINE__ : "") . "', \"PHP variable \\{$phpVar} is not an object, cannot fetch content()\" );\n" . " {$phpVar} = null;\n" . "}\n" . "else\n" . "{\n"; // Add the actual code $code .= " {$phpVar}Tmp = {$phpVar}->content();\n" . " unset( {$phpVar} );\n" . " {$phpVar} = {$phpVar}Tmp;\n" . " unset( {$phpVar}Tmp );\n}\n"; $php->addCodePiece($code); } else { if ($variableDataType == eZTemplate::TYPE_PHP_VARIABLE) { $knownTypes = array(); $phpVariableName = $variableDataItem[1]; $php->addCodePiece("\${$variableAssignmentName} = \${$phpVariableName};\n", array('spacing' => $spacing)); } else { if ($variableDataType == eZTemplate::TYPE_VARIABLE) { $knownTypes = array(); $namespace = $variableDataItem[1][0]; $namespaceScope = $variableDataItem[1][1]; $variableName = $variableDataItem[1][2]; $namespaceText = eZTemplateCompiler::generateMergeNamespaceCode($php, $tpl, $namespace, $namespaceScope, array('spacing' => $spacing), true); if (!is_string($namespaceText)) { $namespaceText = "\$namespace"; } $variableNameText = $php->thisVariableText($variableName, 0, 0, false); $code = "unset( \${$variableAssignmentName} );\n"; $code .= "\${$variableAssignmentName} = ( array_key_exists( {$namespaceText}, \$vars ) and array_key_exists( {$variableNameText}, \$vars[{$namespaceText}] ) ) ? \$vars[{$namespaceText}][{$variableNameText}] : null;\n"; $php->addCodePiece($code, array('spacing' => $spacing)); } else { if ($variableDataType == eZTemplate::TYPE_ATTRIBUTE) { $knownTypes = array(); $newParameters = $parameters; $newParameters['counter'] += 1; $tmpVariableAssignmentName = $newParameters['variable']; $tmpVariableAssignmentCounter = $newParameters['counter']; if ($tmpVariableAssignmentCounter > 0) { $tmpVariableAssignmentName .= $tmpVariableAssignmentCounter; } if (eZTemplateNodeTool::isStaticElement($variableDataItem[1])) { $attributeStaticValue = eZTemplateNodeTool::elementStaticValue($variableDataItem[1]); $attributeText = $php->thisVariableText($attributeStaticValue, 0, 0, false); } else { $newParameters['counter'] += 1; $tmpKnownTypes = array(); eZTemplateCompiler::generateVariableDataCode($php, $tpl, $variableDataItem[1], $tmpKnownTypes, $dataInspection, $persistence, $newParameters, $resourceData); $newVariableAssignmentName = $newParameters['variable']; $newVariableAssignmentCounter = $newParameters['counter']; if ($newVariableAssignmentCounter > 0) { $newVariableAssignmentName .= $newVariableAssignmentCounter; } $attributeText = "\${$newVariableAssignmentName}"; } $php->addCodePiece("\${$tmpVariableAssignmentName} = compiledFetchAttribute( \${$variableAssignmentName}, {$attributeText} );\n" . "unset( \${$variableAssignmentName} );\n" . "\${$variableAssignmentName} = \${$tmpVariableAssignmentName};\n", array('spacing' => $spacing)); // End if optimized node object is null/false. See also eZTemplateOptimizer::optimizeVariable() if ($optimizeNode && $index == 3) { $php->addCodePiece("}\n"); } } else { if ($variableDataType == eZTemplate::TYPE_OPERATOR) { $knownTypes = array(); $operatorParameters = $variableDataItem[1]; $operatorName = $operatorParameters[0]; $operatorParameters = array_splice($operatorParameters, 1); $operatorNameText = $php->thisVariableText($operatorName, 0, 0, false); $operatorParametersText = $php->thisVariableText($operatorParameters, 23, 0, false); $operatorHint = eZTemplateCompiler::operatorHint($tpl, $operatorName); if (isset($operatorHint['output']) and $operatorHint['output']) { if (isset($operatorHint['output-type'])) { $knownType = $operatorHint['output-type']; if (is_array($knownType)) { $knownTypes = array_merge($knownTypes, $knownType); } else { $knownTypes[] = $knownType; } $knownTypes = array_unique($knownTypes); } else { $knownTypes[] = 'static'; } } $php->addCodePiece("if (! isset( \${$variableAssignmentName} ) ) \${$variableAssignmentName} = NULL;\n", array('spacing' => $spacing)); $php->addCodePiece("while " . ($resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/" : "") . "( is_object( \${$variableAssignmentName} ) and method_exists( \${$variableAssignmentName}, 'templateValue' ) )\n" . " \${$variableAssignmentName} = \${$variableAssignmentName}" . "->templateValue();\n"); $php->addCodePiece("\$" . $variableAssignmentName . "Data = array( 'value' => \${$variableAssignmentName} );\n\$tpl->processOperator( {$operatorNameText},\n {$operatorParametersText},\n \$rootNamespace, \$currentNamespace, \$" . $variableAssignmentName . "Data, false, false );\n\${$variableAssignmentName} = \$" . $variableAssignmentName . "Data['value'];\nunset( \$" . $variableAssignmentName . "Data );\n", array('spacing' => $spacing)); } else { if ($variableDataType == eZTemplate::TYPE_VOID) { } else { if ($variableDataType == eZTemplate::TYPE_DYNAMIC_ARRAY) { $knownTypes = array_unique(array_merge($knownTypes, array('array'))); $code = '%output% = array( '; $matchMap = array('%input%', '%output%'); $replaceMap = array('$' . $variableAssignmentName, '$' . $variableAssignmentName); $unsetList = array(); $counter = 1; $paramCount = 0; $values = $variableDataItem[2]; $newParameters = $parameters; foreach ($values as $key => $value) { if ($paramCount != 0) { $code .= ', '; } ++$paramCount; $code .= '\'' . $key . '\' => '; if (eZTemplateNodeTool::isStaticElement($value)) { $code .= eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($value), 0, 0, false); continue; } $code .= '%' . $counter . '%'; $newParameters['counter'] += 1; $newVariableAssignmentName = $newParameters['variable']; $newVariableAssignmentCounter = $newParameters['counter']; if ($newVariableAssignmentCounter > 0) { $newVariableAssignmentName .= $newVariableAssignmentCounter; } $matchMap[] = '%' . $counter . '%'; $replaceMap[] = '$' . $newVariableAssignmentName; $unsetList[] = $newVariableAssignmentName; $tmpKnownTypes = array(); eZTemplateCompiler::generateVariableDataCode($php, $tpl, $value, $tmpKnownTypes, $dataInspection, $persistence, $newParameters, $resourceData); ++$counter; } $code .= ' );'; $code = str_replace($matchMap, $replaceMap, $code); $php->addCodePiece($code, array('spacing' => $spacing)); $php->addVariableUnsetList($unsetList, array('spacing' => $spacing)); } else { if ($variableDataType == eZTemplate::TYPE_INTERNAL_CODE_PIECE) { $code = $variableDataItem[1]; $values = false; $matchMap = array('%input%', '%output%'); $replaceMap = array('$' . $variableAssignmentName, '$' . $variableAssignmentName); $unsetList = array(); $counter = 1; if (isset($variableDataItem[3]) && is_array($variableDataItem[3])) { $newParameters = $parameters; $values = $variableDataItem[3]; foreach ($values as $value) { $newParameters['counter'] += 1; $newVariableAssignmentName = $newParameters['variable']; $newVariableAssignmentCounter = $newParameters['counter']; if ($newVariableAssignmentCounter > 0) { $newVariableAssignmentName .= $newVariableAssignmentCounter; } if (eZTemplateNodeTool::isStaticElement($value)) { $staticValue = eZTemplateNodeTool::elementStaticValue($value); $staticValueText = $php->thisVariableText($staticValue, 0, 0, false); if (preg_match("/%code{$counter}%/", $code)) { $matchMap[] = '%code' . $counter . '%'; $replaceMap[] = ''; } $matchMap[] = '%' . $counter . '%'; $replaceMap[] = $staticValueText; } else { $matchMap[] = '%' . $counter . '%'; $replaceMap[] = '$' . $newVariableAssignmentName; $unsetList[] = $newVariableAssignmentName; if (preg_match("/%code{$counter}%/", $code)) { $tmpPHP = new eZPHPCreator('', '', eZTemplateCompiler::TemplatePrefix()); $tmpKnownTypes = array(); eZTemplateCompiler::generateVariableDataCode($tmpPHP, $tpl, $value, $tmpKnownTypes, $dataInspection, $persistence, $newParameters, $resourceData); $newCode = $tmpPHP->fetch(false); if (count($tmpKnownTypes) == 0 or in_array('objectproxy', $tmpKnownTypes)) { $newCode .= "while " . ($resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/" : "") . "( is_object( \${$newVariableAssignmentName} ) and method_exists( \${$newVariableAssignmentName}, 'templateValue' ) )\n" . " \${$newVariableAssignmentName} = \${$newVariableAssignmentName}" . "->templateValue();\n"; } $matchMap[] = '%code' . $counter . '%'; $replaceMap[] = $newCode; } else { $tmpKnownTypes = array(); eZTemplateCompiler::generateVariableDataCode($php, $tpl, $value, $tmpKnownTypes, $dataInspection, $persistence, $newParameters, $resourceData); if (!$parameters['treat-value-as-non-object'] and (count($tmpKnownTypes) == 0 or in_array('objectproxy', $tmpKnownTypes))) { $php->addCodePiece("while " . ($resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/" : "") . "( is_object( \${$newVariableAssignmentName} ) and method_exists( \${$newVariableAssignmentName}, 'templateValue' ) )\n" . " \${$newVariableAssignmentName} = \${$newVariableAssignmentName}" . "->templateValue();\n", array('spacing' => $spacing)); } } } ++$counter; } } if (isset($variableDataItem[4]) && $variableDataItem[4] !== false) { $values = $variableDataItem[4]; for ($i = 0; $i < $values; $i++) { $newParameters['counter'] += 1; $newVariableAssignmentName = $newParameters['variable']; $newVariableAssignmentCounter = $newParameters['counter']; if ($newVariableAssignmentCounter > 0) { $newVariableAssignmentName .= $newVariableAssignmentCounter; } $matchMap[] = '%tmp' . ($i + 1) . '%'; $replaceMap[] = '$' . $newVariableAssignmentName; $unsetList[] = $newVariableAssignmentName; } } if (isset($variableDataItem[5]) and $variableDataItem[5]) { if (is_array($variableDataItem[5])) { $knownTypes = array_unique(array_merge($knownTypes, $variableDataItem[5])); } else { if (is_string($variableDataItem[5])) { $knownTypes = array_unique(array_merge($knownTypes, array($variableDataItem[5]))); } else { $knownTypes = array_unique(array_merge($knownTypes, array('static'))); } } } $code = str_replace($matchMap, $replaceMap, $code); $php->addCodePiece($code, array('spacing' => $spacing)); $php->addVariableUnsetList($unsetList, array('spacing' => $spacing)); } } } } } } } } } } } } } } // After the entire expression line is done we try to extract the actual value if proxies are used $php->addCodePiece("if (! isset( \${$variableAssignmentName} ) ) \${$variableAssignmentName} = NULL;\n"); $php->addCodePiece("while " . ($resourceData['use-comments'] ? "/*TC:" . __LINE__ . "*/" : "") . "( is_object( \${$variableAssignmentName} ) and method_exists( \${$variableAssignmentName}, 'templateValue' ) )\n" . " \${$variableAssignmentName} = \${$variableAssignmentName}" . "->templateValue();\n"); }
function templateNodeTransformation($functionName, &$node, $tpl, $parameters, $privateData) { $tpl->ElseifCounter++; $newNodes = array(); $nodesToPrepend = array(); $nodesToAppend = array(); $nodePlacement = eZTemplateNodeTool::extractFunctionNodePlacement($node); $uniqid = md5($nodePlacement[2]) . "_" . $tpl->ElseifCounter; $children = eZTemplateNodeTool::extractFunctionNodeChildren($node); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("// if begins"); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameters['condition'], $nodePlacement, array('treat-value-as-non-object' => true), 'if_cond'); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( \$if_cond )\n{"); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(); if (is_array($children)) { foreach (array_keys($children) as $childKey) { $child =& $children[$childKey]; if ($child[0] == eZTemplate::NODE_FUNCTION) { $childFunctionName =& $child[2]; $childChildren = eZTemplateNodeTool::extractFunctionNodeChildren($child); $childFunctionArgs =& $child[3]; if ($childFunctionName == 'elseif') { $compiledElseifCondition = eZTemplateCompiler::processElementTransformationList($tpl, $child, $childFunctionArgs['condition'], $privateData); $nodesToPrepend[] = eZTemplateNodeTool::createVariableNode(false, $compiledElseifCondition, $nodePlacement, array('text-result' => true), "elseif_cond_{$uniqid}"); $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}\nelseif ( \$elseif_cond_{$uniqid} )\n{"); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(); $nodesToAppend[] = eZTemplateNodeTool::createVariableUnsetNode("elseif_cond_{$uniqid}"); // increment unique elseif counter $uniqid = md5($nodePlacement[2]) . "_" . ++$tpl->ElseifCounter; } elseif ($childFunctionName == 'else') { $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}\nelse\n{"); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(); } elseif ($childFunctionName == 'break') { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("break;\n"); } elseif ($childFunctionName == 'continue') { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("continue;\n"); } elseif ($childFunctionName == 'skip') { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("\$skipDelimiter = true;\ncontinue;\n"); } // let other functions (ones not listed in the conditions above) be transformed if (in_array($childFunctionName, array('elseif', 'else', 'break', 'continue', 'skip'))) { continue; } } $newNodes[] = $child; } } $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}"); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("unset( \$if_cond );"); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("// if ends\n"); $newNodes = array_merge($nodesToPrepend, $newNodes, $nodesToAppend); return $newNodes; }
} else { $text = "Compilation failed: " . $cli->stylize('file', $file); } $script->iterate($cli, $status, $text); } } } else { $ini = eZINI::instance(); $standardDesign = $ini->variable("DesignSettings", "StandardDesign"); $siteDesign = $ini->variable("DesignSettings", "SiteDesign"); $additionalSiteDesignList = $ini->variable("DesignSettings", "AdditionalSiteDesignList"); $designList = array_merge(array($standardDesign), $additionalSiteDesignList, array($siteDesign)); $tpl = eZTemplate::factory(); $script->setIterationData('.', '~'); if ($forceCompile) { eZTemplateCompiler::setSettings(array('generate' => true)); } $extensionDirectory = eZExtension::baseDirectory(); $designINI = eZINI::instance('design.ini'); $extensions = $designINI->variable('ExtensionSettings', 'DesignExtensions'); foreach ($designList as $design) { $cli->output("Compiling in design " . $cli->stylize('emphasize', $design)); $baseDir = 'design/' . $design; $files = eZDir::recursiveFindRelative('', "{$baseDir}/templates", "\\.tpl"); $files = array_merge($files, eZDir::recursiveFindRelative('', "{$baseDir}/override/templates", "\\.tpl")); foreach ($extensions as $extension) { $files = array_merge($files, eZDir::recursiveFindRelative('', "{$extensionDirectory}/{$extension}/{$baseDir}/templates", "\\.tpl")); $files = array_merge($files, eZDir::recursiveFindRelative('', "{$extensionDirectory}/{$extension}/{$baseDir}/override/templates", "\\.tpl")); } $script->resetIteration(count($files)); foreach ($files as $file) {
function templateNodeCaseTransformation($tpl, &$newNodes, &$caseNodes, &$caseCounter, &$node, $privateData) { if ($node[2] == 'case') { if (is_array($node[3]) && count($node[3])) { if (isset($node[3]['match'])) { $match = $node[3]['match']; $match = eZTemplateCompiler::processElementTransformationList($tpl, $node, $match, $privateData); $dynamicCase = false; if (eZTemplateNodeTool::isConstantElement($match)) { $matchValue = eZTemplateNodeTool::elementConstantValue($match); $caseText = eZPHPCreator::variableText($matchValue, 0, 0, false); } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $match, false, array(), 'case' . $caseCounter); $caseText = "\$case" . $caseCounter; ++$caseCounter; $dynamicCase = true; } $caseNodes[] = eZTemplateNodeTool::createCodePieceNode(" case {$caseText}:\n {"); if ($dynamicCase) { $caseNodes[] = eZTemplateNodeTool::createCodePieceNode(" unset( {$caseText} );"); } } else { if (isset($node[3]['in'])) { return false; } } } else { $caseNodes[] = eZTemplateNodeTool::createCodePieceNode(" default:\n {"); } $children = eZTemplateNodeTool::extractFunctionNodeChildren($node); if ($children === false) { $children = array(); } else { $children = eZTemplateCompiler::processNodeTransformationNodes($tpl, $node, $children, $privateData); } $caseNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(8); $caseNodes = array_merge($caseNodes, $children); $caseNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(8); $caseNodes[] = eZTemplateNodeTool::createCodePieceNode(" } break;"); } }
function canCompileTemplate($tpl, &$resourceData, &$extraParameters) { return eZTemplateCompiler::isCompilationEnabled(); }
function templateNodeTransformation($functionName, &$node, $tpl, $parameters, $privateData) { if ($functionName != $this->BlockName) { return false; } $parameters = eZTemplateNodeTool::extractFunctionNodeParameters($node); if (!isset($parameters['name'])) { return false; } // Read ini file $toolbarIni = eZINI::instance("toolbar.ini"); if (isset($parameters["view"])) { $viewData = $parameters["view"]; $viewMode = eZTemplateNodeTool::elementConstantValue($viewData); } else { $viewMode = "full"; } $params = $parameters; $namespaceValue = false; if (isset($parameters["name"])) { $nameData = $parameters["name"]; if (!eZTemplateNodeTool::isConstantElement($nameData)) { return false; } $nameValue = eZTemplateNodeTool::elementConstantValue($nameData); $toolbarPosition = $nameValue; $toolbarName = "Toolbar_" . $toolbarPosition; $toolArray = $toolbarIni->variable($toolbarName, 'Tool'); if (!is_array($toolArray)) { $toolArray = array(); } $newNodes = array(); foreach (array_keys($toolArray) as $toolKey) { $tool = $toolArray[$toolKey]; $placement = $toolKey + 1; $uriString = "design:toolbar/{$viewMode}/{$tool}.tpl"; $placementValue = ""; $firstValue = false; $lastValue = false; if ($placement == 1) { if ($placement == count($toolArray)) { $firstValue = true; $lastValue = true; $placementValue = "last"; } else { $firstValue = true; $placementValue = "first"; } } else { if ($placement == count($toolArray)) { $lastValue = true; $placementValue = "last"; } } $resourceName = ""; $templateName = ""; $resource = $tpl->resourceFor($uriString, $resourceName, $templateName); $resourceData = $tpl->resourceData($resource, $uriString, $resourceName, $templateName); $resourceData['use-comments'] = eZTemplateCompiler::isCommentsEnabled(); $includeNodes = $resource->templateNodeTransformation($functionName, $node, $tpl, $resourceData, $parameters, $namespaceValue); if ($includeNodes === false) { return false; } $uniqID = md5(uniqid('inc')); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("\$oldRestoreIncludeArray" . "_{$uniqID} = isset( \$restoreIncludeArray ) ? \$restoreIncludeArray : array();\n" . "\$restoreIncludeArray = array();\n"); $variableList = array(); foreach (array_keys($parameters) as $parameterName) { if ($parameterName == 'name' or $parameterName == 'view') { continue; } $parameterData =& $parameters[$parameterName]; $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( isset( \$vars['']['{$parameterName}'] ) )\n" . " \$restoreIncludeArray[] = array( '', '{$parameterName}', \$vars['']['{$parameterName}'] );\n" . "elseif ( !isset( \$vars['']['{$parameterName}'] ) ) \n" . " \$restoreIncludeArray[] = array( '', '{$parameterName}', 'unset' );\n"); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameterData, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, $parameterName)); $variableList[] = $parameterName; } $actionParameters = array(); if ($toolbarIni->hasGroup("Tool_" . $tool)) { $actionParameters = $toolbarIni->group("Tool_" . $tool); } if ($toolbarIni->hasGroup("Tool_" . $toolbarPosition . "_" . $tool . "_" . $placement)) { $actionParameters = array_merge($actionParameters, $toolbarIni->group("Tool_" . $toolbarPosition . "_" . $tool . "_" . $placement)); } foreach (array_keys($actionParameters) as $key) { $itemValue = $actionParameters[$key]; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $itemValue, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, $key)); $variableList[] = $key; } // Add parameter tool_id and offset $toolIDValue = "Tool_" . $toolbarPosition . "_" . $tool . "_" . $placement; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $toolIDValue, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, "tool_id")); $variableList[] = "tool_id"; $toolOffset = $placement; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $toolOffset, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, "offset")); $variableList[] = "offset"; // Add parameter first, last and placement $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $firstValue, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, "first")); $variableList[] = "first"; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $lastValue, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, "last")); $variableList[] = "last"; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $placementValue, false, array(), array($namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, "placement")); $variableList[] = "placement"; $newNodes = array_merge($newNodes, $includeNodes); // Restore previous variables, before including $newNodes[] = eZTemplateNodeTool::createCodePieceNode("foreach ( \$restoreIncludeArray as \$element )\n" . "{\n" . " if ( \$element[2] === 'unset' )\n" . " {\n" . " unset( \$vars[\$element[0]][\$element[1]] );\n" . " continue;\n" . " }\n" . " \$vars[\$element[0]][\$element[1]] = \$element[2];\n" . "}\n" . "\$restoreIncludeArray = \$oldRestoreIncludeArray" . "_{$uniqID};\n"); } } return $newNodes; }
function compileTemplateFile($file, $returnResourceData = false) { $this->resetErrorLog(); if (!file_exists($file)) { return false; } $resourceHandler = $this->resourceFor($file, $resourceName, $templateName); if (!$resourceHandler) { return false; } $resourceData = $this->resourceData($resourceHandler, $file, $resourceName, $templateName); $resourceData['key-data'] = "file:" . $file; $key = md5($resourceData['key-data']); $extraParameters = array(); $resourceHandler->handleResource($this, $resourceData, eZTemplate::RESOURCE_FETCH, $extraParameters); $isCompiled = false; if (isset($resourceData['compiled-template'])) { $isCompiled = $resourceData['compiled-template']; } if (!$isCompiled) { $root =& $resourceData['root-node']; $root = array(eZTemplate::NODE_ROOT, false); $templateText = $resourceData["text"]; $rootNamespace = ''; $this->parse($templateText, $root, $rootNamespace, $resourceData); if (eZTemplate::isDebugEnabled()) { $this->appendDebugNodes($root, $resourceData); } $result = eZTemplateCompiler::compileTemplate($this, $key, $resourceData); } else { $result = true; } if ($returnResourceData) { $resourceData['result'] = $result; return $resourceData; } return $result; }
function templateNodeTransformation($functionName, &$node, $tpl, $parameters, $privateData) { $useLastValue = false; if (isset($parameters['last-value']) and !eZTemplateNodeTool::isConstantElement($parameters['last-value'])) { return false; } if (isset($parameters['name']) and !eZTemplateNodeTool::isConstantElement($parameters['name'])) { return false; } if (isset($parameters['var']) and !eZTemplateNodeTool::isConstantElement($parameters['var'])) { return false; } if (isset($parameters['reverse']) and !eZTemplateNodeTool::isConstantElement($parameters['reverse'])) { return false; } $varName = false; if (isset($parameters['var'])) { $varName = eZTemplateNodeTool::elementConstantValue($parameters['var']); } if (isset($parameters['last-value'])) { $useLastValue = (bool) eZTemplateNodeTool::elementConstantValue($parameters['last-value']); } if (!$varName) { $useLastValue = false; } $reverseLoop = false; if (isset($parameters['reverse'])) { $reverseLoop = eZTemplateNodeTool::elementConstantValue($parameters['reverse']); } $useLoop = isset($parameters['loop']); $allowLoop = true; $newNodes = array(); $maxText = "false"; $useMax = false; $maxPopText = false; if (isset($parameters['max'])) { if (eZTemplateNodeTool::isConstantElement($parameters['max'])) { $maxValue = eZTemplateNodeTool::elementConstantValue($parameters['max']); if ($maxValue > 0) { $maxText = eZPHPCreator::variableText($maxValue); $useMax = true; } else { return array(eZTemplateNodeTool::createTextNode('')); } } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameters['max'], eZTemplateNodeTool::extractFunctionNodePlacement($node), array(), 'max'); $maxText = "\$max"; $maxPopText = ", \$max"; $useMax = true; } } // Controls whether the 'if' statement with brackets is added $useShow = false; // Controls whether main nodes are handled, also controls delimiter and filters $useMain = true; // Controls wether else nodes are handled $useElse = false; $spacing = 0; if (isset($parameters['show'])) { if (eZTemplateNodeTool::isConstantElement($parameters['show'])) { $showValue = eZTemplateNodeTool::elementConstantValue($parameters['show']); if ($showValue) { $useMain = true; $useElse = false; $useShow = false; } else { $useMain = false; $useElse = true; $useShow = false; } $newNodes[] = eZTemplateNodeTool::createTextNode(''); } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameters['show'], eZTemplateNodeTool::extractFunctionNodePlacement($node), array(), 'show'); $spacing = 4; $useElse = true; $useShow = true; } } $children = eZTemplateNodeTool::extractFunctionNodeChildren($node); if ($useShow) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( \$show )\n{\n"); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode($spacing); $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode('show'); } if (isset($parameters['name']) and !$useLoop) { $newNodes[] = eZTemplateNodeTool::createNamespaceChangeNode($parameters['name']); } $mainNodes = eZTemplateNodeTool::extractNodes($children, array('match' => array('type' => 'before', 'matches' => array(array('match-keys' => array(0), 'match-with' => eZTemplate::NODE_FUNCTION), array('match-keys' => array(2), 'match-with' => 'section-else')), 'filter' => array(array(array('match-keys' => array(0), 'match-with' => eZTemplate::NODE_FUNCTION), array('match-keys' => array(2), 'match-with' => array('delimiter', 'section-exclude', 'section-include'))))))); $delimiterNodes = eZTemplateNodeTool::extractNodes($children, array('match' => array('type' => 'equal', 'matches' => array(array('match-keys' => array(0), 'match-with' => eZTemplate::NODE_FUNCTION), array('match-keys' => array(2), 'match-with' => 'delimiter'))))); $filterNodes = eZTemplateNodeTool::extractNodes($children, array('match' => array('type' => 'equal', 'matches' => array(array('match-keys' => array(0), 'match-with' => eZTemplate::NODE_FUNCTION), array('match-keys' => array(2), 'match-with' => array('section-exclude', 'section-include')))))); $delimiterNode = false; if (count($delimiterNodes) > 0) { $delimiterNode = $delimiterNodes[0]; } if ($useMain) { // Avoid transformation if the nodes will not be used, saves time $mainNodes = eZTemplateCompiler::processNodeTransformationNodes($tpl, $node, $mainNodes, $privateData); } if ($useLoop and $useMain) { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $parameters['loop'], eZTemplateNodeTool::extractFunctionNodePlacement($node), array(), 'loopItem'); $hasSequence = false; if (isset($parameters['sequence'])) { $sequenceParameter = $parameters['sequence']; $hasSequence = true; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $sequenceParameter, eZTemplateNodeTool::extractFunctionNodePlacement($node), array(), 'sequence'); } if (isset($parameters['name'])) { $newNodes[] = eZTemplateNodeTool::createNamespaceChangeNode($parameters['name']); } $code = "if ( !isset( \$sectionStack ) )\n" . " \$sectionStack = array();\n"; $variableValuePushText = ''; $variableValuePopText = ''; if ($varName) { $code .= "\$variableValue = new eZTemplateSectionIterator();\n" . "\$lastVariableValue = false;\n"; $variableValuePushText = "&\$variableValue, "; $variableValuePopText = "\$variableValue, "; } $code .= "\$index = 0;\n" . "\$currentIndex = 1;\n"; $arrayCode = ''; $numericCode = ''; $stringCode = ''; $offsetText = '0'; if (isset($parameters['offset'])) { $offsetParameter = $parameters['offset']; if (eZTemplateNodeTool::isConstantElement($offsetParameter)) { $iterationValue = (int) eZTemplateNodeTool::elementConstantValue($offsetParameter); if ($iterationValue > 0) { $arrayCode = " \$loopKeys = array_splice( \$loopKeys, {$iterationValue} );\n"; } $offsetText = $iterationValue; } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $offsetParameter, eZTemplateNodeTool::extractFunctionNodePlacement($node), array(), 'offset'); $arrayCode = " if ( \$offset > 0 )\n" . " \$loopKeys = array_splice( \$loopKeys, \$offset );\n"; $offsetText = "\$offset"; } } // Initialization for array $code .= "if ( is_array( \$loopItem ) )\n{\n" . " \$loopKeys = array_keys( \$loopItem );\n"; if ($reverseLoop) { $code .= " \$loopKeys = array_reverse( \$loopKeys );\n"; } $code .= $arrayCode; $code .= " \$loopCount = count( \$loopKeys );\n"; $code .= "}\n"; // Initialization for numeric $code .= "else if ( is_numeric( \$loopItem ) )\n{\n" . " \$loopKeys = false;\n" . $numericCode . " if ( \$loopItem < 0 )\n" . " \$loopCountValue = -\$loopItem;\n" . " else\n" . " \$loopCountValue = \$loopItem;\n" . " \$loopCount = \$loopCountValue - {$offsetText};\n" . "}\n"; // Initialization for string $code .= "else if ( is_string( \$loopItem ) )\n{\n" . " \$loopKeys = false;\n" . $stringCode . " \$loopCount = strlen( \$loopItem ) - {$offsetText};\n" . "}\n"; // Fallback for no item $code .= "else\n{\n" . " \$loopKeys = false;\n" . " \$loopCount = 0;\n" . "}"; // Initialization end $newNodes[] = eZTemplateNodeTool::createCodePieceNode($code); $code = "while ( \$index < \$loopCount )\n" . "{\n"; if ($useMax) { $code .= " if ( \$currentIndex > {$maxText} )\n" . " break;\n" . " unset( \$item );\n"; } // Iterator check for array $code .= " if ( is_array( \$loopItem ) )\n" . " {\n" . " \$loopKey = \$loopKeys[\$index];\n" . " unset( \$item );\n" . " \$item = \$loopItem[\$loopKey];\n" . " }\n"; // Iterator check for numeric $code .= " else if ( is_numeric( \$loopItem ) )\n" . " {\n" . " unset( \$item );\n"; if ($reverseLoop) { $code .= " \$item = \$loopCountValue - \$index - {$offsetText};\n"; } else { $code .= " \$item = \$index + {$offsetText} + 1;\n"; } $code .= " if ( \$loopItem < 0 )\n" . " \$item = -\$item;\n"; if ($reverseLoop) { $code .= " \$loopKey = \$loopCountValue - \$index - {$offsetText} - 1;\n"; } else { $code .= " \$loopKey = \$index + {$offsetText};\n"; } $code .= " }\n"; // Iterator check for string $code .= " else if ( is_string( \$loopItem ) )\n" . " {\n" . " unset( \$item );\n"; if ($reverseLoop) { $code .= " \$loopKey = \$loopCount - \$index - {$offsetText} + 1;\n"; } else { $code .= " \$loopKey = \$index + {$offsetText};\n"; } $code .= " \$item = \$loopItem[\$loopKey];\n" . " }\n"; // Iterator check end $code .= " unset( \$last );\n" . " \$last = false;\n"; $newNodes[] = eZTemplateNodeTool::createCodePieceNode($code); $code = ''; if ($useLastValue) { $code .= " if ( \$currentIndex > 1 )\n" . " {\n" . " \$last = \$lastVariableValue;\n" . " \$variableValue = new eZTemplateSectionIterator();\n" . " }\n"; } if ($varName) { $code .= " \$variableValue->setIteratorValues( \$item, \$loopKey, \$currentIndex - 1, \$currentIndex, false, \$last );"; $newNodes[] = eZTemplateNodeTool::createCodePieceNode($code); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'variableValue', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, $varName), false, true, true); } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'loopKey', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, 'key'), false, true, true); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'item', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, 'item'), false, true, true); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("\$currentIndexInc = \$currentIndex - 1;\n"); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'currentIndexInc', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, 'index'), false, true, true); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'currentIndex', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, 'number'), false, true, true); } $mainSpacing = 0; $hasFilter = false; if (count($filterNodes) > 0) { $newFilterNodes = array(); $matchValue = true; $hasDynamicFilter = false; foreach ($filterNodes as $filterNode) { $filterParameters = eZTemplateNodeTool::extractFunctionNodeParameters($filterNode); if (!isset($filterParameters['match'])) { continue; } $hasFilter = true; $filterParameterMatch = $filterParameters['match']; $filterParameterMatch = eZTemplateCompiler::processElementTransformationList($tpl, $filterNode, $filterParameterMatch, $privateData); if (eZTemplateNodeTool::isConstantElement($filterParameterMatch)) { $matchValue = eZTemplateNodeTool::elementConstantValue($filterParameterMatch); if (eZTemplateNodeTool::extractFunctionNodeName($filterNode) == 'section-exclude') { if ($matchValue) { $matchValue = false; } } else { if ($matchValue) { $matchValue = true; } } $newFilterNodes = array(); $hasDynamicFilter = false; } else { $newFilterNodes[] = eZTemplateNodeTool::createVariableNode(false, $filterParameterMatch, eZTemplateNodeTool::extractFunctionNodePlacement($filterNode), array('spacing' => 4), 'tmpMatchValue'); if (eZTemplateNodeTool::extractFunctionNodeName($filterNode) == 'section-exclude') { $newFilterNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( \$tmpMatchValue )\n \$matchValue = false;", array('spacing' => 4)); } else { $newFilterNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( \$tmpMatchValue )\n \$matchValue = true;", array('spacing' => 4)); } $hasDynamicFilter = true; } } if ($hasFilter) { $mainSpacing += 4; $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $matchValue, eZTemplateNodeTool::extractFunctionNodePlacement($filterNode), array('spacing' => 4), 'matchValue'); if ($hasDynamicFilter) { $newNodes = array_merge($newNodes, $newFilterNodes); } $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( \$matchValue )\n{\n", array('spacing' => 4)); } } $sequencePopText = ''; if ($hasSequence) { $sequencePopText = ", \$sequence"; if ($varName) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( is_array( \$sequence ) )\n" . "{\n" . " \$sequenceValue = array_shift( \$sequence );\n" . " \$variableValue->setSequence( \$sequenceValue );\n" . " \$sequence[] = \$sequenceValue;\n" . " unset( \$sequenceValue );\n" . "}", array('spacing' => $mainSpacing + 4)); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'variableValue', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, $varName), false, true, true); } else { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( is_array( \$sequence ) )\n" . "{\n" . " \$sequenceValue = array_shift( \$sequence );\n", array('spacing' => $mainSpacing + 4)); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'sequenceValue', eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => $mainSpacing + 4), array('', eZTemplate::NAMESPACE_SCOPE_RELATIVE, 'sequence'), false, true, true); $newNodes[] = eZTemplateNodeTool::createCodePieceNode(" \$sequence[] = \$sequenceValue;\n" . " unset( \$sequenceValue );\n" . "}", array('spacing' => $mainSpacing + 4)); } } $code = "\$sectionStack[] = array( " . $variableValuePushText . "&\$loopItem, \$loopKeys, \$loopCount, \$currentIndex, \$index" . $sequencePopText . $maxPopText . " );\n" . "unset( \$loopItem, \$loopKeys );\n"; $newNodes[] = eZTemplateNodeTool::createCodePieceNode($code, array('spacing' => $mainSpacing + 4)); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode($mainSpacing + 4); if ($delimiterNode) { $delimiterChildren = eZTemplateNodeTool::extractFunctionNodeChildren($delimiterNode); $delimiterParameters = eZTemplateNodeTool::extractFunctionNodeParameters($delimiterNode); $delimiterChildren = eZTemplateCompiler::processNodeTransformationNodes($tpl, $node, $delimiterChildren, $privateData); $delimiterModulo = false; $matchCode = false; $useModulo = true; if (isset($delimiterParameters['match'])) { $delimiterMatch = $delimiterParameters['match']; $delimiterMatch = eZTemplateCompiler::processElementTransformationList($tpl, $delimiterNode, $delimiterMatch, $privateData); if (eZTemplateNodeTool::isConstantElement($delimiterMatch)) { $moduloValue = eZTemplateNodeTool::elementConstantValue($delimiterMatch); $useModulo = false; } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $delimiterMatch, eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 0), 'matchValue'); $matchCode = " and \$matchValue"; } } else { if (isset($delimiterParameters['modulo'])) { $delimiterModulo = $delimiterParameters['modulo']; $delimiterModulo = eZTemplateCompiler::processElementTransformationList($tpl, $delimiterModulo, $delimiterModulo, $privateData); if (eZTemplateNodeTool::isConstantElement($delimiterModulo)) { $moduloValue = (int) eZTemplateNodeTool::elementConstantValue($delimiterModulo); $matchCode = " and ( ( \$currentIndex - 1 ) % {$moduloValue} ) == 0"; } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $delimiterModulo, eZTemplateNodeTool::extractFunctionNodePlacement($node), array('spacing' => 0), 'moduloValue'); $matchCode = " and ( ( \$currentIndex - 1 ) % \$moduloValue ) == 0"; } } } if ($useModulo) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( \$currentIndex > 1{$matchCode} )\n{"); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(4); $newNodes = array_merge($newNodes, $delimiterChildren); $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(4); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}\n"); } } $newNodes = array_merge($newNodes, $mainNodes); $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode($mainSpacing + 4); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("list( " . $variableValuePopText . "\$loopItem, \$loopKeys, \$loopCount, \$currentIndex, \$index" . $sequencePopText . $maxPopText . " ) = array_pop( \$sectionStack );", array('spacing' => $mainSpacing + 4)); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("++\$currentIndex;\n", array('spacing' => $mainSpacing + 4)); if ($varName) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode("\$lastVariableValue = \$variableValue;", array('spacing' => $mainSpacing + 4)); } if ($hasFilter) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode(" }"); $mainSpacing -= 4; } $newNodes[] = eZTemplateNodeTool::createCodePieceNode("++\$index;\n", array('spacing' => $mainSpacing + 4)); $code = "}\n" . "unset( \$loopKeys, \$loopCount, \$index, \$last, \$loopIndex, \$loopItem"; if ($hasSequence) { $code .= ", \$sequence"; } $code .= " );"; $newNodes[] = eZTemplateNodeTool::createCodePieceNode($code); } else { if ($useMain) { $newNodes = array_merge($newNodes, $mainNodes); } } if (isset($parameters['name'])) { $newNodes[] = eZTemplateNodeTool::createNamespaceRestoreNode(); } if ($useShow) { $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode($spacing); } if ($useElse) { $elseNodes = eZTemplateNodeTool::extractNodes($children, array('match' => array('type' => 'after', 'matches' => array(array('match-keys' => array(0), 'match-with' => eZTemplate::NODE_FUNCTION), array('match-keys' => array(2), 'match-with' => 'section-else'))))); $elseNodes = eZTemplateCompiler::processNodeTransformationNodes($tpl, $node, $elseNodes, $privateData); if (count($elseNodes) > 0) { if ($useShow) { // This is needed if a 'if ( $show )' was used earlier $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}\nelse\n{\n"); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode($spacing); $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode('show'); } if (isset($parameters['name'])) { $newNodes[] = eZTemplateNodeTool::createNamespaceChangeNode($parameters['name']); } $newNodes = array_merge($newNodes, $elseNodes); if (isset($parameters['name'])) { $newNodes[] = eZTemplateNodeTool::createNamespaceRestoreNode(); } if ($useShow) { // This is needed if a 'if ( $show )' was used earlier $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode($spacing); } } if ($useShow) { // This is needed if a 'if ( $show )' was used earlier $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}\n"); } } return $newNodes; }
function processChildren() { // process the loop body $children = eZTemplateNodeTool::extractFunctionNodeChildren( $this->Node ); $transformedChildren = eZTemplateCompiler::processNodeTransformationNodes( $this->Tpl, $this->Node, $children, $this->PrivateData ); $childrenNodes = array(); $delimiter = null; if ( is_array( $transformedChildren ) ) { foreach ( $transformedChildren as $child ) { if ( $child[0] == eZTemplate::NODE_FUNCTION ) // check child type { $childFunctionName = $child[2]; if ( $childFunctionName == 'delimiter' ) { // save delimiter for it to be processed below $delimiter = $child; continue; } elseif ( $childFunctionName == 'break' ) { $childrenNodes[] = eZTemplateNodeTool::createCodePieceNode( "break;\n" ); continue; } elseif ( $childFunctionName == 'continue' ) { $childrenNodes[] = eZTemplateNodeTool::createCodePieceNode( "continue;\n" ); continue; } elseif ( $childFunctionName == 'skip' ) { $childrenNodes[] = eZTemplateNodeTool::createCodePieceNode( "\$skipDelimiter = true;\ncontinue;\n" ); continue; } } $childrenNodes[] = $child; } } if ( $delimiter ) // if delimiter is specified { $delimiterNodes = eZTemplateNodeTool::extractNodes( $children, array( 'match' => array( 'type' => 'equal', 'matches' => array( array( 'match-keys' => array( 0 ), 'match-with' => eZTemplate::NODE_FUNCTION ), array( 'match-keys' => array( 2 ), 'match-with' => 'delimiter' ) ) ) ) ); $delimiterNode = false; if ( count( $delimiterNodes ) > 0 ) $delimiterNode = $delimiterNodes[0]; $delimiterChildren = eZTemplateNodeTool::extractFunctionNodeChildren( $delimiterNode ); $delimiterParameters = eZTemplateNodeTool::extractFunctionNodeParameters( $delimiterNode ); $checkModulo = array(); $checkModuloEnd = array(); $delemiterModuloValue = array(); if ( isset( $delimiterParameters['modulo'] ) ) { switch ( $this->Name ) { case 'foreach': { $delimiterModulo = $delimiterParameters['modulo']; $delimiterModulo = eZTemplateCompiler::processElementTransformationList( $this->Tpl, $delimiterModulo, $delimiterModulo, $this->PrivateData ); // Get unique index $currentIndex = "\$fe_i_$this->UniqID"; if ( eZTemplateNodeTool::isConstantElement( $delimiterModulo ) ) { $moduloValue = (int)eZTemplateNodeTool::elementConstantValue( $delimiterModulo ); $matchCode = "( ( $currentIndex ) % $moduloValue ) == 0"; } else { $delemiterModuloValue[] = eZTemplateNodeTool::createVariableNode( false, $delimiterModulo, eZTemplateNodeTool::extractFunctionNodePlacement( $this->Node ), array( 'spacing' => 0 ), 'moduloValue' ); $matchCode = "( ( $currentIndex ) % \$moduloValue ) == 0"; } $checkModulo[] = eZTemplateNodeTool::createCodePieceNode( "if ( $matchCode ) // Check modulo\n{" ); $checkModulo[] = eZTemplateNodeTool::createSpacingIncreaseNode( 4 ); $checkModuloEnd[] = eZTemplateNodeTool::createSpacingDecreaseNode( 4 ); $checkModuloEnd[] = eZTemplateNodeTool::createCodePieceNode( "}\n" ); } } } $delimiterNodes = array(); $delimiterNodes[] = eZTemplateNodeTool::createCodePieceNode( "if ( \$skipDelimiter )\n" . " \$skipDelimiter = false;\n" . "else\n" . "{ // delimiter begins" ); $delimiterNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(); if ( is_array( $delimiter[1] ) ) // if delimiter has children { // If modulo is specified $delimiterNodes = array_merge( $delimiterNodes, $checkModulo ); foreach ( $delimiter[1] as $delimiterChild ) $delimiterNodes[] = $delimiterChild; // Set end of checking for modulo $delimiterNodes = array_merge( $delimiterNodes, $checkModuloEnd ); } $delimiterNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(); $delimiterNodes[] = eZTemplateNodeTool::createCodePieceNode( "} // delimiter ends\n" ); // we place its code right before other loop children, // if delemiter and modulo are specified and value of modulo is not static // $delemiterModuloValue is initialization of variable // we should place initialization of moduloValue before checking for delimiter $childrenNodes = array_merge( $delemiterModuloValue, $delimiterNodes, $childrenNodes ); } $this->NewNodes = array_merge( $this->NewNodes, $childrenNodes ); }
/** * Clear Template Compile cache */ static function clearTemplateCompileCache() { eZDir::recursiveDelete(eZTemplateCompiler::compilationDirectory()); }
function functionTemplateStatistics($functionName, &$node, $tpl, $resourceData, $namespace, &$stats) { $newNamespace = $namespace; $parameters = eZTemplateNodeTool::extractFunctionNodeParameters($node); if ($functionName == $this->SetName or $functionName == $this->LetName or $functionName == $this->DefaultName) { if (isset($parameters['-name'])) { $nameData = $parameters['-name']; $nameDataInspection = eZTemplateCompiler::inspectVariableData($tpl, $nameData, false, $resourceData); if ($nameDataInspection['is-constant'] and !$nameDataInspection['has-operators'] and !$nameDataInspection['has-attributes']) { $parameterNamespace = $nameDataInspection['new-data'][0][1]; $newNamespace = $tpl->mergeNamespace($namespace, $parameterNamespace); } } } if ($functionName == $this->SetName) { foreach (array_keys($parameters) as $name) { if ($name == '-name') { continue; } $parameter =& $parameters[$name]; eZTemplateCompiler::setVariableStatistics($stats, $newNamespace, $name, array('is_modified' => true)); eZTemplateCompiler::calculateVariableNodeStatistics($tpl, $parameter, false, $resourceData, $namespace, $stats); } } else { if ($functionName == $this->LetName) { foreach (array_keys($parameters) as $name) { if ($name == '-name') { continue; } $parameter =& $parameters[$name]; eZTemplateCompiler::setVariableStatistics($stats, $newNamespace, $name, array('is_created' => true, 'is_removed' => true)); eZTemplateCompiler::calculateVariableNodeStatistics($tpl, $parameter, false, $resourceData, $namespace, $stats); } } else { if ($functionName == $this->DefaultName) { foreach (array_keys($parameters) as $name) { if ($name == '-name') { continue; } $parameter =& $parameters[$name]; eZTemplateCompiler::setVariableStatistics($stats, $newNamespace, $name, array()); eZTemplateCompiler::calculateVariableNodeStatistics($tpl, $parameter, false, $resourceData, $namespace, $stats); } } } } if ($functionName == $this->LetName or $functionName == $this->DefaultName) { $functionChildren = eZTemplateNodeTool::extractFunctionNodeChildren($node); if (is_array($functionChildren)) { eZTemplateCompiler::calculateVariableStatisticsChildren($tpl, $functionChildren, $resourceData, $newNamespace, $stats); } } }