function resourceAcquisitionTransformation( $functionName, &$node, $rule, $inputData, $outputName, $namespaceValue, $templateRoot, $viewDir, $viewValue, $matchFileArray, $acquisitionSpacing, &$resourceData ) { $startRoot = '/' . $templateRoot . $viewDir; $viewFileMatchName = '/' . $templateRoot . '/' . $viewValue . '.tpl'; $startRootLength = strlen( $startRoot ); $matchList = array(); $viewFileMatch = null; foreach ( $matchFileArray as $matchFile ) { if ( !isset( $matchFile['template'] ) ) continue; $path = $matchFile['template']; if ( substr( $path, 0, $startRootLength ) == $startRoot and $path[$startRootLength] == '/' ) { $matchFile['match_part'] = substr( $path, $startRootLength + 1 ); $matchList[] = $matchFile; } if ( $path == $viewFileMatchName ) $viewFileMatch = $matchFile; } $designKeysName = 'dKeys'; $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "if " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "( !isset( \$$designKeysName ) )\n" . "{\n" . " \$resH = \$tpl->resourceHandler( 'design' );\n" . " \$$designKeysName = \$resH->keys();\n" . "}", array( 'spacing' => $acquisitionSpacing ) ); if ( isset( $rule["attribute_keys"] ) ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "if " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "( !isset( \$" . $designKeysName . "Stack ) )\n" . "{\n" . " \$" . $designKeysName . "Stack = array();\n" . "}\n" . "\$" . $designKeysName . "Stack[] = \$$designKeysName;", array( 'spacing' => $acquisitionSpacing ) ); foreach ( $rule["attribute_keys"] as $designKey => $attributeKeyArray ) { $attributeAccessData = array(); $attributeAccessData[] = eZTemplateNodeTool::createVariableElement( $outputName, $namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE ); foreach ( $attributeKeyArray as $attributeKey ) { $attributeAccessData[] = eZTemplateNodeTool::createAttributeLookupElement( $attributeKey ); } $newNodes[] = eZTemplateNodeTool::createVariableNode( false, $attributeAccessData, false, array( 'spacing' => 0 ), 'dKey' ); $designKeyText = eZPHPCreator::variableText( $designKey, 0, 0, false ); $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "\$" . $designKeysName . "[$designKeyText] = \$dKey;", array( 'spacing' => $acquisitionSpacing ) ); $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode( 'dKey' ); } } $attributeAccess = $rule["attribute_access"]; $hasAttributeAccess = false; if ( is_array( $attributeAccess ) ) { $hasAttributeAccess = count( $attributeAccess ) > 0; $attributeAccessCount = 0; foreach ( $attributeAccess as $attributeAccessEntries ) { $attributeAccessData = $inputData; $spacing = $acquisitionSpacing; if ( $attributeAccessCount > 1 ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . " if ( !\$resourceFound )\n{\n", array( 'spacing' => $acquisitionSpacing ) ); $spacing += 4; } else if ( $attributeAccessCount > 0 ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "if " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "( !\$resourceFound )\n{\n", array( 'spacing' => $acquisitionSpacing ) ); $spacing += 4; } foreach ( $attributeAccessEntries as $attributeAccessName ) { // $attributeAccessData[] = eZTemplateNodeTool::createCodePieceNode( "" . ( $resourceData['use-comments'] ? ( "/*TC:" . __LINE__ . "*/" ) : "" ) . "" ); $attributeAccessData[] = eZTemplateNodeTool::createAttributeLookupElement( $attributeAccessName ); } $accessNodes = array(); $accessNodes[] = eZTemplateNodeTool::createVariableNode( false, $attributeAccessData, false, array( 'spacing' => $spacing ), 'attributeAccess' ); $acquisitionNodes = array(); $templateCounter = 0; $hasAcquisitionNodes = false; $matchLookupArray = array(); foreach ( $matchList as $matchItem ) { $tmpAcquisitionNodes = array(); $matchPart = $matchItem['match_part']; if ( preg_match( "/^(.+)\.tpl$/", $matchPart, $matches ) ) $matchPart = $matches[1]; $code = "if " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "( \$attributeAccess == '$matchPart' )\n{\n"; if ( $templateCounter > 0 ) $code = "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "" . $code; $tmpAcquisitionNodes[] = eZTemplateNodeTool::createCodePieceNode( $code, array( 'spacing' => $spacing ) ); $defaultMatchSpacing = $spacing; $useArrayLookup = false; $addFileResource = true; if ( isset( $matchItem['custom_match'] ) ) { $customSpacing = $spacing + 4; $defaultMatchSpacing = $spacing + 4; $matchCount = 0; foreach ( $matchItem['custom_match'] as $customMatch ) { $matchConditionCount = count( $customMatch['conditions'] ); $code = ''; if ( $matchCount > 0 ) { $code = "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . ""; } if ( $matchConditionCount > 0 ) { if ( $matchCount > 0 ) $code .= " "; $code .= "if " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "( "; } $ifLength = strlen( $code ); $conditionCount = 0; if ( isset( $customMatch['conditions'] ) ) { foreach ( $customMatch['conditions'] as $conditionName => $conditionValue ) { if ( $conditionCount > 0 ) $code .= " and\n" . str_repeat( ' ', $ifLength ); $conditionNameText = eZPHPCreator::variableText( $conditionName, 0 ); $conditionValueText = eZPHPCreator::variableText( $conditionValue, 0 ); $code .= "isset( \$" . $designKeysName . "[$conditionNameText] ) and "; if ( $conditionNameText == '"url_alias"' ) { $code .= "( strpos(\$" . $designKeysName . "[$conditionNameText], $conditionValueText ) === 0 )"; } else { $code .= "( is_array( \$" . $designKeysName . "[$conditionNameText] ) ? " . "in_array( $conditionValueText, \$" . $designKeysName . "[$conditionNameText] ) : " . "\$" . $designKeysName . "[$conditionNameText] == $conditionValueText )"; } ++$conditionCount; } } if ( $matchConditionCount > 0 ) { $code .= " )\n"; } if ( $matchConditionCount > 0 or $matchCount > 0 ) { $code .= "{"; } $matchFile = $customMatch['match_file']; $tmpAcquisitionNodes[] = eZTemplateNodeTool::createCodePieceNode( $code, array( 'spacing' => $customSpacing ) ); $hasAcquisitionNodes = true; // If $matchFile is an array we cannot create a transformation for this entry if ( is_array( $matchFile ) ) return false; $tmpAcquisitionNodes[] = eZTemplateNodeTool::createResourceAcquisitionNode( '', $matchFile, $matchFile, eZTemplate::RESOURCE_FETCH, false, $node[4], array( 'spacing' => $customSpacing + 4 ), $rule['namespace'] ); if ( $matchConditionCount > 0 or $matchCount > 0 ) { $tmpAcquisitionNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $customSpacing ) ); } ++$matchCount; if ( $matchConditionCount == 0 ) { $addFileResource = false; break; } } if ( $addFileResource ) $tmpAcquisitionNodes[] = eZTemplateNodeTool::createCodePieceNode( "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . " \n{", array( 'spacing' => $customSpacing ) ); } else { $matchFile = $matchItem['base_dir'] . $matchItem['template']; $matchLookupArray[$matchPart] = $matchFile; $useArrayLookup = true; } if ( !$useArrayLookup ) { if ( $addFileResource ) { $matchFile = $matchItem['base_dir'] . $matchItem['template']; $tmpAcquisitionNodes[] = eZTemplateNodeTool::createResourceAcquisitionNode( '', $matchFile, $matchFile, eZTemplate::RESOURCE_FETCH, false, $node[4], array( 'spacing' => $defaultMatchSpacing + 4 ), $rule['namespace'] ); $hasAcquisitionNodes = true; if ( isset( $matchItem['custom_match'] ) ) $tmpAcquisitionNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $customSpacing ) ); } ++$templateCounter; $tmpAcquisitionNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $spacing ) ); $acquisitionNodes = array_merge( $acquisitionNodes, $tmpAcquisitionNodes ); } } if ( count( $matchLookupArray ) > 0 ) { $newNodes = array_merge( $newNodes, $accessNodes ); $accessNodes = array(); // If $matchFile is an array we cannot create a transformation for this entry if ( is_array( $matchLookupArray ) ) return false; $newNodes[] = eZTemplateNodeTool::createResourceAcquisitionNode( '', $matchLookupArray, false, eZTemplate::RESOURCE_FETCH, false, $node[4], array( 'spacing' => $spacing ), $rule['namespace'], 'attributeAccess' ); if ( $hasAcquisitionNodes ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "\n{", array( 'spacing' => $spacing ) ); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(); } } if ( $hasAcquisitionNodes ) { $newNodes = array_merge( $newNodes, $accessNodes, $acquisitionNodes ); if ( $attributeAccessCount > 0 ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $acquisitionSpacing ) ); } ++$attributeAccessCount; } else if ( count( $matchLookupArray ) == 0 ) { $newNodes[] = eZTemplateNodeTool::createErrorNode( "Failed to load template", $functionName, eZTemplateNodeTool::extractFunctionNodePlacement( $node ), array( 'spacing' => $acquisitionSpacing ) ); } if ( count( $matchLookupArray ) > 0 and $hasAcquisitionNodes ) { $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(); $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $spacing ) ); } } } if ( $viewFileMatch !== null ) { $mainSpacing = 0; if ( $hasAttributeAccess ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "\n{\n", array( 'spacing' => $acquisitionSpacing ) ); $mainSpacing = 4; } $templateCounter = 0; $addFileResource = true; if ( isset( $viewFileMatch['custom_match'] ) ) { $spacing = $mainSpacing + 4; $matchCount = 0; foreach ( $viewFileMatch['custom_match'] as $customMatch ) { $matchConditionCount = count( $customMatch['conditions'] ); $code = ''; if ( $matchCount > 0 ) { $code = "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . ""; } if ( $matchConditionCount > 0 ) { if ( $matchCount > 0 ) $code .= " "; $code .= "if " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "( "; $ifLength = strlen( $code ); $conditionCount = 0; if ( is_array( $customMatch['conditions'] ) ) { foreach ( $customMatch['conditions'] as $conditionName => $conditionValue ) { if ( $conditionCount > 0 ) $code .= " and\n" . str_repeat( ' ', $ifLength ); $conditionNameText = eZPHPCreator::variableText( $conditionName, 0 ); $conditionValueText = eZPHPCreator::variableText( $conditionValue, 0 ); $code .= "isset( \$" . $designKeysName . "[$conditionNameText] ) and "; if ( $conditionNameText == '"url_alias"' ) { $code .= "( strpos(\$" . $designKeysName . "[$conditionNameText], $conditionValueText ) === 0 )"; } else { $code .= "( is_array( \$" . $designKeysName . "[$conditionNameText] ) ? " . "in_array( $conditionValueText, \$" . $designKeysName . "[$conditionNameText] ) : " . "\$" . $designKeysName . "[$conditionNameText] == $conditionValueText )"; } ++$conditionCount; } } $code .= " )\n"; } if ( $matchConditionCount > 0 or $matchCount > 0 ) { $code .= "{"; } $matchFile = $customMatch['match_file']; $newNodes[] = eZTemplateNodeTool::createCodePieceNode( $code, array( 'spacing' => $acquisitionSpacing ) ); // If $matchFile is an array we cannot create a transformation for this entry if ( is_array( $matchFile ) ) return false; $newNodes[] = eZTemplateNodeTool::createResourceAcquisitionNode( '', $matchFile, $matchFile, eZTemplate::RESOURCE_FETCH, false, $node[4], array( 'spacing' => $spacing ), $rule['namespace'] ); if ( $matchConditionCount > 0 or $matchCount > 0 ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $acquisitionSpacing ) ); } ++$matchCount; if ( $matchConditionCount == 0 ) { if ( $matchCount > 0 ) $addFileResource = false; break; } } if ( $addFileResource ) $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "else " . ( $resourceData['use-comments'] ? ( "/*OF:" . __LINE__ . "*/" ) : "" ) . "\n{", array( 'spacing' => $acquisitionSpacing ) ); } if ( $addFileResource ) { $file = $viewFileMatch['base_dir'] . $viewFileMatch['template']; $newNodes[] = eZTemplateNodeTool::createResourceAcquisitionNode( '', $file, $file, eZTemplate::RESOURCE_FETCH, false, $node[4], array( 'spacing' => $mainSpacing ), $rule['namespace'] ); } if ( isset( $viewFileMatch['custom_match'] ) and $addFileResource ) $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "}", array( 'spacing' => $acquisitionSpacing ) ); if ( $hasAttributeAccess ) $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "}\n", array( 'spacing' => $acquisitionSpacing ) ); } if ( isset( $rule["attribute_keys"] ) ) { $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "\$$designKeysName = array_pop( \$" . $designKeysName . "Stack );", array( 'spacing' => $acquisitionSpacing ) ); } return $newNodes; }
function templateNodeTransformation($functionName, &$node, $tpl, $parameters, $privateData) { if ($functionName == $this->BlockName or $functionName == $this->AppendBlockName) { if (!isset($parameters['variable'])) { return false; } $scope = eZTemplate::NAMESPACE_SCOPE_RELATIVE; if (isset($parameters['scope'])) { if (!eZTemplateNodeTool::isConstantElement($parameters['scope'])) { return false; } $scopeText = eZTemplateNodeTool::elementConstantValue($parameters['scope']); if ($scopeText == 'relative') { $scope = eZTemplate::NAMESPACE_SCOPE_RELATIVE; } else { if ($scopeText == 'root') { $scope = eZTemplate::NAMESPACE_SCOPE_LOCAL; } else { if ($scopeText == 'global') { $scope = eZTemplate::NAMESPACE_SCOPE_GLOBAL; } } } } $name = ''; if (isset($parameters['name'])) { if (!eZTemplateNodeTool::isConstantElement($parameters['name'])) { return false; } $name = eZTemplateNodeTool::elementConstantValue($parameters['name']); } $variableName = eZTemplateNodeTool::elementConstantValue($parameters['variable']); $newNodes = array(); $children = eZTemplateNodeTool::extractFunctionNodeChildren($node); $newNodes[] = eZTemplateNodeTool::createOutputVariableIncreaseNode(); $newNodes = array_merge($newNodes, $children); $newNodes[] = eZTemplateNodeTool::createAssignFromOutputVariableNode('blockText'); if ($functionName == $this->AppendBlockName) { $data = array(eZTemplateNodeTool::createVariableElement($variableName, $name, $scope)); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, $data, false, array(), 'blockData'); // This block checks whether the append-block variable is an array or not. // TODO: This is a temporary solution and should also check whether the template variable exists. // This new solution requires probably writing the createVariableElement and createVariableNode your self. $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( is_null ( \$blockData ) ) \$blockData = array();"); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( is_array ( \$blockData ) ) \$blockData[] = \$blockText;"); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("else eZDebug::writeError( \"Variable '{$variableName}' is already in use.\" );"); $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'blockData', false, array(), array($name, $scope, $variableName), false, true, true); $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode('blockData'); } else { $newNodes[] = eZTemplateNodeTool::createVariableNode(false, 'blockText', false, array(), array($name, $scope, $variableName), false, true, true); } $newNodes[] = eZTemplateNodeTool::createVariableUnsetNode('blockText'); $newNodes[] = eZTemplateNodeTool::createOutputVariableDecreaseNode(); return $newNodes; } else { if ($functionName == $this->OnceName) { $functionPlacement = eZTemplateNodeTool::extractFunctionNodePlacement($node); $key = $this->placementKey($functionPlacement); $newNodes = array(); if ($key !== false) { $keyText = eZPHPCreator::variableText($key, 0, 0, false); $placementText = eZPHPCreator::variableText($functionPlacement, 0, 0, false); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("if ( !isset( \$GLOBALS['eZTemplateRunOnceKeys'][{$keyText}] ) )\n" . "{\n" . " \$GLOBALS['eZTemplateRunOnceKeys'][{$keyText}] = {$placementText};"); $children = eZTemplateNodeTool::extractFunctionNodeChildren($node); $newNodes[] = eZTemplateNodeTool::createSpacingIncreaseNode(4); $newNodes = array_merge($newNodes, $children); $newNodes[] = eZTemplateNodeTool::createSpacingDecreaseNode(4); $newNodes[] = eZTemplateNodeTool::createCodePieceNode("}"); } return $newNodes; } } return false; }