From 50a8f805dd9a3c327b6cb78ca6d6476802934272 Mon Sep 17 00:00:00 2001 From: "uwe.tews@googlemail.com" Date: Fri, 23 Sep 2011 20:21:16 +0000 Subject: [PATCH] - remove unused properties - optimization use real function instead anonymous function for preg_replace_callback - bugfix a relative {include} in child template blocks failed - bugfix direct setting of $template_dir, $config_dir, $plugins_dir in __construct() of an extended Smarty class created problems --- change_log.txt | 7 ++++ libs/Smarty.class.php | 34 +++++++++---------- .../smarty_internal_compile_block.php | 1 + libs/sysplugins/smarty_internal_template.php | 18 +++------- .../smarty_internal_templatebase.php | 17 +++++++--- libs/sysplugins/smarty_resource.php | 6 ++-- 6 files changed, 45 insertions(+), 38 deletions(-) diff --git a/change_log.txt b/change_log.txt index 6fd3ffa2..4e745526 100644 --- a/change_log.txt +++ b/change_log.txt @@ -1,4 +1,11 @@ ===== trunk ===== +23.09.2011 +- remove unused properties +- optimization use real function instead anonymous function for preg_replace_callback +- bugfix a relative {include} in child template blocks failed +- bugfix direct setting of $template_dir, $config_dir, $plugins_dir in __construct() of an + extended Smarty class created problems + ===== Smarty 3.1.1 ===== 22.09.2011 - bugfix {foreachelse} does fail if {section} was nested inside {foreach} diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php index d415889c..54a92277 100644 --- a/libs/Smarty.class.php +++ b/libs/Smarty.class.php @@ -821,7 +821,7 @@ class Smarty extends Smarty_Internal_TemplateBase { return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null; } - return $this->template_dir; + return (array)$this->template_dir; } /** @@ -885,7 +885,7 @@ class Smarty extends Smarty_Internal_TemplateBase { return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null; } - return $this->config_dir; + return (array)$this->config_dir; } /** @@ -942,7 +942,7 @@ class Smarty extends Smarty_Internal_TemplateBase { */ public function getPluginsDir() { - return $this->plugins_dir; + return (array)$this->plugins_dir; } /** @@ -1293,7 +1293,7 @@ class Smarty extends Smarty_Internal_TemplateBase { { return Smarty_Internal_Utility::testInstall($this, $errors); } - + /** * Error Handler to mute expected messages * @@ -1306,7 +1306,7 @@ class Smarty extends Smarty_Internal_TemplateBase { // return false if $errno is not 0 and included in current error level return (bool)($errno && $errno & error_reporting()); } - + /** * Enable error handler to mute expected messages * @@ -1315,26 +1315,26 @@ class Smarty extends Smarty_Internal_TemplateBase { public static function muteExpectedErrors() { /* - error muting is done because some people implemented custom error_handlers using + error muting is done because some people implemented custom error_handlers using http://php.net/set_error_handler and for some reason did not understand the following paragraph: - - It is important to remember that the standard PHP error handler is completely bypassed for the - error types specified by error_types unless the callback function returns FALSE. - error_reporting() settings will have no effect and your error handler will be called regardless - - however you are still able to read the current value of error_reporting and act appropriately. - Of particular note is that this value will be 0 if the statement that caused the error was - prepended by the @ error-control operator. - + + It is important to remember that the standard PHP error handler is completely bypassed for the + error types specified by error_types unless the callback function returns FALSE. + error_reporting() settings will have no effect and your error handler will be called regardless - + however you are still able to read the current value of error_reporting and act appropriately. + Of particular note is that this value will be 0 if the statement that caused the error was + prepended by the @ error-control operator. + Smarty deliberately uses @filemtime() over file_exists() and filemtime() in some places. Reasons include - @filemtime() is almost twice as fast as using an additional file_exists() - - between file_exists() and filemtime() a possible race condition is opened, + - between file_exists() and filemtime() a possible race condition is opened, which does not exist using the simple @filemtime() approach. */ if (self::$error_muting) { set_error_handler(array('Smarty', 'mutingErrorHandler')); } } - + /** * Disable error handler muting expected messages * @@ -1380,7 +1380,7 @@ function smartyAutoload($class) 'smarty_resource_uncompiled' => true, 'smarty_resource_recompiled' => true, ); - + if (!strncmp($_class, 'smarty_internal_', 16) || isset($_classes[$_class])) { include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; } diff --git a/libs/sysplugins/smarty_internal_compile_block.php b/libs/sysplugins/smarty_internal_compile_block.php index cfe00d1c..3a9f91b6 100644 --- a/libs/sysplugins/smarty_internal_compile_block.php +++ b/libs/sysplugins/smarty_internal_compile_block.php @@ -152,6 +152,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase { $_tpl->variable_filters = $compiler->template->variable_filters; $_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash']; $_tpl->source->filepath = $compiler->template->block_data[$_name]['file']; + $_tpl->allow_relative_path = true; if ($compiler->nocache) { $_tpl->compiler->forceNocache = 2; } else { diff --git a/libs/sysplugins/smarty_internal_template.php b/libs/sysplugins/smarty_internal_template.php index 9050adfb..3a667db8 100644 --- a/libs/sysplugins/smarty_internal_template.php +++ b/libs/sysplugins/smarty_internal_template.php @@ -41,19 +41,6 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase { * @var integer */ public $cache_lifetime = null; - /** - * Class name - * @var string - */ - public $cacher_class = null; - /** - * caching type - * - * Must be an element of $cache_resource_types. - * - * @var string - */ - public $caching_type = null; /** * Template resource * @var string @@ -101,6 +88,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase { * @var array */ public $used_tags = array(); + /** + * internal flag to allow relative path in child template blocks + * @var bool + */ + public $allow_relative_path = false; /** * Create template data object diff --git a/libs/sysplugins/smarty_internal_templatebase.php b/libs/sysplugins/smarty_internal_templatebase.php index b7dcdf28..757fb543 100644 --- a/libs/sysplugins/smarty_internal_templatebase.php +++ b/libs/sysplugins/smarty_internal_templatebase.php @@ -653,6 +653,16 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data { return false; } + /** + * preg_replace callback to convert camelcase getter/setter to underscore property names + * + * @param string $match match string + * @return string replacemant + */ + private function replaceCamelcase($match) { + return "_" . strtolower($match[1]); + } + /** * Handle unknown class methods * @@ -661,13 +671,10 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data { */ public function __call($name, $args) { - static $camel_func; // methode of Smarty object? if (method_exists($this->smarty, $name)) { return call_user_func_array(array($this->smarty, $name), $args); } - if (!isset($camel_func)) - $camel_func = create_function('$c', 'return "_" . strtolower($c[1]);'); // see if this is a set/get for a property $first3 = strtolower(substr($name, 0, 3)); if (in_array($first3, array('set', 'get')) && substr($name, 3, 1) !== '_') { @@ -675,7 +682,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data { // lcfirst() not available < PHP 5.3.0, so improvise $property_name = strtolower(substr($name, 3, 1)) . substr($name, 4); // convert camel case to underscored name - $property_name = preg_replace_callback('/([A-Z])/', $camel_func, $property_name); + $property_name = preg_replace_callback('/([A-Z])/', array($this,'replaceCamelcase'), $property_name); if (property_exists($this, $property_name)) { if ($first3 == 'get') return $this->$property_name; @@ -692,7 +699,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data { } } // must be unknown - throw new SmartyException("Call of unknown function '$name'."); + throw new SmartyException("Call of unknown method '$name'."); } } diff --git a/libs/sysplugins/smarty_resource.php b/libs/sysplugins/smarty_resource.php index cf621491..d0523621 100644 --- a/libs/sysplugins/smarty_resource.php +++ b/libs/sysplugins/smarty_resource.php @@ -154,7 +154,7 @@ abstract class Smarty_Resource { // go relative to a given template? $_file_is_dotted = $file[0] == '.' && ($file[1] == '.' || $file[1] == '/' || $file[1] == "\\"); if ($_template && $_template->parent instanceof Smarty_Internal_Template && $_file_is_dotted) { - if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends') { + if ($_template->parent->source->type != 'file' && $_template->parent->source->type != 'extends' && !$_template->parent->allow_relative_path) { throw new SmartyException("Template '{$file}' cannot be relative to template of resource type '{$_template->parent->source->type}'"); } $file = dirname($_template->parent->source->filepath) . DS . $file; @@ -164,7 +164,7 @@ abstract class Smarty_Resource { // as expansions (like include_path) have already been done $file = getcwd() . DS . $file; } - } + } // resolve relative path if (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $file)) { @@ -422,7 +422,7 @@ abstract class Smarty_Resource { $resource_name = $template_resource; } } - + $resource = Smarty_Resource::load($smarty, $resource_type); $source = new Smarty_Template_Source($resource, $smarty, $template_resource, $resource_type, $resource_name); $resource->populate($source, $_template);