1<?php 2/** 3 * Smarty Internal Plugin Compile Insert 4 * Compiles the {insert} tag 5 * 6 * @package Smarty 7 * @subpackage Compiler 8 * @author Uwe Tews 9 */ 10 11/** 12 * Smarty Internal Plugin Compile Insert Class 13 * 14 * @package Smarty 15 * @subpackage Compiler 16 */ 17class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase 18{ 19 /** 20 * Attribute definition: Overwrites base class. 21 * 22 * @var array 23 * @see Smarty_Internal_CompileBase 24 */ 25 public $required_attributes = array('name'); 26 27 /** 28 * Attribute definition: Overwrites base class. 29 * 30 * @var array 31 * @see Smarty_Internal_CompileBase 32 */ 33 public $shorttag_order = array('name'); 34 35 /** 36 * Attribute definition: Overwrites base class. 37 * 38 * @var array 39 * @see Smarty_Internal_CompileBase 40 */ 41 public $optional_attributes = array('_any'); 42 43 /** 44 * Compiles code for the {insert} tag 45 * 46 * @param array $args array with attributes from parser 47 * @param \Smarty_Internal_TemplateCompilerBase $compiler compiler object 48 * 49 * @return string compiled code 50 * @throws \SmartyCompilerException 51 * @throws \SmartyException 52 */ 53 public function compile($args, Smarty_Internal_TemplateCompilerBase $compiler) 54 { 55 // check and get attributes 56 $_attr = $this->getAttributes($compiler, $args); 57 $nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache); 58 if (!$nocacheParam) { 59 // do not compile as nocache code 60 $compiler->suppressNocacheProcessing = true; 61 } 62 $compiler->tag_nocache = true; 63 $_smarty_tpl = $compiler->template; 64 $_name = null; 65 $_script = null; 66 $_output = '<?php '; 67 // save possible attributes 68 eval('$_name = @' . $_attr[ 'name' ] . ';'); 69 if (isset($_attr[ 'assign' ])) { 70 // output will be stored in a smarty variable instead of being displayed 71 $_assign = $_attr[ 'assign' ]; 72 // create variable to make sure that the compiler knows about its nocache status 73 $var = trim($_attr[ 'assign' ], '\''); 74 if (isset($compiler->template->tpl_vars[ $var ])) { 75 $compiler->template->tpl_vars[ $var ]->nocache = true; 76 } else { 77 $compiler->template->tpl_vars[ $var ] = new Smarty_Variable(null, true); 78 } 79 } 80 if (isset($_attr[ 'script' ])) { 81 // script which must be included 82 $_function = "smarty_insert_{$_name}"; 83 $_smarty_tpl = $compiler->template; 84 $_filepath = false; 85 eval('$_script = @' . $_attr[ 'script' ] . ';'); 86 if (!isset($compiler->smarty->security_policy) && file_exists($_script)) { 87 $_filepath = $_script; 88 } else { 89 if (isset($compiler->smarty->security_policy)) { 90 $_dir = $compiler->smarty->security_policy->trusted_dir; 91 } else { 92 $_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null; 93 } 94 if (!empty($_dir)) { 95 foreach ((array)$_dir as $_script_dir) { 96 $_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR; 97 if (file_exists($_script_dir . $_script)) { 98 $_filepath = $_script_dir . $_script; 99 break; 100 } 101 } 102 } 103 } 104 if ($_filepath === false) { 105 $compiler->trigger_template_error("{insert} missing script file '{$_script}'", null, true); 106 } 107 // code for script file loading 108 $_output .= "require_once '{$_filepath}' ;"; 109 include_once $_filepath; 110 if (!is_callable($_function)) { 111 $compiler->trigger_template_error( 112 " {insert} function '{$_function}' is not callable in script file '{$_script}'", 113 null, 114 true 115 ); 116 } 117 } else { 118 $_filepath = 'null'; 119 $_function = "insert_{$_name}"; 120 // function in PHP script ? 121 if (!is_callable($_function)) { 122 // try plugin 123 if (!$_function = $compiler->getPlugin($_name, 'insert')) { 124 $compiler->trigger_template_error( 125 "{insert} no function or plugin found for '{$_name}'", 126 null, 127 true 128 ); 129 } 130 } 131 } 132 // delete {insert} standard attributes 133 unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'script' ], $_attr[ 'nocache' ]); 134 // convert attributes into parameter array string 135 $_paramsArray = array(); 136 foreach ($_attr as $_key => $_value) { 137 $_paramsArray[] = "'$_key' => $_value"; 138 } 139 $_params = 'array(' . implode(", ", $_paramsArray) . ')'; 140 // call insert 141 if (isset($_assign)) { 142 if ($_smarty_tpl->caching && !$nocacheParam) { 143 $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>"; 144 } else { 145 $_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>"; 146 } 147 } else { 148 if ($_smarty_tpl->caching && !$nocacheParam) { 149 $_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>"; 150 } else { 151 $_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>"; 152 } 153 } 154 $compiler->template->compiled->has_nocache_code = true; 155 return $_output; 156 } 157} 158