summaryrefslogtreecommitdiff
path: root/libs/sysplugins/smarty_internal_method_configload.php
blob: 5fa17efa028fd240911b2babd416fa203e1c96d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php

/**
 * Smarty Method ConfigLoad
 *
 * Smarty::configLoad() method
 *
 * @package    Smarty
 * @subpackage PluginsInternal
 * @author     Uwe Tews
 */
class Smarty_Internal_Method_ConfigLoad
{
    /**
     * Valid for all objects
     *
     * @var int
     */
    public $objMap = 7;

    /**
     * load a config file, optionally load just selected sections
     *
     * @api  Smarty::configLoad()
     * @link http://www.smarty.net/docs/en/api.config.load.tpl
     *
     * @param \Smarty_Internal_Data|\Smarty_Internal_Template|\Smarty $data
     * @param  string                                                 $config_file filename
     * @param  mixed                                                  $sections    array of section names, single
     *                                                                             section or null
     * @param string                                                  $scope       scope into which config variables
     *                                                                             shall be loaded
     *
     * @return \Smarty|\Smarty_Internal_Data|\Smarty_Internal_Template
     * @throws \SmartyException
     */
    public function configLoad(Smarty_Internal_Data $data, $config_file, $sections = null, $scope = 'local')
    {
        /* @var \Smarty $smarty */
        $smarty = isset($data->smarty) ? $data->smarty : $data;
        /* @var \Smarty_Internal_Template $confObj */
        $confObj = new $smarty->template_class($config_file, $smarty, $data);
        $confObj->caching = Smarty::CACHING_OFF;
        $confObj->source = Smarty_Template_Config::load($confObj);
        $confObj->source->config_sections = $sections;
        $confObj->source->scope = $scope;
        $confObj->compiled = Smarty_Template_Compiled::load($confObj);
        if ($confObj->smarty->debugging) {
            Smarty_Internal_Debug::start_render($confObj);
        }
        $confObj->compiled->render($confObj);
        if ($confObj->smarty->debugging) {
            Smarty_Internal_Debug::end_render($confObj);
        }
        if ($data instanceof Smarty_Internal_Template) {
            $data->compiled->file_dependency[$confObj->source->uid] = array($confObj->source->filepath,
                                                                            $confObj->source->getTimeStamp(),
                                                                            $confObj->source->type);
        }
        return $data;
    }

    /**
     * load config variables into template object
     *
     * @param \Smarty_Internal_Template $_template
     * @param  array                    $_config_vars
     */
    static function _loadConfigVars(Smarty_Internal_Template $_template, $_config_vars)
    {
        $scope = $_template->source->scope;
        // pointer to scope (local scope is parent of template object
        $scope_ptr = $_template->parent;
        if ($scope == 'parent') {
            if (isset($_template->parent->parent)) {
                $scope_ptr = $_template->parent->parent;
            }
        } elseif ($scope == 'root' || $scope == 'global') {
            while (isset($scope_ptr->parent)) {
                $scope_ptr = $scope_ptr->parent;
            }
        }
        // copy global config vars
        foreach ($_config_vars['vars'] as $variable => $value) {
            if ($_template->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
                $scope_ptr->config_vars[$variable] = $value;
            } else {
                $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
            }
        }
        // scan sections
        $sections = $_template->source->config_sections;
        if (!empty($sections)) {
            foreach ((array) $sections as $_template_section) {
                if (isset($_config_vars['sections'][$_template_section])) {
                    foreach ($_config_vars['sections'][$_template_section]['vars'] as $variable => $value) {
                        if ($_template->smarty->config_overwrite || !isset($scope_ptr->config_vars[$variable])) {
                            $scope_ptr->config_vars[$variable] = $value;
                        } else {
                            $scope_ptr->config_vars[$variable] = array_merge((array) $scope_ptr->config_vars[$variable], (array) $value);
                        }
                    }
                }
            }
        }
    }
}