PageRenderTime 49ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/eztemplate/classes/eztemplateincludefunction.php

http://github.com/ezsystems/ezpublish
PHP | 221 lines | 148 code | 22 blank | 51 comment | 20 complexity | 3ef2bcbe5834ac1aaaeee1c63a6d96ae MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. /**
  3. * File containing the eZTemplateIncludeFunction class.
  4. *
  5. * @copyright Copyright (C) eZ Systems AS. All rights reserved.
  6. * @license For full copyright and license information view LICENSE file distributed with this source code.
  7. * @version //autogentag//
  8. * @package lib
  9. */
  10. /*!
  11. \class eZTemplateIncludeFunction eztemplateincludefunction.php
  12. \ingroup eZTemplateFunctions
  13. \brief Includes external template code using function "include"
  14. Allows the template designer to include another template file
  15. dynamically. This allows for reuse of commonly used template code.
  16. The new template file will loaded into the current namespace or a
  17. namspace specified by the template designer, any extra parameters
  18. to this function is set as template variables for the template file
  19. using the newly aquired namespace.
  20. \code
  21. // Example template code
  22. {include uri=file:myfile.tpl}
  23. {include name=new_namespace uri=/etc/test.tpl}
  24. \endcode
  25. */
  26. class eZTemplateIncludeFunction
  27. {
  28. /**
  29. * Initializes the function with the function name $inc_name.
  30. *
  31. * @param string $inc_name
  32. */
  33. public function __construct( $inc_name = "include" )
  34. {
  35. $this->IncludeName = $inc_name;
  36. }
  37. /*!
  38. Returns an array of the function names, required for eZTemplate::registerFunctions.
  39. */
  40. function functionList()
  41. {
  42. return array( $this->IncludeName );
  43. }
  44. function functionTemplateHints()
  45. {
  46. return array( $this->IncludeName => array( 'parameters' => true,
  47. 'static' => false,
  48. 'transform-children' => true,
  49. 'tree-transformation' => true,
  50. 'transform-parameters' => true ) );
  51. }
  52. function templateNodeTransformation( $functionName, &$node,
  53. $tpl, $parameters, $privateData )
  54. {
  55. if ( $functionName != $this->IncludeName )
  56. return false;
  57. $parameters = eZTemplateNodeTool::extractFunctionNodeParameters( $node );
  58. if ( !isset( $parameters['uri'] ) )
  59. return false;
  60. $uriData = $parameters['uri'];
  61. if ( !eZTemplateNodeTool::isConstantElement( $uriData ) )
  62. return false;
  63. $namespaceValue = false;
  64. $namespaceName = '$currentNamespace';
  65. if ( isset( $parameters['name'] ) )
  66. {
  67. $nameData = $parameters['name'];
  68. if ( !eZTemplateNodeTool::isConstantElement( $nameData ) )
  69. return false;
  70. $namespaceValue = eZTemplateNodeTool::elementConstantValue( $nameData );
  71. $namespaceName = '$namespace';
  72. }
  73. $uriString = eZTemplateNodeTool::elementConstantValue( $uriData );
  74. $resourceName = "";
  75. $templateName = "";
  76. $resource = $tpl->resourceFor( $uriString, $resourceName, $templateName );
  77. $resourceData = $tpl->resourceData( $resource, $uriString, $resourceName, $templateName );
  78. $resourceData['use-comments'] = eZTemplateCompiler::isCommentsEnabled();
  79. $includeNodes = $resource->templateNodeTransformation( $functionName, $node, $tpl, $resourceData, $parameters, $namespaceValue );
  80. if ( $includeNodes === false )
  81. return false;
  82. $newNodes = array();
  83. $variableList = array();
  84. $uniqID = md5( uniqid('inc') );
  85. $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "\$oldRestoreIncludeArray" . "_$uniqID = isset( \$restoreIncludeArray ) ? \$restoreIncludeArray : array();\n".
  86. "\$restoreIncludeArray = array();\n");
  87. foreach ( array_keys( $parameters ) as $parameterName )
  88. {
  89. if ( $parameterName == 'uri' or
  90. $parameterName == 'name' )
  91. continue;
  92. $parameterData =& $parameters[$parameterName];
  93. $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "if ( isset( $namespaceName ) and isset( \$vars[$namespaceName]['$parameterName'] ) )\n".
  94. " \$restoreIncludeArray[] = array( $namespaceName, '$parameterName', \$vars[$namespaceName]['$parameterName'] );\n".
  95. "elseif ( !isset( \$vars[( isset( $namespaceName ) ? $namespaceName : '' )]['$parameterName'] ) ) \n".
  96. " \$restoreIncludeArray[] = array( ( isset( $namespaceName ) ? $namespaceName : '' ), '$parameterName', 'unset' );\n" );
  97. $newNodes[] = eZTemplateNodeTool::createVariableNode( false, $parameterData, false, array(),
  98. array( $namespaceValue, eZTemplate::NAMESPACE_SCOPE_RELATIVE, $parameterName ) );
  99. $variableList[] = $parameterName;
  100. }
  101. $newNodes = array_merge( $newNodes, $includeNodes );
  102. // Restore previous variables, before including
  103. $newNodes[] = eZTemplateNodeTool::createCodePieceNode( "foreach ( \$restoreIncludeArray as \$element )\n".
  104. "{\n".
  105. " if ( \$element[2] === 'unset' )\n".
  106. " {\n".
  107. " unset( \$vars[\$element[0]][\$element[1]] );\n".
  108. " continue;\n".
  109. " }\n".
  110. " \$vars[\$element[0]][\$element[1]] = \$element[2];\n".
  111. "}\n".
  112. "\$restoreIncludeArray = \$oldRestoreIncludeArray" . "_$uniqID;\n" );
  113. return $newNodes;
  114. }
  115. /*!
  116. Loads the file specified in the parameter "uri" with namespace "name".
  117. */
  118. function process( $tpl, &$textElements, $functionName, $functionChildren, $functionParameters, $functionPlacement, $rootNamespace, $currentNamespace )
  119. {
  120. $params = $functionParameters;
  121. if ( !isset( $params["uri"] ) )
  122. {
  123. $tpl->missingParameter( $this->IncludeName, "uri" );
  124. return false;
  125. }
  126. $uri = $tpl->elementValue( $params["uri"], $rootNamespace, $currentNamespace, $functionPlacement );
  127. $name = "";
  128. if ( isset( $params["name"] ) )
  129. $name = $tpl->elementValue( $params["name"], $rootNamespace, $currentNamespace, $functionPlacement );
  130. if ( $currentNamespace != "" )
  131. {
  132. if ( $name != "" )
  133. $name = "$currentNamespace:$name";
  134. else
  135. $name = $currentNamespace;
  136. }
  137. reset( $params );
  138. $whatParamsShouldBeUnset = array();
  139. $whatParamsShouldBeReplaced = array();
  140. while ( ( $key = key( $params ) ) !== null )
  141. {
  142. $item =& $params[$key];
  143. switch ( $key )
  144. {
  145. case "name":
  146. case "uri":
  147. break;
  148. default:
  149. {
  150. if ( !$tpl->hasVariable( $key, $name ) )
  151. {
  152. $whatParamsShouldBeUnset[] = $key; // Tpl vars should be removed after including
  153. }
  154. else
  155. {
  156. $whatParamsShouldBeReplaced[$key] = $tpl->variable( $key, $name ); // Tpl vars should be replaced after including
  157. }
  158. $item_value = $tpl->elementValue( $item, $rootNamespace, $currentNamespace, $functionPlacement );
  159. $tpl->setVariable( $key, $item_value, $name );
  160. } break;
  161. }
  162. next( $params );
  163. }
  164. eZTemplateIncludeFunction::handleInclude( $textElements, $uri, $tpl, $rootNamespace, $name );
  165. // unset var
  166. foreach ( $whatParamsShouldBeUnset as $key )
  167. {
  168. $tpl->unsetVariable( $key, $name );
  169. }
  170. // replace var
  171. foreach ( $whatParamsShouldBeReplaced as $key => $item_value )
  172. {
  173. $tpl->setVariable( $key, $item_value, $name );
  174. }
  175. }
  176. /*!
  177. \static
  178. Takes care of loading the template file and set it in the \a $text parameter.
  179. */
  180. static function handleInclude( &$textElements, &$uri, $tpl, $rootNamespace, $name )
  181. {
  182. $tpl->processURI( $uri, true, $extraParameters, $textElements, $name, $name );
  183. }
  184. /*!
  185. Returns false, telling the template parser that this is a single tag.
  186. */
  187. function hasChildren()
  188. {
  189. return false;
  190. }
  191. /// \privatesection
  192. /// The name of the include function
  193. public $IncludeName;
  194. }
  195. ?>