aboutsummaryrefslogtreecommitdiffstats
path: root/library/Smarty/libs/Smarty.class.php
diff options
context:
space:
mode:
Diffstat (limited to 'library/Smarty/libs/Smarty.class.php')
-rw-r--r--library/Smarty/libs/Smarty.class.php865
1 files changed, 267 insertions, 598 deletions
diff --git a/library/Smarty/libs/Smarty.class.php b/library/Smarty/libs/Smarty.class.php
index 1f0f2634a..ac09d0a43 100644
--- a/library/Smarty/libs/Smarty.class.php
+++ b/library/Smarty/libs/Smarty.class.php
@@ -27,7 +27,7 @@
* @author Uwe Tews
* @author Rodney Rehm
* @package Smarty
- * @version 3.1.27
+ * @version 3.1.28-dev
*/
/**
@@ -79,7 +79,7 @@ if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) {
*/
if (!class_exists('Smarty_Autoloader', false)) {
if (!class_exists('Smarty_Internal_Data', true)) {
- require_once 'Autoloader.php';
+ require_once dirname(__FILE__) . '/Autoloader.php';
Smarty_Autoloader::registerBC();
}
}
@@ -87,20 +87,27 @@ if (!class_exists('Smarty_Autoloader', false)) {
/**
* Load always needed external class files
*/
-
if (!class_exists('Smarty_Internal_Data', false)) {
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php';
}
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_extension_handler.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php';
require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php';
+require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_resource_base.php';
/**
* This is the main Smarty class
*
* @package Smarty
+ *
+ * @method int clearAllCache(int $exp_time = null, string $type = null)
+ * @method int clearCache(string $template_name, string $cache_id = null, string $compile_id = null, int $exp_time = null, string $type = null)
+ * @method int compileAllTemplates(Smarty $smarty, string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, int $max_errors = null)
+ * @method int compileAllConfig(Smarty $smarty, string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, int $max_errors = null)
+ *
*/
class Smarty extends Smarty_Internal_TemplateBase
{
@@ -111,18 +118,24 @@ class Smarty extends Smarty_Internal_TemplateBase
/**
* smarty version
*/
- const SMARTY_VERSION = '3.1.27';
+ const SMARTY_VERSION = '3.1.28-dev/77';
/**
* define variable scopes
*/
const SCOPE_LOCAL = 0;
- const SCOPE_PARENT = 1;
+ const SCOPE_PARENT = 2;
+
+ const SCOPE_TPL_ROOT = 4;
+
+ const SCOPE_ROOT = 8;
+
+ const SCOPE_SMARTY = 16;
- const SCOPE_ROOT = 2;
+ const SCOPE_GLOBAL = 32;
- const SCOPE_GLOBAL = 3;
+ const SCOPE_BUBBLE_UP = 64;
/**
* define caching modes
@@ -134,7 +147,7 @@ class Smarty extends Smarty_Internal_TemplateBase
const CACHING_LIFETIME_SAVED = 2;
/**
- * define constant for clearing cache files be saved expiration datees
+ * define constant for clearing cache files be saved expiration dates
*/
const CLEAR_EXPIRED = - 1;
@@ -191,6 +204,17 @@ class Smarty extends Smarty_Internal_TemplateBase
const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler';
+ /**
+ * Resource caching modes
+ */
+ const RESOURCE_CACHE_OFF = 0;
+
+ const RESOURCE_CACHE_AUTOMATIC = 1; // cache template objects by rules
+
+ const RESOURCE_CACHE_TEMPLATE = 2; // cache all template objects
+
+ const RESOURCE_CACHE_ON = 4; // cache source and compiled resources
+
/**#@-*/
/**
@@ -199,14 +223,14 @@ class Smarty extends Smarty_Internal_TemplateBase
public static $global_tpl_vars = array();
/**
- * error handler returned by set_error_hanlder() in Smarty::muteExpectedErrors()
+ * error handler returned by set_error_handler() in Smarty::muteExpectedErrors()
*/
public static $_previous_error_handler = null;
/**
* contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors()
*/
- public static $_muted_directories = array('./templates_c/' => null, './cache/' => null);
+ public static $_muted_directories = array();
/**
* Flag denoting if Multibyte String functions are available
@@ -239,7 +263,7 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
/**
- * auto literal on delimiters with whitspace
+ * auto literal on delimiters with whitespace
*
* @var boolean
*/
@@ -253,7 +277,7 @@ class Smarty extends Smarty_Internal_TemplateBase
public $error_unassigned = false;
/**
- * look up relative filepaths in include_path
+ * look up relative file path in include_path
*
* @var boolean
*/
@@ -271,14 +295,14 @@ class Smarty extends Smarty_Internal_TemplateBase
*
* @var string
*/
- public $joined_template_dir = './templates/';
+ public $_joined_template_dir = null;
/**
* joined config directory string used in cache keys
*
* @var string
*/
- public $joined_config_dir = './configs/';
+ public $_joined_config_dir = null;
/**
* default template handler
@@ -365,13 +389,6 @@ class Smarty extends Smarty_Internal_TemplateBase
public $merge_compiled_includes = false;
/**
- * template inheritance merge compiled includes
- *
- * @var boolean
- */
- public $inheritance_merge_compiled_includes = true;
-
- /**
* force cache file creation
*
* @var boolean
@@ -425,16 +442,6 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public $allow_php_templates = false;
- /**
- * Should compiled-templates be prevented from being called directly?
- * {@internal
- * Currently used by Smarty_Internal_Template only.
- * }}
- *
- * @var boolean
- */
- public $direct_access_security = true;
-
/**#@-*/
/**
* debug mode
@@ -478,13 +485,6 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public $error_reporting = null;
- /**
- * Internal flag for getTags()
- *
- * @var boolean
- */
- public $get_used_tags = false;
-
/**#@+
* config var settings
*/
@@ -524,7 +524,7 @@ class Smarty extends Smarty_Internal_TemplateBase
public $compile_locking = true;
/**
- * Controls whether cache resources should emply locking mechanism
+ * Controls whether cache resources should use locking mechanism
*
* @var boolean
*/
@@ -556,13 +556,6 @@ class Smarty extends Smarty_Internal_TemplateBase
public $caching_type = 'file';
/**
- * internal config properties
- *
- * @var array
- */
- public $properties = array();
-
- /**
* config type
*
* @var string
@@ -570,32 +563,11 @@ class Smarty extends Smarty_Internal_TemplateBase
public $default_config_type = 'file';
/**
- * cached template objects
- *
- * @var array
- */
- public $source_objects = array();
-
- /**
- * cached template objects
- *
- * @var array
- */
- public $template_objects = array();
-
- /**
* enable resource caching
*
* @var bool
*/
- public $resource_caching = false;
-
- /**
- * enable template resource caching
- *
- * @var bool
- */
- public $template_resource_caching = true;
+ public $resource_cache_mode = 1;
/**
* check If-Modified-Since headers
@@ -612,13 +584,6 @@ class Smarty extends Smarty_Internal_TemplateBase
public $registered_plugins = array();
/**
- * plugin search order
- *
- * @var array
- */
- public $plugin_search_order = array('function', 'block', 'compiler', 'class');
-
- /**
* registered objects
*
* @var array
@@ -647,13 +612,6 @@ class Smarty extends Smarty_Internal_TemplateBase
public $registered_resources = array();
/**
- * resource handler cache
- *
- * @var array
- */
- public $_resource_handlers = array();
-
- /**
* registered cache resources
*
* @var array
@@ -661,13 +619,6 @@ class Smarty extends Smarty_Internal_TemplateBase
public $registered_cache_resources = array();
/**
- * cache resource handler cache
- *
- * @var array
- */
- public $_cacheresource_handlers = array();
-
- /**
* autoload filter
*
* @var array
@@ -689,13 +640,6 @@ class Smarty extends Smarty_Internal_TemplateBase
public $escape_html = false;
/**
- * global internal smarty vars
- *
- * @var array
- */
- public static $_smarty_vars = array();
-
- /**
* start time for execution time calculation
*
* @var int
@@ -703,46 +647,45 @@ class Smarty extends Smarty_Internal_TemplateBase
public $start_time = 0;
/**
- * default file permissions
- *
- * @var int
- */
- public $_file_perms = 0644;
-
- /**
- * default dir permissions
+ * required by the compiler for BC
*
- * @var int
+ * @var string
*/
- public $_dir_perms = 0771;
+ public $_current_file = null;
/**
- * block tag hierarchy
+ * internal flag to enable parser debugging
*
- * @var array
+ * @var bool
*/
- public $_tag_stack = array();
+ public $_parserdebug = false;
/**
- * required by the compiler for BC
+ * This object type (Smarty = 1, template = 2, data = 4)
*
- * @var string
+ * @var int
*/
- public $_current_file = null;
+ public $_objType = 1;
/**
- * internal flag to enable parser debugging
+ * Debug object
*
- * @var bool
+ * @var Smarty_Internal_Debug
*/
- public $_parserdebug = false;
+ public $_debug = null;
/**
- * Cache of is_file results of loadPlugin()
+ * removed properties
*
* @var array
*/
- public $_is_file_cache = array();
+ private static $obsoleteProperties = array('resource_caching', 'template_resource_caching',
+ 'direct_access_security', '_dir_perms', '_file_perms',
+ 'plugin_search_order', 'inheritance_merge_compiled_includes');
+
+ private static $accessMap = array('template_dir' => 'getTemplateDir', 'config_dir' => 'getConfigDir',
+ 'plugins_dir' => 'getPluginsDir', 'compile_dir' => 'getCompileDir',
+ 'cache_dir' => 'getCacheDir',);
/**#@-*/
@@ -751,30 +694,12 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function __construct()
{
+ parent::__construct();
if (is_callable('mb_internal_encoding')) {
mb_internal_encoding(Smarty::$_CHARSET);
}
$this->start_time = microtime(true);
- // check default dirs for overloading
- if ($this->template_dir[0] !== './templates/' || isset($this->template_dir[1])) {
- $this->setTemplateDir($this->template_dir);
- }
- if ($this->config_dir[0] !== './configs/' || isset($this->config_dir[1])) {
- $this->setConfigDir($this->config_dir);
- }
- if ($this->compile_dir !== './templates_c/') {
- unset(self::$_muted_directories['./templates_c/']);
- $this->setCompileDir($this->compile_dir);
- }
- if ($this->cache_dir !== './cache/') {
- unset(self::$_muted_directories['./cache/']);
- $this->setCacheDir($this->cache_dir);
- }
- if (isset($this->plugins_dir)) {
- $this->setPluginsDir($this->plugins_dir);
- } else {
- $this->setPluginsDir(SMARTY_PLUGINS_DIR);
- }
+
if (isset($_SERVER['SCRIPT_NAME'])) {
Smarty::$global_tpl_vars['SCRIPT_NAME'] = new Smarty_Variable($_SERVER['SCRIPT_NAME']);
}
@@ -789,52 +714,6 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
- * fetches a rendered Smarty template
- *
- * @param string $template the resource handle of the template file or template object
- * @param mixed $cache_id cache id to be used with this template
- * @param mixed $compile_id compile id to be used with this template
- * @param object $parent next higher level of Smarty variables
- * @param bool $display true: display, false: fetch
- * @param bool $merge_tpl_vars not used - left for BC
- * @param bool $no_output_filter not used - left for BC
- *
- * @throws Exception
- * @throws SmartyException
- * @return string rendered template output
- */
- public function fetch($template = null, $cache_id = null, $compile_id = null, $parent = null, $display = false, $merge_tpl_vars = true, $no_output_filter = false)
- {
- if ($cache_id !== null && is_object($cache_id)) {
- $parent = $cache_id;
- $cache_id = null;
- }
- if ($parent === null) {
- $parent = $this;
- }
- // get template object
- $_template = is_object($template) ? $template : $this->createTemplate($template, $cache_id, $compile_id, $parent, false);
- // set caching in template object
- $_template->caching = $this->caching;
- // fetch template content
- return $_template->render(true, false, $display);
- }
-
- /**
- * displays a Smarty template
- *
- * @param string $template the resource handle of the template file or template object
- * @param mixed $cache_id cache id to be used with this template
- * @param mixed $compile_id compile id to be used with this template
- * @param object $parent next higher level of Smarty variables
- */
- public function display($template = null, $cache_id = null, $compile_id = null, $parent = null)
- {
- // display template
- $this->fetch($template, $cache_id, $compile_id, $parent, true);
- }
-
- /**
* Check if a template resource exists
*
* @param string $resource_name template name
@@ -843,14 +722,9 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function templateExists($resource_name)
{
- // create template object
- $save = $this->template_objects;
- $tpl = new $this->template_class($resource_name, $this);
- // check if it does exists
- $result = $tpl->source->exists;
- $this->template_objects = $save;
-
- return $result;
+ // create source object
+ $source = Smarty_Template_Source::load(null, $this, $resource_name);
+ return $source->exists;
}
/**
@@ -879,43 +753,6 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
- * Empty cache folder
- *
- * @param integer $exp_time expiration time
- * @param string $type resource type
- *
- * @return integer number of cache files deleted
- */
- public function clearAllCache($exp_time = null, $type = null)
- {
- // load cache resource and call clearAll
- $_cache_resource = Smarty_CacheResource::load($this, $type);
- Smarty_CacheResource::invalidLoadedCache($this);
-
- return $_cache_resource->clearAll($this, $exp_time);
- }
-
- /**
- * Empty cache for a specific template
- *
- * @param string $template_name template name
- * @param string $cache_id cache id
- * @param string $compile_id compile id
- * @param integer $exp_time expiration time
- * @param string $type resource type
- *
- * @return integer number of cache files deleted
- */
- public function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null)
- {
- // load cache resource and call clear
- $_cache_resource = Smarty_CacheResource::load($this, $type);
- Smarty_CacheResource::invalidLoadedCache($this);
-
- return $_cache_resource->clear($this, $template_name, $cache_id, $compile_id, $exp_time);
- }
-
- /**
* Loads security class and enables security
*
* @param string|Smarty_Security $security_class if a string is used, it must be class-name
@@ -925,24 +762,7 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function enableSecurity($security_class = null)
{
- if ($security_class instanceof Smarty_Security) {
- $this->security_policy = $security_class;
-
- return $this;
- } elseif (is_object($security_class)) {
- throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security.");
- }
- if ($security_class == null) {
- $security_class = $this->security_class;
- }
- if (!class_exists($security_class)) {
- throw new SmartyException("Security class '$security_class' is not defined");
- } elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) {
- throw new SmartyException("Class '$security_class' must extend Smarty_Security.");
- } else {
- $this->security_policy = new $security_class($this);
- }
-
+ Smarty_Security::enableSecurity($this, $security_class);
return $this;
}
@@ -962,16 +782,18 @@ class Smarty extends Smarty_Internal_TemplateBase
* Set template directory
*
* @param string|array $template_dir directory(s) of template sources
+ * @param bool $isConfig true for config_dir
*
- * @return Smarty current Smarty instance for chaining
+ * @return \Smarty current Smarty instance for chaining
*/
- public function setTemplateDir($template_dir)
+ public function setTemplateDir($template_dir, $isConfig = false)
{
- $this->template_dir = array();
- foreach ((array) $template_dir as $k => $v) {
- $this->template_dir[$k] = rtrim($v, '/\\') . DS;
- }
- $this->joined_template_dir = join(' # ', $this->template_dir);
+ $type = $isConfig ? 'config_dir' : 'template_dir';
+ $joined = '_joined_' . $type;
+ $this->{$type} = (array) $template_dir;
+ $this->{$joined} = join(' # ', $this->{$type});
+ $this->_cache[$type . '_new'] = true;
+ $this->_cache[$type] = false;
return $this;
}
@@ -980,30 +802,53 @@ class Smarty extends Smarty_Internal_TemplateBase
*
* @param string|array $template_dir directory(s) of template sources
* @param string $key of the array element to assign the template dir to
+ * @param bool $isConfig true for config_dir
*
* @return Smarty current Smarty instance for chaining
- * @throws SmartyException when the given template directory is not valid
*/
- public function addTemplateDir($template_dir, $key = null)
+ public function addTemplateDir($template_dir, $key = null, $isConfig = false)
{
- $this->_addDir('template_dir', $template_dir, $key);
- $this->joined_template_dir = join(' # ', $this->template_dir);
+ $type = $isConfig ? 'config_dir' : 'template_dir';
+ $joined = '_joined_' . $type;
+ if (!isset($this->_cache[$type])) {
+ $this->{$type} = (array) $this->{$type};
+ $this->{$joined} = join(' # ', $this->{$type});
+ $this->_cache[$type . '_new'] = true;
+ $this->_cache[$type] = false;
+ }
+ $this->{$joined} .= ' # ' . join(' # ', (array) $template_dir);
+ $this->_addDir($type, $template_dir, $key);
return $this;
}
/**
* Get template directories
*
- * @param mixed $index index of directory to get, null to get all
+ * @param mixed $index index of directory to get, null to get all
+ * @param bool $isConfig true for config_dir
*
- * @return array|string list of template directories, or directory of $index
+ * @return array list of template directories, or directory of $index
*/
- public function getTemplateDir($index = null)
+ public function getTemplateDir($index = null, $isConfig = false)
{
+ $type = $isConfig ? 'config_dir' : 'template_dir';
+ if (!isset($this->_cache[$type])) {
+ $joined = '_joined_' . $type;
+ $this->{$type} = (array) $this->{$type};
+ $this->{$joined} = join(' # ', $this->{$type});
+ $this->_cache[$type] = false;
+ }
+ if ($this->_cache[$type] == false) {
+ foreach ($this->{$type} as $k => $v) {
+ $this->{$type}[$k] = $this->_realpath($v . DS, true);
+ }
+ $this->_cache[$type . '_new'] = true;
+ $this->_cache[$type] = true;
+ }
if ($index !== null) {
- return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null;
+ return isset($this->{$type}[$index]) ? $this->{$type}[$index] : null;
}
- return (array) $this->template_dir;
+ return $this->{$type};
}
/**
@@ -1015,12 +860,7 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function setConfigDir($config_dir)
{
- $this->config_dir = array();
- foreach ((array) $config_dir as $k => $v) {
- $this->config_dir[$k] = rtrim($v, '/\\') . DS;
- }
- $this->joined_config_dir = join(' # ', $this->config_dir);
- return $this;
+ return $this->setTemplateDir($config_dir, true);
}
/**
@@ -1033,9 +873,7 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function addConfigDir($config_dir, $key = null)
{
- $this->_addDir('config_dir', $config_dir, $key);
- $this->joined_config_dir = join(' # ', $this->config_dir);
- return $this;
+ return $this->addTemplateDir($config_dir, $key, true);
}
/**
@@ -1043,14 +881,11 @@ class Smarty extends Smarty_Internal_TemplateBase
*
* @param mixed $index index of directory to get, null to get all
*
- * @return array|string configuration directory
+ * @return array configuration directory
*/
public function getConfigDir($index = null)
{
- if ($index !== null) {
- return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null;
- }
- return (array) $this->config_dir;
+ return $this->getTemplateDir($index, true);
}
/**
@@ -1062,8 +897,10 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function setPluginsDir($plugins_dir)
{
- $this->plugins_dir = array();
- $this->addPluginsDir($plugins_dir);
+ $this->plugins_dir = (array) $plugins_dir;
+ if (isset($this->_cache['plugins_dir'])) {
+ unset($this->_cache['plugins_dir']);
+ }
return $this;
}
@@ -1076,13 +913,13 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function addPluginsDir($plugins_dir)
{
- // make sure we're dealing with an array
- $this->plugins_dir = (array) $this->plugins_dir;
- foreach ((array) $plugins_dir as $v) {
- $this->plugins_dir[] = rtrim($v, '/\\') . DS;
+ if (!isset($this->plugins_dir)) {
+ $this->plugins_dir = array(SMARTY_PLUGINS_DIR);
+ }
+ $this->plugins_dir = array_merge((array) $this->plugins_dir, (array) $plugins_dir);
+ if (isset($this->_cache['plugins_dir'])) {
+ unset($this->_cache['plugins_dir']);
}
- $this->plugins_dir = array_unique($this->plugins_dir);
- $this->_is_file_cache = array();
return $this;
}
@@ -1093,7 +930,21 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function getPluginsDir()
{
- return (array) $this->plugins_dir;
+ if (!isset($this->_cache['plugins_dir'])) {
+ if (!isset($this->plugins_dir)) {
+ $this->plugins_dir = array(SMARTY_PLUGINS_DIR);
+ } else {
+ $plugins_dir = (array) $this->plugins_dir;
+ $this->plugins_dir = array();
+ foreach ($plugins_dir as $v) {
+ $this->plugins_dir[] = $this->_realpath($v . DS, true);
+ }
+ $this->plugins_dir = array_unique($this->plugins_dir);
+ }
+ $this->_cache['plugin_files'] = array();
+ $this->_cache['plugins_dir'] = true;
+ }
+ return $this->plugins_dir;
}
/**
@@ -1105,11 +956,11 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function setCompileDir($compile_dir)
{
- $this->compile_dir = rtrim($compile_dir, '/\\') . DS;
+ $this->compile_dir = $this->_realpath($compile_dir . DS, true);
if (!isset(Smarty::$_muted_directories[$this->compile_dir])) {
Smarty::$_muted_directories[$this->compile_dir] = null;
}
-
+ $this->_cache['compile_dir'] = true;
return $this;
}
@@ -1120,6 +971,13 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function getCompileDir()
{
+ if (!isset($this->_cache['compile_dir'])) {
+ $this->compile_dir = $this->_realpath($this->compile_dir . DS, true);
+ if (!isset(Smarty::$_muted_directories[$this->compile_dir])) {
+ Smarty::$_muted_directories[$this->compile_dir] = null;
+ }
+ $this->_cache['compile_dir'] = true;
+ }
return $this->compile_dir;
}
@@ -1132,10 +990,11 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function setCacheDir($cache_dir)
{
- $this->cache_dir = rtrim($cache_dir, '/\\') . DS;
+ $this->cache_dir = $this->_realpath($cache_dir . DS, true);
if (!isset(Smarty::$_muted_directories[$this->cache_dir])) {
Smarty::$_muted_directories[$this->cache_dir] = null;
}
+ $this->_cache['cache_dir'] = true;
return $this;
}
@@ -1146,6 +1005,13 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function getCacheDir()
{
+ if (!isset($this->_cache['cache_dir'])) {
+ $this->cache_dir = $this->_realpath($this->cache_dir . DS, true);
+ if (!isset(Smarty::$_muted_directories[$this->cache_dir])) {
+ Smarty::$_muted_directories[$this->cache_dir] = null;
+ }
+ $this->_cache['cache_dir'] = true;
+ }
return $this->cache_dir;
}
@@ -1158,165 +1024,28 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
private function _addDir($dirName, $dir, $key = null)
{
- // make sure we're dealing with an array
- $this->$dirName = (array) $this->$dirName;
-
+ $rp = $this->_cache[$dirName];
if (is_array($dir)) {
foreach ($dir as $k => $v) {
+ $path = $rp ? $this->_realpath($v . DS, true) : $v;
if (is_int($k)) {
// indexes are not merged but appended
- $this->{$dirName}[] = rtrim($v, '/\\') . DS;
+ $this->{$dirName}[] = $path;
} else {
// string indexes are overridden
- $this->{$dirName}[$k] = rtrim($v, '/\\') . DS;
+ $this->{$dirName}[$k] = $path;
}
}
} else {
+ $path = $rp ? $this->_realpath($dir . DS, true) : $dir;
if ($key !== null) {
// override directory at specified index
- $this->{$dirName}[$key] = rtrim($dir, '/\\') . DS;
+ $this->{$dirName}[$key] = $path;
} else {
// append new directory
- $this->{$dirName}[] = rtrim($dir, '/\\') . DS;
- }
- }
- }
-
- /**
- * Set default modifiers
- *
- * @param array|string $modifiers modifier or list of modifiers to set
- *
- * @return Smarty current Smarty instance for chaining
- */
- public function setDefaultModifiers($modifiers)
- {
- $this->default_modifiers = (array) $modifiers;
-
- return $this;
- }
-
- /**
- * Add default modifiers
- *
- * @param array|string $modifiers modifier or list of modifiers to add
- *
- * @return Smarty current Smarty instance for chaining
- */
- public function addDefaultModifiers($modifiers)
- {
- if (is_array($modifiers)) {
- $this->default_modifiers = array_merge($this->default_modifiers, $modifiers);
- } else {
- $this->default_modifiers[] = $modifiers;
- }
-
- return $this;
- }
-
- /**
- * Get default modifiers
- *
- * @return array list of default modifiers
- */
- public function getDefaultModifiers()
- {
- return $this->default_modifiers;
- }
-
- /**
- * Set autoload filters
- *
- * @param array $filters filters to load automatically
- * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters'
- * keys as the appropriate types
- *
- * @return Smarty current Smarty instance for chaining
- */
- public function setAutoloadFilters($filters, $type = null)
- {
- if ($type !== null) {
- $this->autoload_filters[$type] = (array) $filters;
- } else {
- $this->autoload_filters = (array) $filters;
- }
-
- return $this;
- }
-
- /**
- * Add autoload filters
- *
- * @param array $filters filters to load automatically
- * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters'
- * keys as the appropriate types
- *
- * @return Smarty current Smarty instance for chaining
- */
- public function addAutoloadFilters($filters, $type = null)
- {
- if ($type !== null) {
- if (!empty($this->autoload_filters[$type])) {
- $this->autoload_filters[$type] = array_merge($this->autoload_filters[$type], (array) $filters);
- } else {
- $this->autoload_filters[$type] = (array) $filters;
- }
- } else {
- foreach ((array) $filters as $key => $value) {
- if (!empty($this->autoload_filters[$key])) {
- $this->autoload_filters[$key] = array_merge($this->autoload_filters[$key], (array) $value);
- } else {
- $this->autoload_filters[$key] = (array) $value;
- }
+ $this->{$dirName}[] = $path;
}
}
-
- return $this;
- }
-
- /**
- * Get autoload filters
- *
- * @param string $type type of filter to get autoloads for. Defaults to all autoload filters
- *
- * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type
- * was specified
- */
- public function getAutoloadFilters($type = null)
- {
- if ($type !== null) {
- return isset($this->autoload_filters[$type]) ? $this->autoload_filters[$type] : array();
- }
-
- return $this->autoload_filters;
- }
-
- /**
- * return name of debugging template
- *
- * @return string
- */
- public function getDebugTemplate()
- {
- return $this->debug_tpl;
- }
-
- /**
- * set the debug template
- *
- * @param string $tpl_name
- *
- * @return Smarty current Smarty instance for chaining
- * @throws SmartyException if file is not readable
- */
- public function setDebugTemplate($tpl_name)
- {
- if (!is_readable($tpl_name)) {
- throw new SmartyException("Unknown file '{$tpl_name}'");
- }
- $this->debug_tpl = $tpl_name;
-
- return $this;
}
/**
@@ -1342,23 +1071,21 @@ class Smarty extends Smarty_Internal_TemplateBase
} else {
$data = null;
}
- $_templateId = $this->getTemplateId($template, $cache_id, $compile_id);
- if (isset($this->template_objects[$_templateId])) {
- if ($do_clone) {
- $tpl = clone $this->template_objects[$_templateId];
- $tpl->smarty = clone $tpl->smarty;
- } else {
- $tpl = $this->template_objects[$_templateId];
- }
+ if ($this->caching &&
+ isset($this->_cache['isCached'][$_templateId = $this->_getTemplateId($template, $cache_id, $compile_id)])
+ ) {
+ $tpl = $do_clone ? clone $this->_cache['isCached'][$_templateId] : $this->_cache['isCached'][$_templateId];
$tpl->parent = $parent;
$tpl->tpl_vars = array();
$tpl->config_vars = array();
} else {
- $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id);
- if ($do_clone) {
- $tpl->smarty = clone $tpl->smarty;
- }
- $tpl->templateId = $_templateId;
+ /* @var Smarty_Internal_Template $tpl */
+ $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id, null, null);
+ }
+ if ($do_clone) {
+ $tpl->smarty = clone $tpl->smarty;
+ } elseif ($parent === null) {
+ $tpl->parent = $this;
}
// fill data if present
if (!empty($data) && is_array($data)) {
@@ -1368,7 +1095,7 @@ class Smarty extends Smarty_Internal_TemplateBase
}
}
if ($this->debugging) {
- Smarty_Internal_Debug::register_template($tpl);
+ $tpl->smarty->_debug = new Smarty_Internal_Debug();
}
return $tpl;
}
@@ -1386,126 +1113,72 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function loadPlugin($plugin_name, $check = true)
{
- // if function or class exists, exit silently (already loaded)
- if ($check && (is_callable($plugin_name) || class_exists($plugin_name, false))) {
- return true;
- }
- // Plugin name is expected to be: Smarty_[Type]_[Name]
- $_name_parts = explode('_', $plugin_name, 3);
- // class name must have three parts to be valid plugin
- // count($_name_parts) < 3 === !isset($_name_parts[2])
- if (!isset($_name_parts[2]) || strtolower($_name_parts[0]) !== 'smarty') {
- throw new SmartyException("plugin {$plugin_name} is not a valid name format");
- }
- // if type is "internal", get plugin from sysplugins
- if (strtolower($_name_parts[1]) == 'internal') {
- $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php';
- if (isset($this->_is_file_cache[$file]) ? $this->_is_file_cache[$file] : $this->_is_file_cache[$file] = is_file($file)) {
- require_once($file);
- return $file;
- } else {
- return false;
- }
- }
- // plugin filename is expected to be: [type].[name].php
- $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php";
-
- $_stream_resolve_include_path = function_exists('stream_resolve_include_path');
-
- // loop through plugin dirs and find the plugin
- foreach ($this->getPluginsDir() as $_plugin_dir) {
- $names = array($_plugin_dir . $_plugin_filename, $_plugin_dir . strtolower($_plugin_filename),);
- foreach ($names as $file) {
- if (isset($this->_is_file_cache[$file]) ? $this->_is_file_cache[$file] : $this->_is_file_cache[$file] = is_file($file)) {
- require_once($file);
- return $file;
- }
- if ($this->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) {
- // try PHP include_path
- if ($_stream_resolve_include_path) {
- $file = stream_resolve_include_path($file);
- } else {
- $file = Smarty_Internal_Get_Include_Path::getIncludePath($file);
- }
-
- if ($file !== false) {
- require_once($file);
-
- return $file;
- }
- }
- }
- }
- // no plugin loaded
- return false;
+ return $this->ext->loadPlugin->loadPlugin($this, $plugin_name, $check);
}
/**
- * Compile all template files
+ * Get unique template id
*
- * @param string $extension file extension
- * @param bool $force_compile force all to recompile
- * @param int $time_limit
- * @param int $max_errors
+ * @param string $template_name
+ * @param null|mixed $cache_id
+ * @param null|mixed $compile_id
+ * @param null $caching
*
- * @return integer number of template files recompiled
- */
- public function compileAllTemplates($extension = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null)
- {
- return Smarty_Internal_Utility::compileAllTemplates($extension, $force_compile, $time_limit, $max_errors, $this);
- }
-
- /**
- * Compile all config files
- *
- * @param string $extension file extension
- * @param bool $force_compile force all to recompile
- * @param int $time_limit
- * @param int $max_errors
- *
- * @return integer number of template files recompiled
+ * @return string
*/
- public function compileAllConfig($extension = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null)
+ public function _getTemplateId($template_name, $cache_id = null, $compile_id = null, $caching = null)
{
- return Smarty_Internal_Utility::compileAllConfig($extension, $force_compile, $time_limit, $max_errors, $this);
- }
+ $cache_id = $cache_id === null ? $this->cache_id : $cache_id;
+ $compile_id = $compile_id === null ? $this->compile_id : $compile_id;
+ $caching = (int) ($caching === null ? $this->caching : $caching);
- /**
- * Delete compiled template file
- *
- * @param string $resource_name template name
- * @param string $compile_id compile id
- * @param integer $exp_time expiration time
- *
- * @return integer number of template files deleted
- */
- public function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null)
- {
- return Smarty_Internal_Utility::clearCompiledTemplate($resource_name, $compile_id, $exp_time, $this);
+ if ($this->allow_ambiguous_resources) {
+ $_templateId =
+ Smarty_Resource::getUniqueTemplateName($this, $template_name) . "#{$cache_id}#{$compile_id}#{$caching}";
+ } else {
+ $_templateId = $this->_joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}#{$caching}";
+ }
+ if (isset($_templateId[150])) {
+ $_templateId = sha1($_templateId);
+ }
+ return $_templateId;
}
/**
- * Return array of tag/attributes of all tags used by an template
+ * Normalize path
+ * - remove /./ and /../
+ * - make it absolute if required
*
- * @param Smarty_Internal_Template $template
+ * @param string $path file path
+ * @param bool $realpath leave $path relative
*
- * @return array of tag/attributes
+ * @return string
*/
- public function getTags(Smarty_Internal_Template $template)
+ public function _realpath($path, $realpath = null)
{
- return Smarty_Internal_Utility::getTags($template);
- }
+ static $pattern = null;
+ static $nds = null;
+ if ($pattern == null) {
+ $nds = DS == '/' ? '\\' : '/';
+ $ds = '\\' . DS;
+ $pattern =
+ "#([{$ds}]+[^{$ds}]+[{$ds}]+[.]([{$ds}]+[.])*[.][{$ds}]+([.][{$ds}]+)*)|([{$ds}]+([.][{$ds}]+)+)|[{$ds}]{2,}#";
+ }
+ // normalize DS
+ if (strpos($path, $nds) !== false) {
+ $path = str_replace($nds, DS, $path);
+ }
- /**
- * Run installation test
- *
- * @param array $errors Array to write errors into, rather than outputting them
- *
- * @return boolean true if setup is fine, false if something is wrong
- */
- public function testInstall(&$errors = null)
- {
- return Smarty_Internal_TestInstall::testInstall($this, $errors);
+ if ($realpath === true && $path[0] !== '/' && $path[1] !== ':') {
+ $path = getcwd() . DS . $path;
+ }
+ while ((strpos($path, '.' . DS) !== false) || (strpos($path, DS . DS) !== false)) {
+ $path = preg_replace($pattern, DS, $path);
+ }
+ if ($realpath === false && ($path[0] == '/' || $path[1] == ':')) {
+ $path = str_ireplace(getcwd(), '.', $path);
+ }
+ return $path;
}
/**
@@ -1525,38 +1198,6 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
- * @param boolean $caching
- */
- public function setCaching($caching)
- {
- $this->caching = $caching;
- }
-
- /**
- * @param int $cache_lifetime
- */
- public function setCacheLifetime($cache_lifetime)
- {
- $this->cache_lifetime = $cache_lifetime;
- }
-
- /**
- * @param string $compile_id
- */
- public function setCompileId($compile_id)
- {
- $this->compile_id = $compile_id;
- }
-
- /**
- * @param string $cache_id
- */
- public function setCacheId($cache_id)
- {
- $this->cache_id = $cache_id;
- }
-
- /**
* @param int $error_reporting
*/
public function setErrorReporting($error_reporting)
@@ -1653,11 +1294,37 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
+ * @param string $default_resource_type
+ */
+ public function setDefaultResourceType($default_resource_type)
+ {
+ $this->default_resource_type = $default_resource_type;
+ }
+
+ /**
+ * @param string $caching_type
+ */
+ public function setCachingType($caching_type)
+ {
+ $this->caching_type = $caching_type;
+ }
+
+ /**
+ * Test install
+ *
+ * @param null $errors
+ */
+ public function testInstall(&$errors = null)
+ {
+ Smarty_Internal_TestInstall::testInstall($this, $errors);
+ }
+
+ /**
* Class destructor
*/
public function __destruct()
{
- // intentionally left blank
+ $i = 0;// intentionally left blank
}
/**
@@ -1671,12 +1338,11 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function __get($name)
{
- $allowed = array('template_dir' => 'getTemplateDir', 'config_dir' => 'getConfigDir',
- 'plugins_dir' => 'getPluginsDir', 'compile_dir' => 'getCompileDir',
- 'cache_dir' => 'getCacheDir',);
- if (isset($allowed[$name])) {
- return $this->{$allowed[$name]}();
+ if (isset(self::$accessMap[$name])) {
+ return $this->{self::$accessMap[$name]}();
+ } elseif (in_array($name, self::$obsoleteProperties)) {
+ return null;
} else {
trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
}
@@ -1692,14 +1358,16 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function __set($name, $value)
{
- $allowed = array('template_dir' => 'setTemplateDir', 'config_dir' => 'setConfigDir',
- 'plugins_dir' => 'setPluginsDir', 'compile_dir' => 'setCompileDir',
- 'cache_dir' => 'setCacheDir',);
-
- if (isset($allowed[$name])) {
- $this->{$allowed[$name]}($value);
+ if (isset(self::$accessMap[$name])) {
+ $this->{self::$accessMap[$name]}($value);
+ } elseif (in_array($name, self::$obsoleteProperties)) {
+ return;
} else {
- trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+ if (is_object($value) && method_exists($value, $name)) {
+ $this->$name = $value;
+ } else {
+ trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE);
+ }
}
}
@@ -1724,8 +1392,8 @@ class Smarty extends Smarty_Internal_TemplateBase
if (!isset(Smarty::$_muted_directories[SMARTY_DIR])) {
$smarty_dir = realpath(SMARTY_DIR);
if ($smarty_dir !== false) {
- Smarty::$_muted_directories[SMARTY_DIR] = array('file' => $smarty_dir,
- 'length' => strlen($smarty_dir),);
+ Smarty::$_muted_directories[SMARTY_DIR] =
+ array('file' => $smarty_dir, 'length' => strlen($smarty_dir),);
}
}
@@ -1751,7 +1419,8 @@ class Smarty extends Smarty_Internal_TemplateBase
// or the error was within smarty but masked to be ignored
if (!$_is_muted_directory || ($errno && $errno & error_reporting())) {
if (Smarty::$_previous_error_handler) {
- return call_user_func(Smarty::$_previous_error_handler, $errno, $errstr, $errfile, $errline, $errcontext);
+ return call_user_func(Smarty::$_previous_error_handler, $errno, $errstr, $errfile, $errline,
+ $errcontext);
} else {
return false;
}