Subversion Repositories ALCASAR

Rev

Details | Last modification | View Log

Rev Author Line No. Line
2809 rexy 1
<?php
2
 
3
/**
4
 * Smarty Method ConfigLoad
5
 *
6
 * Smarty::configLoad() method
7
 *
8
 * @package    Smarty
9
 * @subpackage PluginsInternal
10
 * @author     Uwe Tews
11
 */
12
class Smarty_Internal_Method_ConfigLoad
13
{
14
    /**
15
     * Valid for all objects
16
     *
17
     * @var int
18
     */
19
    public $objMap = 7;
20
 
21
    /**
22
     * load a config file, optionally load just selected sections
23
     *
24
     * @api  Smarty::configLoad()
25
     * @link http://www.smarty.net/docs/en/api.config.load.tpl
26
     *
27
     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
28
     * @param string                                                  $config_file filename
29
     * @param mixed                                                   $sections    array of section names, single
30
     *                                                                             section or null
31
     *
32
     * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template
33
     * @throws \Exception
34
     */
35
    public function configLoad(Smarty_Internal_Data $data, $config_file, $sections = null)
36
    {
37
        $this->_loadConfigFile($data, $config_file, $sections, null);
38
        return $data;
39
    }
40
 
41
    /**
42
     * load a config file, optionally load just selected sections
43
     *
44
     * @api  Smarty::configLoad()
45
     * @link http://www.smarty.net/docs/en/api.config.load.tpl
46
     *
47
     * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data
48
     * @param string                                                  $config_file filename
49
     * @param mixed                                                   $sections    array of section names, single
50
     *                                                                             section or null
51
     * @param int                                                     $scope       scope into which config variables
52
     *                                                                             shall be loaded
53
     *
54
     * @throws \Exception
55
     */
56
    public function _loadConfigFile(Smarty_Internal_Data $data, $config_file, $sections = null, $scope = 0)
57
    {
58
        /* @var \Smarty $smarty */
59
        $smarty = $data->_getSmartyObj();
60
        /* @var \Smarty_Internal_Template $confObj */
61
        $confObj = new Smarty_Internal_Template($config_file, $smarty, $data, null, null, null, null, true);
62
        $confObj->caching = Smarty::CACHING_OFF;
63
        $confObj->source->config_sections = $sections;
64
        $confObj->source->scope = $scope;
65
        $confObj->compiled = Smarty_Template_Compiled::load($confObj);
66
        $confObj->compiled->render($confObj);
67
        if ($data->_isTplObj()) {
68
            $data->compiled->file_dependency[ $confObj->source->uid ] =
69
                array($confObj->source->filepath, $confObj->source->getTimeStamp(), $confObj->source->type);
70
        }
71
    }
72
 
73
    /**
74
     * load config variables into template object
75
     *
76
     * @param \Smarty_Internal_Template $tpl
77
     * @param array                     $new_config_vars
78
     */
79
    public function _loadConfigVars(Smarty_Internal_Template $tpl, $new_config_vars)
80
    {
81
        $this->_assignConfigVars($tpl->parent->config_vars, $tpl, $new_config_vars);
82
        $tagScope = $tpl->source->scope;
83
        if ($tagScope >= 0) {
84
            if ($tagScope === Smarty::SCOPE_LOCAL) {
85
                $this->_updateVarStack($tpl, $new_config_vars);
86
                $tagScope = 0;
87
                if (!$tpl->scope) {
88
                    return;
89
                }
90
            }
91
            if ($tpl->parent->_isTplObj() && ($tagScope || $tpl->parent->scope)) {
92
                $mergedScope = $tagScope | $tpl->scope;
93
                if ($mergedScope) {
94
                    // update scopes
95
                    /* @var \Smarty_Internal_Template|\Smarty|\Smarty_Internal_Data $ptr */
96
                    foreach ($tpl->smarty->ext->_updateScope->_getAffectedScopes($tpl->parent, $mergedScope) as $ptr) {
97
                        $this->_assignConfigVars($ptr->config_vars, $tpl, $new_config_vars);
98
                        if ($tagScope && $ptr->_isTplObj() && isset($tpl->_cache[ 'varStack' ])) {
99
                            $this->_updateVarStack($tpl, $new_config_vars);
100
                        }
101
                    }
102
                }
103
            }
104
        }
105
    }
106
 
107
    /**
108
     * Assign all config variables in given scope
109
     *
110
     * @param array                     $config_vars     config variables in scope
111
     * @param \Smarty_Internal_Template $tpl
112
     * @param array                     $new_config_vars loaded config variables
113
     */
114
    public function _assignConfigVars(&$config_vars, Smarty_Internal_Template $tpl, $new_config_vars)
115
    {
116
        // copy global config vars
117
        foreach ($new_config_vars[ 'vars' ] as $variable => $value) {
118
            if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) {
119
                $config_vars[ $variable ] = $value;
120
            } else {
121
                $config_vars[ $variable ] = array_merge((array)$config_vars[ $variable ], (array)$value);
122
            }
123
        }
124
        // scan sections
125
        $sections = $tpl->source->config_sections;
126
        if (!empty($sections)) {
127
            foreach ((array)$sections as $tpl_section) {
128
                if (isset($new_config_vars[ 'sections' ][ $tpl_section ])) {
129
                    foreach ($new_config_vars[ 'sections' ][ $tpl_section ][ 'vars' ] as $variable => $value) {
130
                        if ($tpl->smarty->config_overwrite || !isset($config_vars[ $variable ])) {
131
                            $config_vars[ $variable ] = $value;
132
                        } else {
133
                            $config_vars[ $variable ] = array_merge((array)$config_vars[ $variable ], (array)$value);
134
                        }
135
                    }
136
                }
137
            }
138
        }
139
    }
140
 
141
    /**
142
     * Update config variables in template local variable stack
143
     *
144
     * @param \Smarty_Internal_Template $tpl
145
     * @param array                     $config_vars
146
     */
147
    public function _updateVarStack(Smarty_Internal_Template $tpl, $config_vars)
148
    {
149
        $i = 0;
150
        while (isset($tpl->_cache[ 'varStack' ][ $i ])) {
151
            $this->_assignConfigVars($tpl->_cache[ 'varStack' ][ $i ][ 'config' ], $tpl, $config_vars);
152
            $i++;
153
        }
154
    }
155
 
156
    /**
157
     * gets  a config variable value
158
     *
159
     * @param \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template $data
160
     * @param string                                                  $varName the name of the config variable
161
     * @param bool                                                    $errorEnable
162
     *
163
     * @return null|string  the value of the config variable
164
     */
165
    public function _getConfigVariable(Smarty_Internal_Data $data, $varName, $errorEnable = true)
166
    {
167
        $_ptr = $data;
168
        while ($_ptr !== null) {
169
            if (isset($_ptr->config_vars[ $varName ])) {
170
                // found it, return it
171
                return $_ptr->config_vars[ $varName ];
172
            }
173
            // not found, try at parent
174
            $_ptr = $_ptr->parent;
175
        }
176
        if ($data->smarty->error_unassigned && $errorEnable) {
177
            // force a notice
178
            $x = $$varName;
179
        }
180
        return null;
181
    }
182
}