mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-05 02:44:27 +02:00
restructure config file processing
move code into an extension class use Smarty_Internal_Template
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
===== 3.1.22-dev ===== (xx.xx.2015)
|
===== 3.1.22-dev ===== (xx.xx.2015)
|
||||||
|
|
||||||
- optimization restructure template processing by moving code into classes it better belongs to
|
- optimization restructure template processing by moving code into classes it better belongs to
|
||||||
|
- optimization restructure config file processing
|
||||||
|
|
||||||
31.12.2014
|
31.12.2014
|
||||||
- bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING.
|
- bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING.
|
||||||
|
@@ -1,94 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Smarty Internal Plugin
|
|
||||||
*
|
|
||||||
* @package Smarty
|
|
||||||
* @subpackage TemplateResources
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smarty Resource Data Object
|
|
||||||
* Meta Data Container for Config Files
|
|
||||||
*
|
|
||||||
* @package Smarty
|
|
||||||
* @subpackage TemplateResources
|
|
||||||
* @author Rodney Rehm
|
|
||||||
* @property string $content
|
|
||||||
* @property int $timestamp
|
|
||||||
* @property bool $exists
|
|
||||||
*/
|
|
||||||
class Smarty_Config_Source extends Smarty_Template_Source
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* create Config Object container
|
|
||||||
*
|
|
||||||
* @param Smarty_Resource $handler Resource Handler this source object communicates with
|
|
||||||
* @param Smarty $smarty Smarty instance this source object belongs to
|
|
||||||
* @param string $resource full config_resource
|
|
||||||
* @param string $type type of resource
|
|
||||||
* @param string $name resource name
|
|
||||||
* @param string $unique_resource unqiue resource name
|
|
||||||
*/
|
|
||||||
public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name, $unique_resource)
|
|
||||||
{
|
|
||||||
$this->handler = $handler; // Note: prone to circular references
|
|
||||||
|
|
||||||
// Note: these may be ->config_compiler_class etc in the future
|
|
||||||
//$this->config_compiler_class = $handler->config_compiler_class;
|
|
||||||
//$this->config_lexer_class = $handler->config_lexer_class;
|
|
||||||
//$this->config_parser_class = $handler->config_parser_class;
|
|
||||||
|
|
||||||
$this->smarty = $smarty;
|
|
||||||
$this->resource = $resource;
|
|
||||||
$this->type = $type;
|
|
||||||
$this->name = $name;
|
|
||||||
$this->unique_resource = $unique_resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <<magic>> Generic setter.
|
|
||||||
*
|
|
||||||
* @param string $property_name valid: content, timestamp, exists
|
|
||||||
* @param mixed $value newly assigned value (not check for correct type)
|
|
||||||
*
|
|
||||||
* @throws SmartyException when the given property name is not valid
|
|
||||||
*/
|
|
||||||
public function __set($property_name, $value)
|
|
||||||
{
|
|
||||||
switch ($property_name) {
|
|
||||||
case 'content':
|
|
||||||
case 'timestamp':
|
|
||||||
case 'exists':
|
|
||||||
$this->$property_name = $value;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new SmartyException("invalid config property '$property_name'.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* <<magic>> Generic getter.
|
|
||||||
*
|
|
||||||
* @param string $property_name valid: content, timestamp, exists
|
|
||||||
*
|
|
||||||
* @return mixed|void
|
|
||||||
* @throws SmartyException when the given property name is not valid
|
|
||||||
*/
|
|
||||||
public function __get($property_name)
|
|
||||||
{
|
|
||||||
switch ($property_name) {
|
|
||||||
case 'timestamp':
|
|
||||||
case 'exists':
|
|
||||||
$this->handler->populateTimestamp($this);
|
|
||||||
|
|
||||||
return $this->$property_name;
|
|
||||||
|
|
||||||
case 'content':
|
|
||||||
return $this->content = $this->handler->getContent($this);
|
|
||||||
|
|
||||||
default:
|
|
||||||
throw new SmartyException("config property '$property_name' does not exist.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@@ -74,8 +74,7 @@ class Smarty_Internal_Compile_Config_Load extends Smarty_Internal_CompileBase
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// create config object
|
// create config object
|
||||||
$_output = "<?php \$_config = new Smarty_Internal_Config($conf_file, \$_smarty_tpl->smarty, \$_smarty_tpl);";
|
$_output = "<?php Smarty_Internal_Extension_Config::configLoad(\$_smarty_tpl, $conf_file, $section, '$scope');?>";
|
||||||
$_output .= "\$_config->loadConfigVars($section, '$scope'); ?>";
|
|
||||||
|
|
||||||
return $_output;
|
return $_output;
|
||||||
}
|
}
|
||||||
|
@@ -1,306 +0,0 @@
|
|||||||
<?php
|
|
||||||
/**
|
|
||||||
* Smarty Internal Plugin Config
|
|
||||||
*
|
|
||||||
* @package Smarty
|
|
||||||
* @subpackage Config
|
|
||||||
* @author Uwe Tews
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Smarty Internal Plugin Config
|
|
||||||
* Main class for config variables
|
|
||||||
*
|
|
||||||
* @package Smarty
|
|
||||||
* @subpackage Config
|
|
||||||
* @ignore
|
|
||||||
*/
|
|
||||||
class Smarty_Internal_Config
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Smarty instance
|
|
||||||
*
|
|
||||||
* @var Smarty object
|
|
||||||
*/
|
|
||||||
public $smarty = null;
|
|
||||||
/**
|
|
||||||
* Object of config var storage
|
|
||||||
*
|
|
||||||
* @var object
|
|
||||||
*/
|
|
||||||
public $data = null;
|
|
||||||
/**
|
|
||||||
* Config resource
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $config_resource = null;
|
|
||||||
/**
|
|
||||||
* Compiled config file
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $compiled_config = null;
|
|
||||||
/**
|
|
||||||
* filepath of compiled config file
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $compiled_filepath = null;
|
|
||||||
/**
|
|
||||||
* Filemtime of compiled config Filemtime
|
|
||||||
*
|
|
||||||
* @var int
|
|
||||||
*/
|
|
||||||
public $compiled_timestamp = null;
|
|
||||||
/**
|
|
||||||
* flag if compiled config file is invalid and must be (re)compiled
|
|
||||||
*
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
public $mustCompile = null;
|
|
||||||
/**
|
|
||||||
* Config file compiler object
|
|
||||||
*
|
|
||||||
* @var Smarty_Internal_Config_File_Compiler object
|
|
||||||
*/
|
|
||||||
public $compiler_object = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor of config file object
|
|
||||||
*
|
|
||||||
* @param string $config_resource config file resource name
|
|
||||||
* @param Smarty $smarty Smarty instance
|
|
||||||
* @param object $data object for config vars storage
|
|
||||||
*/
|
|
||||||
public function __construct($config_resource, $smarty, $data = null)
|
|
||||||
{
|
|
||||||
$this->data = $data;
|
|
||||||
$this->smarty = $smarty;
|
|
||||||
$this->config_resource = $config_resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the compiled filepath
|
|
||||||
*
|
|
||||||
* @return string the compiled filepath
|
|
||||||
*/
|
|
||||||
public function getCompiledFilepath()
|
|
||||||
{
|
|
||||||
return $this->compiled_filepath === null ?
|
|
||||||
($this->compiled_filepath = $this->buildCompiledFilepath()) :
|
|
||||||
$this->compiled_filepath;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get file path.
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function buildCompiledFilepath()
|
|
||||||
{
|
|
||||||
$_compile_id = isset($this->smarty->compile_id) ? preg_replace('![^\w\|]+!', '_', $this->smarty->compile_id) : null;
|
|
||||||
$_flag = (int) $this->smarty->config_read_hidden + (int) $this->smarty->config_booleanize * 2
|
|
||||||
+ (int) $this->smarty->config_overwrite * 4;
|
|
||||||
$_filepath = sha1(realpath($this->source->filepath) . $_flag);
|
|
||||||
// if use_sub_dirs, break file into directories
|
|
||||||
if ($this->smarty->use_sub_dirs) {
|
|
||||||
$_filepath = substr($_filepath, 0, 2) . DS
|
|
||||||
. substr($_filepath, 2, 2) . DS
|
|
||||||
. substr($_filepath, 4, 2) . DS
|
|
||||||
. $_filepath;
|
|
||||||
}
|
|
||||||
$_compile_dir_sep = $this->smarty->use_sub_dirs ? DS : '^';
|
|
||||||
if (isset($_compile_id)) {
|
|
||||||
$_filepath = $_compile_id . $_compile_dir_sep . $_filepath;
|
|
||||||
}
|
|
||||||
$_compile_dir = $this->smarty->getCompileDir();
|
|
||||||
|
|
||||||
return $_compile_dir . $_filepath . '.' . basename($this->source->name) . '.config' . '.php';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the timestamp of the compiled file
|
|
||||||
*
|
|
||||||
* @return integer the file timestamp
|
|
||||||
*/
|
|
||||||
public function getCompiledTimestamp()
|
|
||||||
{
|
|
||||||
return $this->compiled_timestamp === null
|
|
||||||
? ($this->compiled_timestamp = (file_exists($this->getCompiledFilepath())) ? filemtime($this->getCompiledFilepath()) : false)
|
|
||||||
: $this->compiled_timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns if the current config file must be compiled
|
|
||||||
* It does compare the timestamps of config source and the compiled config and checks the force compile configuration
|
|
||||||
*
|
|
||||||
* @return boolean true if the file must be compiled
|
|
||||||
*/
|
|
||||||
public function mustCompile()
|
|
||||||
{
|
|
||||||
return $this->mustCompile === null ?
|
|
||||||
$this->mustCompile = ($this->smarty->force_compile || $this->getCompiledTimestamp() === false || $this->smarty->compile_check && $this->getCompiledTimestamp() < $this->source->timestamp) :
|
|
||||||
$this->mustCompile;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the compiled config file
|
|
||||||
* It checks if the config file must be compiled or just read the compiled version
|
|
||||||
*
|
|
||||||
* @return string the compiled config file
|
|
||||||
*/
|
|
||||||
public function getCompiledConfig()
|
|
||||||
{
|
|
||||||
if ($this->compiled_config === null) {
|
|
||||||
// see if template needs compiling.
|
|
||||||
if ($this->mustCompile()) {
|
|
||||||
$this->compileConfigSource();
|
|
||||||
} else {
|
|
||||||
$this->compiled_config = file_get_contents($this->getCompiledFilepath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this->compiled_config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compiles the config files
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function compileConfigSource()
|
|
||||||
{
|
|
||||||
// compile template
|
|
||||||
if (!is_object($this->compiler_object)) {
|
|
||||||
// load compiler
|
|
||||||
$this->compiler_object = new Smarty_Internal_Config_File_Compiler($this->smarty);
|
|
||||||
}
|
|
||||||
// compile locking
|
|
||||||
if ($this->smarty->compile_locking) {
|
|
||||||
if ($saved_timestamp = $this->getCompiledTimestamp()) {
|
|
||||||
touch($this->getCompiledFilepath());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// call compiler
|
|
||||||
try {
|
|
||||||
$this->compiler_object->compileSource($this);
|
|
||||||
}
|
|
||||||
catch (Exception $e) {
|
|
||||||
// restore old timestamp in case of error
|
|
||||||
if ($this->smarty->compile_locking && $saved_timestamp) {
|
|
||||||
touch($this->getCompiledFilepath(), $saved_timestamp);
|
|
||||||
}
|
|
||||||
throw $e;
|
|
||||||
}
|
|
||||||
// compiling succeeded
|
|
||||||
// write compiled template
|
|
||||||
Smarty_Internal_Write_File::writeFile($this->getCompiledFilepath(), $this->getCompiledConfig(), $this->smarty);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* load config variables
|
|
||||||
*
|
|
||||||
* @param mixed $sections array of section names, single section or null
|
|
||||||
* @param string $scope global,parent or local
|
|
||||||
*
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function loadConfigVars($sections = null, $scope = 'local')
|
|
||||||
{
|
|
||||||
if ($this->data instanceof Smarty_Internal_Template) {
|
|
||||||
$this->data->properties['file_dependency'][sha1($this->source->filepath)] = array($this->source->filepath, $this->source->timestamp, 'file');
|
|
||||||
}
|
|
||||||
if ($this->mustCompile()) {
|
|
||||||
$this->compileConfigSource();
|
|
||||||
}
|
|
||||||
// pointer to scope
|
|
||||||
if ($scope == 'local') {
|
|
||||||
$scope_ptr = $this->data;
|
|
||||||
} elseif ($scope == 'parent') {
|
|
||||||
if (isset($this->data->parent)) {
|
|
||||||
$scope_ptr = $this->data->parent;
|
|
||||||
} else {
|
|
||||||
$scope_ptr = $this->data;
|
|
||||||
}
|
|
||||||
} elseif ($scope == 'root' || $scope == 'global') {
|
|
||||||
$scope_ptr = $this->data;
|
|
||||||
while (isset($scope_ptr->parent)) {
|
|
||||||
$scope_ptr = $scope_ptr->parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$_config_vars = array();
|
|
||||||
include($this->getCompiledFilepath());
|
|
||||||
// copy global config vars
|
|
||||||
foreach ($_config_vars['vars'] as $variable => $value) {
|
|
||||||
if ($this->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
|
|
||||||
if (!empty($sections)) {
|
|
||||||
foreach ((array) $sections as $this_section) {
|
|
||||||
if (isset($_config_vars['sections'][$this_section])) {
|
|
||||||
foreach ($_config_vars['sections'][$this_section]['vars'] as $variable => $value) {
|
|
||||||
if ($this->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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* set Smarty property in template context
|
|
||||||
*
|
|
||||||
* @param string $property_name property name
|
|
||||||
* @param mixed $value value
|
|
||||||
*
|
|
||||||
* @throws SmartyException if $property_name is not valid
|
|
||||||
*/
|
|
||||||
public function __set($property_name, $value)
|
|
||||||
{
|
|
||||||
switch ($property_name) {
|
|
||||||
case 'source':
|
|
||||||
case 'compiled':
|
|
||||||
$this->$property_name = $value;
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new SmartyException("invalid config property '$property_name'.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* get Smarty property in template context
|
|
||||||
*
|
|
||||||
* @param string $property_name property name
|
|
||||||
*
|
|
||||||
* @return \Smarty_Config_Source|\Smarty_Template_Compiled
|
|
||||||
* @throws SmartyException if $property_name is not valid
|
|
||||||
*/
|
|
||||||
public function __get($property_name)
|
|
||||||
{
|
|
||||||
switch ($property_name) {
|
|
||||||
case 'source':
|
|
||||||
if (empty($this->config_resource)) {
|
|
||||||
throw new SmartyException("Unable to parse resource name \"{$this->config_resource}\"");
|
|
||||||
}
|
|
||||||
$this->source = Smarty_Resource::config($this);
|
|
||||||
|
|
||||||
return $this->source;
|
|
||||||
|
|
||||||
case 'compiled':
|
|
||||||
$this->compiled = $this->source->getCompiled($this);
|
|
||||||
|
|
||||||
return $this->compiled;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new SmartyException("config attribute '$property_name' does not exist.");
|
|
||||||
}
|
|
||||||
}
|
|
@@ -17,6 +17,19 @@
|
|||||||
*/
|
*/
|
||||||
class Smarty_Internal_Config_File_Compiler
|
class Smarty_Internal_Config_File_Compiler
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* Lexer class name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $lexer_class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parser class name
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $parser_class;
|
||||||
/**
|
/**
|
||||||
* Lexer object
|
* Lexer object
|
||||||
*
|
*
|
||||||
@@ -41,9 +54,9 @@ class Smarty_Internal_Config_File_Compiler
|
|||||||
/**
|
/**
|
||||||
* Smarty object
|
* Smarty object
|
||||||
*
|
*
|
||||||
* @var Smarty_Internal_Config object
|
* @var Smarty_Internal_Template object
|
||||||
*/
|
*/
|
||||||
public $config;
|
public $template;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Compiled config data sections and variables
|
* Compiled config data sections and variables
|
||||||
@@ -52,40 +65,52 @@ class Smarty_Internal_Config_File_Compiler
|
|||||||
*/
|
*/
|
||||||
public $config_data = array();
|
public $config_data = array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* compiled config data must always be written
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $write_compiled_code = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize compiler
|
* Initialize compiler
|
||||||
*
|
*
|
||||||
* @param Smarty $smarty base instance
|
* @param string $lexer_class class name
|
||||||
|
* @param string $parser_class class name
|
||||||
|
* @param Smarty $smarty global instance
|
||||||
*/
|
*/
|
||||||
public function __construct($smarty)
|
public function __construct($lexer_class, $parser_class, Smarty $smarty)
|
||||||
{
|
{
|
||||||
|
$this->smarty = $smarty;
|
||||||
|
// get required plugins
|
||||||
|
$this->lexer_class = $lexer_class;
|
||||||
|
$this->parser_class = $parser_class;
|
||||||
$this->smarty = $smarty;
|
$this->smarty = $smarty;
|
||||||
$this->config_data['sections'] = array();
|
$this->config_data['sections'] = array();
|
||||||
$this->config_data['vars'] = array();
|
$this->config_data['vars'] = array();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Method to compile a Smarty template.
|
* Method to compile Smarty config source.
|
||||||
*
|
*
|
||||||
* @param Smarty_Internal_Config $config config object
|
* @param Smarty_Internal_Template $template
|
||||||
*
|
*
|
||||||
* @return bool true if compiling succeeded, false if it failed
|
* @return bool true if compiling succeeded, false if it failed
|
||||||
*/
|
*/
|
||||||
public function compileSource(Smarty_Internal_Config $config)
|
public function compileTemplate(Smarty_Internal_Template $template)
|
||||||
{
|
{
|
||||||
/* here is where the compiling takes place. Smarty
|
$this->template = $template;
|
||||||
tags in the templates are replaces with PHP code,
|
$this->template->properties['file_dependency'][$this->template->source->uid] = array($this->template->source->name, $this->template->source->timestamp, $this->template->source->type);
|
||||||
then written to compiled files. */
|
// on empty config just return
|
||||||
$this->config = $config;
|
if ($template->source->content == '') {
|
||||||
// get config file source
|
|
||||||
$_content = $config->source->content . "\n";
|
|
||||||
// on empty template just return
|
|
||||||
if ($_content == '') {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if ($this->smarty->debugging) {
|
||||||
|
Smarty_Internal_Debug::start_compile($this->template);
|
||||||
|
}
|
||||||
// init the lexer/parser to compile the config file
|
// init the lexer/parser to compile the config file
|
||||||
$lex = new Smarty_Internal_Configfilelexer($_content, $this);
|
$lex = new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $template->source->content) . "\n", $this);
|
||||||
$parser = new Smarty_Internal_Configfileparser($lex, $this);
|
$parser = new $this->parser_class($lex, $this);
|
||||||
|
|
||||||
if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
|
if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
|
||||||
$mbEncoding = mb_internal_encoding();
|
$mbEncoding = mb_internal_encoding();
|
||||||
@@ -94,7 +119,6 @@ class Smarty_Internal_Config_File_Compiler
|
|||||||
$mbEncoding = null;
|
$mbEncoding = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if ($this->smarty->_parserdebug) {
|
if ($this->smarty->_parserdebug) {
|
||||||
$parser->PrintTrace();
|
$parser->PrintTrace();
|
||||||
}
|
}
|
||||||
@@ -111,8 +135,15 @@ class Smarty_Internal_Config_File_Compiler
|
|||||||
if ($mbEncoding) {
|
if ($mbEncoding) {
|
||||||
mb_internal_encoding($mbEncoding);
|
mb_internal_encoding($mbEncoding);
|
||||||
}
|
}
|
||||||
|
if ($this->smarty->debugging) {
|
||||||
|
Smarty_Internal_Debug::end_compile($this->template);
|
||||||
|
}
|
||||||
|
// template header code
|
||||||
|
$template_header = "<?php /* Smarty version " . Smarty::SMARTY_VERSION . ", created on " . strftime("%Y-%m-%d %H:%M:%S") . "\n";
|
||||||
|
$template_header .= " compiled from \"" . $this->template->source->filepath . "\" */ ?>\n";
|
||||||
|
|
||||||
$config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>';
|
$code = '<?php Smarty_Internal_Extension_Config::loadConfigVars($_smarty_tpl, ' . var_export($this->config_data, true) . '); ?>';
|
||||||
|
return $template_header . Smarty_Internal_Extension_CodeFrame::create($this->template, $code);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -129,13 +160,13 @@ class Smarty_Internal_Config_File_Compiler
|
|||||||
{
|
{
|
||||||
$this->lex = Smarty_Internal_Configfilelexer::instance();
|
$this->lex = Smarty_Internal_Configfilelexer::instance();
|
||||||
$this->parser = Smarty_Internal_Configfileparser::instance();
|
$this->parser = Smarty_Internal_Configfileparser::instance();
|
||||||
// get template source line which has error
|
// get config source line which has error
|
||||||
$line = $this->lex->line;
|
$line = $this->lex->line;
|
||||||
if (isset($args)) {
|
if (isset($args)) {
|
||||||
// $line--;
|
// $line--;
|
||||||
}
|
}
|
||||||
$match = preg_split("/\n/", $this->lex->data);
|
$match = preg_split("/\n/", $this->lex->data);
|
||||||
$error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line - 1]}' ";
|
$error_text = "Syntax error in config file '{$this->template->source->filepath}' on line {$line} '{$match[$line - 1]}' ";
|
||||||
if (isset($args)) {
|
if (isset($args)) {
|
||||||
// individual error message
|
// individual error message
|
||||||
$error_text .= $args;
|
$error_text .= $args;
|
||||||
|
@@ -292,9 +292,7 @@ class Smarty_Internal_Data
|
|||||||
public function configLoad($config_file, $sections = null)
|
public function configLoad($config_file, $sections = null)
|
||||||
{
|
{
|
||||||
// load Config class
|
// load Config class
|
||||||
$config = new Smarty_Internal_Config($config_file, $this->smarty, $this);
|
Smarty_Internal_Extension_Config::configLoad($this, $config_file, $sections);
|
||||||
$config->loadConfigVars($sections);
|
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,21 +345,32 @@ class Smarty_Internal_Data
|
|||||||
*/
|
*/
|
||||||
public function getConfigVariable($variable, $error_enable = true)
|
public function getConfigVariable($variable, $error_enable = true)
|
||||||
{
|
{
|
||||||
$_ptr = $this;
|
return Smarty_Internal_Extension_Config::getConfigVariable($this, $variable, $error_enable = true);
|
||||||
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 ($this->smarty->error_unassigned && $error_enable) {
|
|
||||||
// force a notice
|
|
||||||
$x = $$variable;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
public function getConfigVars($varname = null, $search_parents = true)
|
||||||
|
{
|
||||||
|
return Smarty_Internal_Extension_Config::getConfigVars($this, $varname, $search_parents);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deassigns a single or all config variables
|
||||||
|
*
|
||||||
|
* @param string $varname variable name or null
|
||||||
|
*
|
||||||
|
* @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
|
||||||
|
*/
|
||||||
|
public function clearConfig($varname = null)
|
||||||
|
{
|
||||||
|
return Smarty_Internal_Extension_Config::clearConfig($this, $varname);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -391,58 +400,6 @@ class Smarty_Internal_Data
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 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
|
|
||||||
*/
|
|
||||||
public function getConfigVars($varname = null, $search_parents = true)
|
|
||||||
{
|
|
||||||
$_ptr = $this;
|
|
||||||
$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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deassigns a single or all config variables
|
|
||||||
*
|
|
||||||
* @param string $varname variable name or null
|
|
||||||
*
|
|
||||||
* @return Smarty_Internal_Data current Smarty_Internal_Data (or Smarty or Smarty_Internal_Template) instance for chaining
|
|
||||||
*/
|
|
||||||
public function clearConfig($varname = null)
|
|
||||||
{
|
|
||||||
if (isset($varname)) {
|
|
||||||
unset($this->config_vars[$varname]);
|
|
||||||
} else {
|
|
||||||
$this->config_vars = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
159
libs/sysplugins/smarty_internal_extension_config.php
Normal file
159
libs/sysplugins/smarty_internal_extension_config.php
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage PluginsInternal
|
||||||
|
*/
|
||||||
|
class Smarty_Internal_Extension_Config
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param $obj
|
||||||
|
* @param $config_file
|
||||||
|
* @param null $sections
|
||||||
|
* @param string $scope
|
||||||
|
*/
|
||||||
|
static function configLoad($obj, $config_file, $sections = null, $scope = 'local')
|
||||||
|
{
|
||||||
|
$confObj = new $obj->smarty->template_class($config_file, $obj->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->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->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->smarty->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;
|
||||||
|
}
|
||||||
|
}
|
118
libs/sysplugins/smarty_template_config.php
Normal file
118
libs/sysplugins/smarty_template_config.php
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Smarty Config Source Plugin
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage TemplateResources
|
||||||
|
* @author Uwe Tews
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Smarty Connfig Resource Data Object
|
||||||
|
* Meta Data Container for Template Files
|
||||||
|
*
|
||||||
|
* @package Smarty
|
||||||
|
* @subpackage TemplateResources
|
||||||
|
* @author Uwe Tews
|
||||||
|
* @property integer $timestamp Source Timestamp
|
||||||
|
* @property boolean $exists Source Existence
|
||||||
|
* @property boolean $template Extended Template reference
|
||||||
|
* @property string $content Source Content
|
||||||
|
*/
|
||||||
|
class Smarty_Template_Config extends Smarty_Template_Source
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Name of the Class to compile this resource's contents with
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $compiler_class = 'Smarty_Internal_Config_File_Compiler';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the Class to tokenize this resource's contents with
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $template_lexer_class = 'Smarty_Internal_Configfilelexer';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Name of the Class to parse this resource's contents with
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $template_parser_class = 'Smarty_Internal_Configfileparser';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* array of section names, single section or null
|
||||||
|
*
|
||||||
|
* @var null|string|array
|
||||||
|
*/
|
||||||
|
public $config_sections = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scope into which the config variables shall be loaded
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $scope = 'local';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag that source is a config file
|
||||||
|
*
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $isConfig = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* create Source Object container
|
||||||
|
*
|
||||||
|
* @param Smarty_Resource $handler Resource Handler this source object communicates with
|
||||||
|
* @param Smarty $smarty Smarty instance this source object belongs to
|
||||||
|
* @param string $resource full template_resource
|
||||||
|
* @param string $type type of resource
|
||||||
|
* @param string $name resource name
|
||||||
|
*/
|
||||||
|
public function __construct(Smarty_Resource $handler, Smarty $smarty, $resource, $type, $name)
|
||||||
|
{
|
||||||
|
$this->handler = clone $handler; // Note: prone to circular references
|
||||||
|
$this->resource = $resource;
|
||||||
|
$this->type = $type;
|
||||||
|
$this->name = $name;
|
||||||
|
$this->smarty = $smarty;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* initialize Source Object for given resource
|
||||||
|
* Either [$_template] or [$smarty, $template_resource] must be specified
|
||||||
|
*
|
||||||
|
* @param Smarty_Internal_Template $_template template object
|
||||||
|
* @param Smarty $smarty smarty object
|
||||||
|
* @param string $template_resource resource identifier
|
||||||
|
*
|
||||||
|
* @return Smarty_Template_Source Source Object
|
||||||
|
* @throws SmartyException
|
||||||
|
*/
|
||||||
|
public static function load(Smarty_Internal_Template $_template = null, Smarty $smarty = null, $template_resource = null)
|
||||||
|
{
|
||||||
|
static $_incompatible_resources = array('extends' => true, 'php' => true);
|
||||||
|
$smarty = $_template->smarty;
|
||||||
|
$template_resource = $_template->template_resource;
|
||||||
|
if (empty($template_resource)) {
|
||||||
|
throw new SmartyException('Missing config name');
|
||||||
|
}
|
||||||
|
// parse resource_name, load resource handler
|
||||||
|
Smarty_Resource::parseResourceName($template_resource, $smarty->default_config_type, $name, $type);
|
||||||
|
// make sure configs are not loaded via anything smarty can't handle
|
||||||
|
if (isset($_incompatible_resources[$type])) {
|
||||||
|
throw new SmartyException ("Unable to use resource '{$type}' for config");
|
||||||
|
}
|
||||||
|
$resource = Smarty_Resource::load($smarty, $type);
|
||||||
|
$source = new Smarty_Template_Config($resource, $smarty, $template_resource, $type, $name);
|
||||||
|
$resource->populate($source, $_template);
|
||||||
|
if ((!isset($source->exists) || !$source->exists) && isset($_template->smarty->default_config_handler_func)) {
|
||||||
|
Smarty_Internal_Extension_DefaultTemplateHandler::_getDefault($_template, $source, $resource);
|
||||||
|
}
|
||||||
|
$source->unique_resource = $resource->buildUniqueResourceName($smarty, $name, true);
|
||||||
|
return $source;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user