diff --git a/library/smarty/libs/sysplugins/smarty_internal_extension_config.php b/library/smarty/libs/sysplugins/smarty_internal_extension_config.php new file mode 100644 --- /dev/null +++ b/library/smarty/libs/sysplugins/smarty_internal_extension_config.php @@ -0,0 +1,154 @@ +smarty) ? $obj->smarty : $obj; + $confObj = new $smarty->template_class($config_file, $smarty, $obj); + $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 ($obj instanceof Smarty_Internal_Template) { + $obj->properties['file_dependency'][$confObj->source->uid] = array($confObj->source->filepath, $confObj->source->timestamp, $confObj->source->type); + } + } + + /** + * load config variables + * + * @param mixed $sections array of section names, single section or null + * @param string $scope global,parent or local + * + * @throws Exception + */ + static function loadConfigVars($_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); + } + } + } + } + } + } + + /** + * Returns a single or all config variables + * + * @param string $varname variable name or null + * @param bool $search_parents + * + * @return string variable value or or array of variables + */ + static function getConfigVars($obj, $varname = null, $search_parents = true) { + $_ptr = $obj; + $var_array = array(); + while ($_ptr !== null) { + if (isset($varname)) { + if (isset($_ptr->config_vars[$varname])) { + return $_ptr->config_vars[$varname]; + } + } else { + $var_array = array_merge($_ptr->config_vars, $var_array); + } + // not found, try at parent + if ($search_parents) { + $_ptr = $_ptr->parent; + } else { + $_ptr = null; + } + } + if (isset($varname)) { + return ''; + } else { + return $var_array; + } + } + + /** + * gets a config variable + * + * @param string $variable the name of the config variable + * @param bool $error_enable + * + * @return mixed the value of the config variable + */ + static function getConfigVariable($obj, $variable, $error_enable = true) { + $_ptr = $obj; + while ($_ptr !== null) { + if (isset($_ptr->config_vars[$variable])) { + // found it, return it + return $_ptr->config_vars[$variable]; + } + // not found, try at parent + $_ptr = $_ptr->parent; + } + if ($obj->error_unassigned && $error_enable) { + // force a notice + $x = $$variable; + } + + return null; + } + + /** + * remove a single or all config variables + * + * @param string $name variable name or null + * + * @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining + */ + static function clearConfig($obj, $name = null) { + if (isset($name)) { + unset($obj->config_vars[$name]); + } else { + $obj->config_vars = array(); + } + return $obj; + } +}