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