123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- <?php
-
- /**
- * Smarty Internal Plugin Compile extend
- * Compiles the {extends} tag
- *
- * @package Smarty
- * @subpackage Compiler
- * @author Uwe Tews
- */
-
- /**
- * Smarty Internal Plugin Compile extend Class
- *
- * @package Smarty
- * @subpackage Compiler
- */
- class Smarty_Internal_Compile_Extends extends Smarty_Internal_Compile_Shared_Inheritance
- {
- /**
- * Attribute definition: Overwrites base class.
- *
- * @var array
- * @see Smarty_Internal_CompileBase
- */
- public $required_attributes = array('file');
-
- /**
- * Array of names of optional attribute required by tag
- * use array('_any') if there is no restriction of attributes names
- *
- * @var array
- */
- public $optional_attributes = array('extends_resource');
-
- /**
- * Attribute definition: Overwrites base class.
- *
- * @var array
- * @see Smarty_Internal_CompileBase
- */
- public $shorttag_order = array('file');
-
- /**
- * Compiles code for the {extends} tag extends: resource
- *
- * @param array $args array with attributes from parser
- * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object
- *
- * @return string compiled code
- * @throws \SmartyCompilerException
- * @throws \SmartyException
- */
- public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler)
- {
- // check and get attributes
- $_attr = $this->getAttributes($compiler, $args);
- if ($_attr['nocache'] === true) {
- $compiler->trigger_template_error('nocache option not allowed', $compiler->parser->lex->line - 1);
- }
- if (strpos($_attr['file'], '$_tmp') !== false) {
- $compiler->trigger_template_error('illegal value for file attribute', $compiler->parser->lex->line - 1);
- }
- // add code to initialize inheritance
- $this->registerInit($compiler, true);
- $file = trim($_attr['file'], '\'"');
- if (strlen($file) > 8 && substr($file, 0, 8) == 'extends:') {
- // generate code for each template
- $files = array_reverse(explode('|', substr($file, 8)));
- $i = 0;
- foreach ($files as $file) {
- if ($file[0] == '"') {
- $file = trim($file, '".');
- } else {
- $file = "'{$file}'";
- }
- $i ++;
- if ($i == count($files) && isset($_attr['extends_resource'])) {
- $this->compileEndChild($compiler);
- }
- $this->compileInclude($compiler, $file);
- }
- if (!isset($_attr['extends_resource'])) {
- $this->compileEndChild($compiler);
- }
- } else {
- $this->compileEndChild($compiler);
- $this->compileInclude($compiler, $_attr['file']);
- }
- $compiler->has_code = false;
- return '';
- }
-
- /**
- * Add code for inheritance endChild() method to end of template
- *
- * @param \Smarty_Internal_TemplateCompilerBase $compiler
- */
- private function compileEndChild(Smarty_Internal_TemplateCompilerBase $compiler)
- {
- $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag($compiler->parser,
- "<?php \$_smarty_tpl->ext->_inheritance->endChild(\$_smarty_tpl);\n?>\n");
- }
-
- /**
- * Add code for including subtemplate to end of template
- *
- * @param \Smarty_Internal_TemplateCompilerBase $compiler
- * @param string $file subtemplate name
- */
- private function compileInclude(Smarty_Internal_TemplateCompilerBase $compiler, $file)
- {
- $compiler->parser->template_postfix[] = new Smarty_Internal_ParseTree_Tag($compiler->parser,
- $compiler->compileTag('include',
- array($file,
- array('scope' => 'parent'))));
- }
-
- /**
- * Create source code for {extends} from source components array
- *
- * @param []\Smarty_Internal_Template_Source $components
- *
- * @return string
- */
- public static function extendsSourceArrayCode($components)
- {
- $resources = array();
- foreach ($components as $source) {
- $resources[] = $source->resource;
- }
- return '{extends file=\'extends:' . join('|', $resources) . '\' extends_resource=true}';
- }
- }
|