0,0 → 1,157 |
<?php |
/** |
* Smarty Internal Plugin Compile Insert |
* Compiles the {insert} tag |
* |
* @package Smarty |
* @subpackage Compiler |
* @author Uwe Tews |
*/ |
|
/** |
* Smarty Internal Plugin Compile Insert Class |
* |
* @package Smarty |
* @subpackage Compiler |
*/ |
class Smarty_Internal_Compile_Insert extends Smarty_Internal_CompileBase |
{ |
/** |
* Attribute definition: Overwrites base class. |
* |
* @var array |
* @see Smarty_Internal_CompileBase |
*/ |
public $required_attributes = array('name'); |
|
/** |
* Attribute definition: Overwrites base class. |
* |
* @var array |
* @see Smarty_Internal_CompileBase |
*/ |
public $shorttag_order = array('name'); |
|
/** |
* Attribute definition: Overwrites base class. |
* |
* @var array |
* @see Smarty_Internal_CompileBase |
*/ |
public $optional_attributes = array('_any'); |
|
/** |
* Compiles code for the {insert} tag |
* |
* @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); |
$nocacheParam = $compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache); |
if (!$nocacheParam) { |
// do not compile as nocache code |
$compiler->suppressNocacheProcessing = true; |
} |
$compiler->tag_nocache = true; |
$_smarty_tpl = $compiler->template; |
$_name = null; |
$_script = null; |
$_output = '<?php '; |
// save possible attributes |
eval('$_name = @' . $_attr[ 'name' ] . ';'); |
if (isset($_attr[ 'assign' ])) { |
// output will be stored in a smarty variable instead of being displayed |
$_assign = $_attr[ 'assign' ]; |
// create variable to make sure that the compiler knows about its nocache status |
$var = trim($_attr[ 'assign' ], '\''); |
if (isset($compiler->template->tpl_vars[ $var ])) { |
$compiler->template->tpl_vars[ $var ]->nocache = true; |
} else { |
$compiler->template->tpl_vars[ $var ] = new Smarty_Variable(null, true); |
} |
} |
if (isset($_attr[ 'script' ])) { |
// script which must be included |
$_function = "smarty_insert_{$_name}"; |
$_smarty_tpl = $compiler->template; |
$_filepath = false; |
eval('$_script = @' . $_attr[ 'script' ] . ';'); |
if (!isset($compiler->smarty->security_policy) && file_exists($_script)) { |
$_filepath = $_script; |
} else { |
if (isset($compiler->smarty->security_policy)) { |
$_dir = $compiler->smarty->security_policy->trusted_dir; |
} else { |
$_dir = $compiler->smarty instanceof SmartyBC ? $compiler->smarty->trusted_dir : null; |
} |
if (!empty($_dir)) { |
foreach ((array)$_dir as $_script_dir) { |
$_script_dir = rtrim($_script_dir, '/\\') . DIRECTORY_SEPARATOR; |
if (file_exists($_script_dir . $_script)) { |
$_filepath = $_script_dir . $_script; |
break; |
} |
} |
} |
} |
if ($_filepath === false) { |
$compiler->trigger_template_error("{insert} missing script file '{$_script}'", null, true); |
} |
// code for script file loading |
$_output .= "require_once '{$_filepath}' ;"; |
include_once $_filepath; |
if (!is_callable($_function)) { |
$compiler->trigger_template_error( |
" {insert} function '{$_function}' is not callable in script file '{$_script}'", |
null, |
true |
); |
} |
} else { |
$_filepath = 'null'; |
$_function = "insert_{$_name}"; |
// function in PHP script ? |
if (!is_callable($_function)) { |
// try plugin |
if (!$_function = $compiler->getPlugin($_name, 'insert')) { |
$compiler->trigger_template_error( |
"{insert} no function or plugin found for '{$_name}'", |
null, |
true |
); |
} |
} |
} |
// delete {insert} standard attributes |
unset($_attr[ 'name' ], $_attr[ 'assign' ], $_attr[ 'script' ], $_attr[ 'nocache' ]); |
// convert attributes into parameter array string |
$_paramsArray = array(); |
foreach ($_attr as $_key => $_value) { |
$_paramsArray[] = "'$_key' => $_value"; |
} |
$_params = 'array(' . implode(", ", $_paramsArray) . ')'; |
// call insert |
if (isset($_assign)) { |
if ($_smarty_tpl->caching && !$nocacheParam) { |
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}',{$_assign});?>"; |
} else { |
$_output .= "\$_smarty_tpl->assign({$_assign} , {$_function} ({$_params},\$_smarty_tpl), true);?>"; |
} |
} else { |
if ($_smarty_tpl->caching && !$nocacheParam) { |
$_output .= "echo Smarty_Internal_Nocache_Insert::compile ('{$_function}',{$_params}, \$_smarty_tpl, '{$_filepath}');?>"; |
} else { |
$_output .= "echo {$_function}({$_params},\$_smarty_tpl);?>"; |
} |
} |
$compiler->template->compiled->has_nocache_code = true; |
return $_output; |
} |
} |