From: hickert Date: Tue, 25 Oct 2011 13:00:11 +0000 (+0000) Subject: Added smarty addons X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=52712da2ef5a66e177bf72c7c83005448f55121d;p=gosa.git Added smarty addons git-svn-id: https://oss.gonicus.de/repositories/gosa/trunk@21028 594d385d-05f5-0310-b6e9-bd551577e9d8 --- diff --git a/gosa-core/include/php_setup.inc b/gosa-core/include/php_setup.inc index 29e018a3e..820c6da89 100644 --- a/gosa-core/include/php_setup.inc +++ b/gosa-core/include/php_setup.inc @@ -308,17 +308,17 @@ if(defined('SMARTY_PHP_REMOVE')){ } // Register GOsa contributed smarty plugins -#$d = opendir("$BASE_DIR/include/smartyAddons"); -#while($file = readdir($d)){ -# if(preg_match("/\.php$/", $file)) require_once("$BASE_DIR/include/smartyAddons/{$file}"); -#} +$d = opendir("$BASE_DIR/include/smartyAddons"); +while($file = readdir($d)){ + if(preg_match("/\.php$/", $file)) require_once("$BASE_DIR/include/smartyAddons/{$file}"); +} #$smarty->registerPlugin("block", "tr", "smarty_block_tr"); -#$smarty->registerPlugin("block", "t", "smarty_block_t"); -#$smarty->registerPlugin("block", "render", "smarty_block_render"); -#$smarty->registerPlugin("function", "msgPool", "smarty_function_msgPool"); -#$smarty->registerPlugin("function", "image", "smarty_function_image"); -#$smarty->registerPlugin("function", "factory", "smarty_function_factory"); +$smarty->registerPlugin("block", "t", "smarty_block_t"); +$smarty->registerPlugin("block", "render", "smarty_block_render"); +$smarty->registerPlugin("function", "msgPool", "smarty_function_msgPool"); +$smarty->registerPlugin("function", "image", "smarty_function_image"); +$smarty->registerPlugin("function", "factory", "smarty_function_factory"); /* Global FPDF define */ define('FPDF_FONTPATH', '/usr/share/php/fpdf/font/'); diff --git a/gosa-core/include/smarty/Smarty.class.php b/gosa-core/include/smarty/Smarty.class.php index 059361e92..4a9f8a807 100644 --- a/gosa-core/include/smarty/Smarty.class.php +++ b/gosa-core/include/smarty/Smarty.class.php @@ -1,75 +1,71 @@ -* @author Uwe Tews -* @author Rodney Rehm -* @package Smarty -* @version 3.1.4 -*/ + * Project: Smarty: the PHP compiling template engine + * File: Smarty.class.php + * SVN: $Id: Smarty.class.php 4225 2011-07-26 18:09:31Z uwe.tews@googlemail.com $ + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * For questions, help, comments, discussion, etc., please join the + * Smarty mailing list. Send a blank e-mail to + * smarty-discussion-subscribe@googlegroups.com + * + * @link http://www.smarty.net/ + * @copyright 2008 New Digital Group, Inc. + * @author Monte Ohrt + * @author Uwe Tews + * @package Smarty + * @version 3.0.9 + */ /** -* define shorthand directory separator constant -*/ + * define shorthand directory separator constant + */ if (!defined('DS')) { define('DS', DIRECTORY_SEPARATOR); } /** -* set SMARTY_DIR to absolute path to Smarty library files. -* Sets SMARTY_DIR only if user application has not already defined it. -*/ + * set SMARTY_DIR to absolute path to Smarty library files. + * Sets SMARTY_DIR only if user application has not already defined it. + */ if (!defined('SMARTY_DIR')) { define('SMARTY_DIR', dirname(__FILE__) . DS); } /** -* set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. -* Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. -*/ + * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. + * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. + */ if (!defined('SMARTY_SYSPLUGINS_DIR')) { define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DS); } if (!defined('SMARTY_PLUGINS_DIR')) { define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS); } -if (!defined('SMARTY_MBSTRING')) { - define('SMARTY_MBSTRING', function_exists('mb_strlen')); -} if (!defined('SMARTY_RESOURCE_CHAR_SET')) { - // UTF-8 can only be done properly when mbstring is available! - define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1'); + define('SMARTY_RESOURCE_CHAR_SET', 'UTF-8'); } if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); } /** -* register the class autoloader -*/ + * register the class autoloader + */ if (!defined('SMARTY_SPL_AUTOLOAD')) { define('SMARTY_SPL_AUTOLOAD', 0); } @@ -84,1150 +80,618 @@ if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR } /** -* Load always needed external class files -*/ -include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_data.php'; -include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_templatebase.php'; -include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_template.php'; -include_once SMARTY_SYSPLUGINS_DIR.'smarty_resource.php'; -include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_resource_file.php'; -include_once SMARTY_SYSPLUGINS_DIR.'smarty_cacheresource.php'; -include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_cacheresource_file.php'; - -/** -* This is the main Smarty class -* @package Smarty -*/ -class Smarty extends Smarty_Internal_TemplateBase { - - /**#@+ - * constant definitions - */ - - /** - * smarty version - */ - const SMARTY_VERSION = 'Smarty 3.1.4'; - - /** - * define variable scopes - */ - const SCOPE_LOCAL = 0; - const SCOPE_PARENT = 1; - const SCOPE_ROOT = 2; - const SCOPE_GLOBAL = 3; - /** - * define caching modes - */ - const CACHING_OFF = 0; - const CACHING_LIFETIME_CURRENT = 1; - const CACHING_LIFETIME_SAVED = 2; - /** - * define compile check modes - */ - const COMPILECHECK_OFF = 0; - const COMPILECHECK_ON = 1; - const COMPILECHECK_CACHEMISS = 2; - /** - * modes for handling of "" tags in templates. - */ - const PHP_PASSTHRU = 0; //-> print tags as plain text - const PHP_QUOTE = 1; //-> escape tags as entities - const PHP_REMOVE = 2; //-> escape tags as entities - const PHP_ALLOW = 3; //-> escape tags as entities - /** - * filter types - */ - const FILTER_POST = 'post'; - const FILTER_PRE = 'pre'; - const FILTER_OUTPUT = 'output'; - const FILTER_VARIABLE = 'variable'; - /** - * plugin types - */ - const PLUGIN_FUNCTION = 'function'; - const PLUGIN_BLOCK = 'block'; - const PLUGIN_COMPILER = 'compiler'; - const PLUGIN_MODIFIER = 'modifier'; - const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler'; - - /**#@-*/ - - /** - * assigned global tpl vars - */ - public static $global_tpl_vars = array(); - - /** - * error handler returned by set_error_hanlder() 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(); - - /**#@+ - * variables - */ - - /** - * auto literal on delimiters with whitspace - * @var boolean - */ + * This is the main Smarty class + */ +class Smarty extends Smarty_Internal_Data { + /** + * constant definitions + */ + // smarty version + const SMARTY_VERSION = 'Smarty-3.0.9'; + //define variable scopes + const SCOPE_LOCAL = 0; + const SCOPE_PARENT = 1; + const SCOPE_ROOT = 2; + const SCOPE_GLOBAL = 3; + // define caching modes + const CACHING_OFF = 0; + const CACHING_LIFETIME_CURRENT = 1; + const CACHING_LIFETIME_SAVED = 2; + /** modes for handling of "" tags in templates. **/ + const PHP_PASSTHRU = 0; //-> print tags as plain text + const PHP_QUOTE = 1; //-> escape tags as entities + const PHP_REMOVE = 2; //-> escape tags as entities + const PHP_ALLOW = 3; //-> escape tags as entities + // filter types + const FILTER_POST = 'post'; + const FILTER_PRE = 'pre'; + const FILTER_OUTPUT = 'output'; + const FILTER_VARIABLE = 'variable'; + // plugin types + const PLUGIN_FUNCTION = 'function'; + const PLUGIN_BLOCK = 'block'; + const PLUGIN_COMPILER = 'compiler'; + const PLUGIN_MODIFIER = 'modifier'; + + /** + * static variables + */ + // assigned global tpl vars + static $global_tpl_vars = array(); + + /** + * variables + */ + // auto literal on delimiters with whitspace public $auto_literal = true; - /** - * display error on not assigned variables - * @var boolean - */ + // display error on not assigned variables public $error_unassigned = false; - /** - * look up relative filepaths in include_path - * @var boolean - */ - public $use_include_path = false; - /** - * template directory - * @var array - */ - protected $template_dir = array(); - /** - * joined template directory string used in cache keys - * @var string - */ - public $joined_template_dir = null; - /** - * joined config directory string used in cache keys - * @var string - */ - public $joined_config_dir = null; - /** - * default template handler - * @var callable - */ + // template directory + public $template_dir = null; + // default template handler public $default_template_handler_func = null; - /** - * default config handler - * @var callable - */ - public $default_config_handler_func = null; - /** - * default plugin handler - * @var callable - */ - public $default_plugin_handler_func = null; - /** - * compile directory - * @var string - */ - protected $compile_dir = null; - /** - * plugins directory - * @var array - */ - protected $plugins_dir = array(); - /** - * cache directory - * @var string - */ - protected $cache_dir = null; - /** - * config directory - * @var array - */ - protected $config_dir = array(); - /** - * force template compiling? - * @var boolean - */ + // compile directory + public $compile_dir = null; + // plugins directory + public $plugins_dir = null; + // cache directory + public $cache_dir = null; + // config directory + public $config_dir = null; + // force template compiling? public $force_compile = false; - /** - * check template for modifications? - * @var boolean - */ + // check template for modifications? public $compile_check = true; - /** - * use sub dirs for compiled/cached files? - * @var boolean - */ + // locking concurrent compiles + public $compile_locking = true; + // use sub dirs for compiled/cached files? public $use_sub_dirs = false; - /** - * caching enabled - * @var boolean - */ + // compile_error? + public $compile_error = false; + // caching enabled public $caching = false; - /** - * merge compiled includes - * @var boolean - */ + // merge compiled includes public $merge_compiled_includes = false; - /** - * cache lifetime in seconds - * @var integer - */ + // cache lifetime public $cache_lifetime = 3600; - /** - * force cache file creation - * @var boolean - */ + // force cache file creation public $force_cache = false; - /** - * Set this if you want different sets of cache files for the same - * templates. - * - * @var string - */ + // cache_id public $cache_id = null; - /** - * Set this if you want different sets of compiled files for the same - * templates. - * - * @var string - */ + // compile_id public $compile_id = null; - /** - * template left-delimiter - * @var string - */ + // template delimiters public $left_delimiter = "{"; - /** - * template right-delimiter - * @var string - */ public $right_delimiter = "}"; - /**#@+ - * security - */ - /** - * class name - * - * This should be instance of Smarty_Security. - * - * @var string - * @see Smarty_Security - */ + // security public $security_class = 'Smarty_Security'; - /** - * implementation of security class - * - * @var Smarty_Security - */ public $security_policy = null; - /** - * controls handling of PHP-blocks - * - * @var integer - */ public $php_handling = self::PHP_PASSTHRU; - /** - * controls if the php template file resource is allowed - * - * @var bool - */ + public $allow_php_tag = false; 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 - * - * Setting this to true enables the debug-console. - * - * @var boolean - */ + public $trusted_dir = array(); + // debug mode public $debugging = false; - /** - * This determines if debugging is enable-able from the browser. - * - * @var string - */ public $debugging_ctrl = 'NONE'; - /** - * Name of debugging URL-param. - * - * Only used when $debugging_ctrl is set to 'URL'. - * The name of the URL-parameter that activates debugging. - * - * @var type - */ public $smarty_debug_id = 'SMARTY_DEBUG'; - /** - * Path of debug template. - * @var string - */ public $debug_tpl = null; - /** - * When set, smarty uses this value as error_reporting-level. - * @var int - */ + // When set, smarty does uses this value as error_reporting-level. public $error_reporting = null; - /** - * Internal flag for getTags() - * @var boolean - */ - public $get_used_tags = false; - - /**#@+ - * config var settings - */ - - /** - * Controls whether variables with the same name overwrite each other. - * @var boolean - */ - public $config_overwrite = true; - /** - * Controls whether config values of on/true/yes and off/false/no get converted to boolean. - * @var boolean - */ - public $config_booleanize = true; - /** - * Controls whether hidden config sections/vars are read from the file. - * @var boolean - */ - public $config_read_hidden = false; - - /**#@-*/ - - /**#@+ - * resource locking - */ - - /** - * locking concurrent compiles - * @var boolean - */ - public $compile_locking = true; - /** - * Controls whether cache resources should emply locking mechanism - * @var boolean - */ - public $cache_locking = false; - /** - * seconds to wait for acquiring a lock before ignoring the write lock - * @var float - */ - public $locking_timeout = 10; - - /**#@-*/ - - /** - * global template functions - * @var array - */ + // config var settings + public $config_overwrite = true; //Controls whether variables with the same name overwrite each other. + public $config_booleanize = true; //Controls whether config values of on/true/yes and off/false/no get converted to boolean + public $config_read_hidden = false; //Controls whether hidden config sections/vars are read from the file. + // config vars + public $config_vars = array(); + // assigned tpl vars + public $tpl_vars = array(); + // dummy parent object + public $parent = null; + // global template functions public $template_functions = array(); - /** - * resource type used if none given - * - * Must be an valid key of $registered_resources. - * @var string - */ + // resource type used if none given public $default_resource_type = 'file'; - /** - * caching type - * - * Must be an element of $cache_resource_types. - * - * @var string - */ + // caching type public $caching_type = 'file'; - /** - * internal config properties - * @var array - */ + // internal cache resource types + public $cache_resource_types = array('file'); + // internal config properties public $properties = array(); - /** - * config type - * @var string - */ + // config type public $default_config_type = 'file'; - /** - * cached template objects - * @var array - */ - public $template_objects = array(); - /** - * check If-Modified-Since headers - * @var boolean - */ + // cached template objects + public $template_objects = null; + // check If-Modified-Since headers public $cache_modified_check = false; - /** - * registered plugins - * @var array - */ + // registered plugins public $registered_plugins = array(); - /** - * plugin search order - * @var array - */ + // plugin search order public $plugin_search_order = array('function', 'block', 'compiler', 'class'); - /** - * registered objects - * @var array - */ + // registered objects public $registered_objects = array(); - /** - * registered classes - * @var array - */ + // registered classes public $registered_classes = array(); - /** - * registered filters - * @var array - */ + // registered filters public $registered_filters = array(); - /** - * registered resources - * @var array - */ + // registered resources public $registered_resources = array(); - /** - * resource handler cache - * @var array - */ - public $_resource_handlers = array(); - /** - * registered cache resources - * @var array - */ - public $registered_cache_resources = array(); - /** - * cache resource handler cache - * @var array - */ - public $_cacheresource_handlers = array(); - /** - * autoload filter - * @var array - */ + // autoload filter public $autoload_filters = array(); - /** - * default modifier - * @var array - */ + // status of filter on variable output + public $variable_filter = true; + // default modifier public $default_modifiers = array(); - /** - * autoescape variable output - * @var boolean - */ - public $escape_html = false; - /** - * global internal smarty vars - * @var array - */ - public static $_smarty_vars = array(); - /** - * start time for execution time calculation - * @var int - */ + // global internal smarty vars + static $_smarty_vars = array(); + // start time for execution time calculation public $start_time = 0; - /** - * default file permissions - * @var int - */ + // default file permissions public $_file_perms = 0644; - /** - * default dir permissions - * @var int - */ + // default dir permissions public $_dir_perms = 0771; - /** - * block tag hierarchy - * @var array - */ + // block tag hierarchy public $_tag_stack = array(); - /** - * self pointer to Smarty object - * @var Smarty - */ + // flag if {block} tag is compiled for template inheritance + public $inheritance = false; + // generate deprecated function call notices? + public $deprecation_notices = true; + // internal flag for getTags() + public $get_used_tags = false; + // Smarty 2 BC + public $_version = self::SMARTY_VERSION; + // self pointer to Smarty object public $smarty; - /** - * required by the compiler for BC - * @var string - */ - public $_current_file = null; - /** - * internal flag to enable parser debugging - * @var bool - */ - public $_parserdebug = false; - /** - * Saved parameter of merged templates during compilation - * - * @var array - */ - public $merged_templates_func = array(); - /**#@-*/ /** - * Initialize new Smarty object - * - */ + * Class constructor, initializes basic smarty properties + */ public function __construct() { - // selfpointer needed by some other class methods - $this->smarty = $this; + // selfpointer need by some other class methods + $this->smarty = $this; if (is_callable('mb_internal_encoding')) { mb_internal_encoding(SMARTY_RESOURCE_CHAR_SET); } $this->start_time = microtime(true); // set default dirs - $this->setTemplateDir('.' . DS . 'templates' . DS) - ->setCompileDir('.' . DS . 'templates_c' . DS) - ->setPluginsDir(SMARTY_PLUGINS_DIR) - ->setCacheDir('.' . DS . 'cache' . DS) - ->setConfigDir('.' . DS . 'configs' . DS); - - $this->debug_tpl = 'file:' . dirname(__FILE__) . '/debug.tpl'; + $this->template_dir = array('.' . DS . 'templates' . DS); + $this->compile_dir = '.' . DS . 'templates_c' . DS; + $this->plugins_dir = array(SMARTY_PLUGINS_DIR); + $this->cache_dir = '.' . DS . 'cache' . DS; + $this->config_dir = '.' . DS . 'configs' . DS; + $this->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl'; if (isset($_SERVER['SCRIPT_NAME'])) { $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); } } - /** - * Class destructor - */ + * Class destructor + */ public function __destruct() { - // intentionally left blank - } - - /** - * <> set selfpointer on cloned object - */ - public function __clone() - { - $this->smarty = $this; - } - - - /** - * <> Generic getter. - * - * Calls the appropriate getter function. - * Issues an E_USER_NOTICE if no valid getter is found. - * - * @param string $name property name - * @return mixed - */ - 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]}(); - } else { - trigger_error('Undefined property: '. get_class($this) .'::$'. $name, E_USER_NOTICE); - } } /** - * <> Generic setter. - * - * Calls the appropriate setter function. - * Issues an E_USER_NOTICE if no valid setter is found. - * - * @param string $name property name - * @param mixed $value parameter passed to setter - */ - public function __set($name, $value) + * 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 $ |null $parent next higher level of Smarty variables + * @return string rendered template output + */ + public function fetch($template, $cache_id = null, $compile_id = null, $parent = null, $display = false) { - $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); - } else { - trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); + if (!empty($cache_id) && is_object($cache_id)) { + $parent = $cache_id; + $cache_id = null; } - } - - /** - * Check if a template resource exists - * - * @param string $resource_name template name - * @return boolean status - */ - 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; - } - - /** - * Returns a single or all global variables - * - * @param object $smarty - * @param string $varname variable name or null - * @return string variable value or or array of variables - */ - public function getGlobal($varname = null) - { - if (isset($varname)) { - if (isset(self::$global_tpl_vars[$varname])) { - return self::$global_tpl_vars[$varname]->value; + if ($parent === null) { + // get default Smarty data object + $parent = $this; + } + // create template object if necessary + ($template instanceof $this->template_class)? $_template = $template : + $_template = $this->createTemplate ($template, $cache_id, $compile_id, $parent, false); + if (isset($this->error_reporting)) { + $_smarty_old_error_level = error_reporting($this->error_reporting); + } + // check URL debugging control + if (!$this->debugging && $this->debugging_ctrl == 'URL') { + if (isset($_SERVER['QUERY_STRING'])) { + $_query_string = $_SERVER['QUERY_STRING']; } else { - return ''; - } - } else { - $_result = array(); - foreach (self::$global_tpl_vars AS $key => $var) { - $_result[$key] = $var->value; + $_query_string = ''; } - return $_result; - } - } - - /** - * Empty cache folder - * - * @param integer $exp_time expiration time - * @param string $type resource type - * @return integer number of cache files deleted - */ - 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 - * @return Smarty current Smarty instance for chaining - * @throws SmartyException when an invalid class name is provided - */ - 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); - } - - return $this; - } - - /** - * Disable security - * @return Smarty current Smarty instance for chaining - */ - public function disableSecurity() - { - $this->security_policy = null; - - return $this; - } - - /** - * Set template directory - * - * @param string|array $template_dir directory(s) of template sources - * @return Smarty current Smarty instance for chaining - */ - public function setTemplateDir($template_dir) - { - $this->template_dir = array(); - foreach ((array) $template_dir as $k => $v) { - $this->template_dir[$k] = rtrim($v, '/\\') . DS; - } - - $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir); - return $this; - } - - /** - * Add template directory(s) - * - * @param string|array $template_dir directory(s) of template sources - * @param string $key of the array element to assign the template dir to - * @return Smarty current Smarty instance for chaining - * @throws SmartyException when the given template directory is not valid - */ - public function addTemplateDir($template_dir, $key=null) - { - // make sure we're dealing with an array - $this->template_dir = (array) $this->template_dir; - - if (is_array($template_dir)) { - foreach ($template_dir as $k => $v) { - if (is_int($k)) { - // indexes are not merged but appended - $this->template_dir[] = rtrim($v, '/\\') . DS; + if (false !== strpos($_query_string, $this->smarty_debug_id)) { + if (false !== strpos($_query_string, $this->smarty_debug_id . '=on')) { + // enable debugging for this browser session + setcookie('SMARTY_DEBUG', true); + $this->debugging = true; + } elseif (false !== strpos($_query_string, $this->smarty_debug_id . '=off')) { + // disable debugging for this browser session + setcookie('SMARTY_DEBUG', false); + $this->debugging = false; } else { - // string indexes are overridden - $this->template_dir[$k] = rtrim($v, '/\\') . DS; + // enable debugging for this page + $this->debugging = true; + } + } else { + if (isset($_COOKIE['SMARTY_DEBUG'])) { + $this->debugging = true; } } - } elseif ($key !== null) { - // override directory at specified index - $this->template_dir[$key] = rtrim($template_dir, '/\\') . DS; - } else { - // append new directory - $this->template_dir[] = rtrim($template_dir, '/\\') . DS; } - $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir); - return $this; - } - - /** - * Get template directories - * - * @param mixed index of directory to get, null to get all - * @return array|string list of template directories, or directory of $index - */ - public function getTemplateDir($index=null) - { - if ($index !== null) { - return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null; - } - - return (array)$this->template_dir; - } - - /** - * Set config directory - * - * @param string|array $template_dir directory(s) of configuration sources - * @return Smarty current Smarty instance for chaining - */ - 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(DIRECTORY_SEPARATOR, $this->config_dir); - return $this; - } - - /** - * Add config directory(s) - * - * @param string|array $config_dir directory(s) of config sources - * @param string key of the array element to assign the config dir to - * @return Smarty current Smarty instance for chaining - */ - public function addConfigDir($config_dir, $key=null) - { - // make sure we're dealing with an array - $this->config_dir = (array) $this->config_dir; - - if (is_array($config_dir)) { - foreach ($config_dir as $k => $v) { - if (is_int($k)) { - // indexes are not merged but appended - $this->config_dir[] = rtrim($v, '/\\') . DS; + // obtain data for cache modified check + if ($this->cache_modified_check && $this->caching && $display) { + $_isCached = $_template->isCached() && !$_template->has_nocache_code; + if ($_isCached) { + $_gmt_mtime = gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT'; + } else { + $_gmt_mtime = ''; + } + } + // return rendered template + if ((!$this->caching || $_template->resource_object->isEvaluated) && (isset($this->autoload_filters['output']) || isset($this->registered_filters['output']))) { + $_output = Smarty_Internal_Filter_Handler::runFilter('output', $_template->getRenderedTemplate(), $_template); + } else { + $_output = $_template->getRenderedTemplate(); + } + $_template->rendered_content = null; + if (isset($this->error_reporting)) { + error_reporting($_smarty_old_error_level); + } + // display or fetch + if ($display) { + if ($this->caching && $this->cache_modified_check) { + $_last_modified_date = @substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 0, strpos($_SERVER['HTTP_IF_MODIFIED_SINCE'], 'GMT') + 3); + if ($_isCached && $_gmt_mtime == $_last_modified_date) { + if (php_sapi_name() == 'cgi') + header('Status: 304 Not Modified'); + else + header('HTTP/1.1 304 Not Modified'); } else { - // string indexes are overridden - $this->config_dir[$k] = rtrim($v, '/\\') . DS; + header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $_template->getCachedTimestamp()) . ' GMT'); + echo $_output; } + } else { + echo $_output; + } + // debug output + if ($this->debugging) { + Smarty_Internal_Debug::display_debug($this); } - } elseif( $key !== null ) { - // override directory at specified index - $this->config_dir[$key] = rtrim($config_dir, '/\\') . DS; + return; } else { - // append new directory - $this->config_dir[] = rtrim($config_dir, '/\\') . DS; + // return fetched content + return $_output; } - - $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir); - return $this; } /** - * Get config directory - * - * @param mixed index of directory to get, null to get all - * @return array|string configuration directory - */ - public function getConfigDir($index=null) + * displays a Smarty template + * + * @param string $ |object $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, $cache_id = null, $compile_id = null, $parent = null) { - if ($index !== null) { - return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null; - } - - return (array)$this->config_dir; + // display template + $this->fetch ($template, $cache_id, $compile_id, $parent, true); } /** - * Set plugins directory - * - * @param string|array $plugins_dir directory(s) of plugins - * @return Smarty current Smarty instance for chaining - */ - public function setPluginsDir($plugins_dir) + * test if cache i valid + * + * @param string $ |object $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 + * @return boolean cache status + */ + public function isCached($template, $cache_id = null, $compile_id = null, $parent = null) { - $this->plugins_dir = array(); - foreach ((array)$plugins_dir as $k => $v) { - $this->plugins_dir[$k] = rtrim($v, '/\\') . DS; + if ($parent === null) { + $parent = $this; + } + if (!($template instanceof $this->template_class)) { + $template = $this->createTemplate ($template, $cache_id, $compile_id, $parent, false); } - - return $this; + // return cache status of template + return $template->isCached(); } /** - * Adds directory of plugin files - * - * @param object $smarty - * @param string $ |array $ plugins folder - * @return Smarty current Smarty instance for chaining - */ - public function addPluginsDir($plugins_dir) + * creates a data object + * + * @param object $parent next higher level of Smarty variables + * @returns object data object + */ + public function createData($parent = null) { - // make sure we're dealing with an array - $this->plugins_dir = (array) $this->plugins_dir; + return new Smarty_Data($parent, $this); + } - if (is_array($plugins_dir)) { - foreach ($plugins_dir as $k => $v) { - if (is_int($k)) { - // indexes are not merged but appended - $this->plugins_dir[] = rtrim($v, '/\\') . DS; + /** + * creates a template object + * + * @param string $template the resource handle of the template file + * @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 boolean $do_clone flag is Smarty object shall be cloned + * @returns object template object + */ + public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) + { + if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) { + $parent = $cache_id; + $cache_id = null; + } + if (!empty($parent) && is_array($parent)) { + $data = $parent; + $parent = null; + } else { + $data = null; + } + if (!is_object($template)) { + // we got a template resource + // already in template cache? + $_templateId = sha1($template . $cache_id . $compile_id); + if (isset($this->template_objects[$_templateId]) && $this->caching) { + // return cached template object + $tpl = $this->template_objects[$_templateId]; + } else { + // create new template object + if ($do_clone) { + $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id); } else { - // string indexes are overridden - $this->plugins_dir[$k] = rtrim($v, '/\\') . DS; + $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id); } } } else { - // append new directory - $this->plugins_dir[] = rtrim($plugins_dir, '/\\') . DS; + // just return a copy of template class + $tpl = $template; } - - $this->plugins_dir = array_unique($this->plugins_dir); - return $this; + // fill data if present + if (!empty($data) && is_array($data)) { + // set up variable values + foreach ($data as $_key => $_val) { + $tpl->tpl_vars[$_key] = new Smarty_variable($_val); + } + } + return $tpl; } - /** - * Get plugin directories - * - * @return array list of plugin directories - */ - public function getPluginsDir() - { - return (array)$this->plugins_dir; - } - /** - * Set compile directory - * - * @param string $compile_dir directory to store compiled templates in - * @return Smarty current Smarty instance for chaining - */ - public function setCompileDir($compile_dir) - { - $this->compile_dir = rtrim($compile_dir, '/\\') . DS; - if (!isset(Smarty::$_muted_directories[$this->compile_dir])) { - Smarty::$_muted_directories[$this->compile_dir] = null; - } - return $this; - } /** - * Get compiled directory - * - * @return string path to compiled templates - */ - public function getCompileDir() + * Check if a template resource exists + * + * @param string $resource_name template name + * @return boolean status + */ + function templateExists($resource_name) { - return $this->compile_dir; + // create template object + $save = $this->template_objects; + $tpl = new $this->template_class($resource_name, $this); + // check if it does exists + $result = $tpl->isExisting(); + $this->template_objects = $save; + return $result; } /** - * Set cache directory - * - * @param string $cache_dir directory to store cached templates in - * @return Smarty current Smarty instance for chaining - */ - public function setCacheDir($cache_dir) + * Returns a single or all global variables + * + * @param object $smarty + * @param string $varname variable name or null + * @return string variable value or or array of variables + */ + function getGlobal($varname = null) { - $this->cache_dir = rtrim($cache_dir, '/\\') . DS; - if (!isset(Smarty::$_muted_directories[$this->cache_dir])) { - Smarty::$_muted_directories[$this->cache_dir] = null; + if (isset($varname)) { + if (isset(self::$global_tpl_vars[$varname])) { + return self::$global_tpl_vars[$varname]->value; + } else { + return ''; + } + } else { + $_result = array(); + foreach (self::$global_tpl_vars AS $key => $var) { + $_result[$key] = $var->value; + } + return $_result; } - return $this; } /** - * Get cache directory + * Empty cache folder * - * @return string path of cache directory + * @param integer $exp_time expiration time + * @param string $type resource type + * @return integer number of cache files deleted */ - public function getCacheDir() + function clearAllCache($exp_time = null, $type = null) { - return $this->cache_dir; + // load cache resource and call clearAll + return $this->loadCacheResource($type)->clearAll($exp_time); } /** - * Set default modifiers + * Empty cache for a specific template * - * @param array|string $modifiers modifier or list of modifiers to set - * @return Smarty current Smarty instance for chaining + * @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 setDefaultModifiers($modifiers) + function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) { - $this->default_modifiers = (array) $modifiers; - return $this; + // load cache resource and call clear + return $this->loadCacheResource($type)->clear($template_name, $cache_id, $compile_id, $exp_time); } /** - * 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) + * Loads security class and enables security + */ + public function enableSecurity($security_class = null) { - if (is_array($modifiers)) { - $this->default_modifiers = array_merge($this->default_modifiers, $modifiers); + if ($security_class instanceof Smarty_Security) { + $this->security_policy = $security_class; + return; + } + if ($security_class == null) { + $security_class = $this->security_class; + } + if (class_exists($security_class)) { + $this->security_policy = new $security_class($this); } else { - $this->default_modifiers[] = $modifiers; + throw new SmartyException("Security class '$security_class' is not defined"); } - - return $this; } /** - * Get default modifiers - * - * @return array list of default modifiers - */ - public function getDefaultModifiers() + * Disable security + */ + public function disableSecurity() { - return $this->default_modifiers; + $this->security_policy = null; } - /** - * Set autoload filters + * Loads cache resource. * - * @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 + * @param string $type cache resource type + * @return object of cache resource */ - public function setAutoloadFilters($filters, $type=null) - { - if ($type !== null) { - $this->autoload_filters[$type] = (array) $filters; - } else { - $this->autoload_filters = (array) $filters; + public function loadCacheResource($type = null) { + if (!isset($type)) { + $type = $this->caching_type; } - - 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; + if (in_array($type, $this->cache_resource_types)) { + $cache_resource_class = 'Smarty_Internal_CacheResource_' . ucfirst($type); + return new $cache_resource_class($this); + } + else { + // try plugins dir + $cache_resource_class = 'Smarty_CacheResource_' . ucfirst($type); + if ($this->loadPlugin($cache_resource_class)) { + return new $cache_resource_class($this); } - } 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; - } + else { + throw new SmartyException("Unable to load cache resource '{$type}'"); } } - - 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) + * Set template directory + * + * @param string $ |array $template_dir folder(s) of template sorces + */ + public function setTemplateDir($template_dir) { - if ($type !== null) { - return isset($this->autoload_filters[$type]) ? $this->autoload_filters[$type] : array(); - } + $this->template_dir = (array)$template_dir; + return; + } - return $this->autoload_filters; + /** + * Adds template directory(s) to existing ones + * + * @param string $ |array $template_dir folder(s) of template sources + */ + public function addTemplateDir($template_dir) + { + $this->template_dir = array_unique(array_merge((array)$this->template_dir, (array)$template_dir)); + return; } /** - * return name of debugging template - * - * @return string - */ - public function getDebugTemplate() + * Adds directory of plugin files + * + * @param object $smarty + * @param string $ |array $ plugins folder + * @return + */ + function addPluginsDir($plugins_dir) { - return $this->debug_tpl; + $this->plugins_dir = array_unique(array_merge((array)$this->plugins_dir, (array)$plugins_dir)); + return; } + /** - * 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) + * return a reference to a registered object + * + * @param string $name object name + * @return object + */ + function getRegisteredObject($name) { - if (!is_readable($tpl_name)) { - throw new SmartyException("Unknown file '{$tpl_name}'"); - } - $this->debug_tpl = $tpl_name; + if (!isset($this->registered_objects[$name])) + throw new SmartyException("'$name' is not a registered object"); - return $this; + if (!is_object($this->registered_objects[$name][0])) + throw new SmartyException("registered '$name' is not an object"); + + return $this->registered_objects[$name][0]; } + /** - * creates a template object - * - * @param string $template the resource handle of the template file - * @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 boolean $do_clone flag is Smarty object shall be cloned - * @return object template object - */ - public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) + * return name of debugging template + * + * @return string + */ + function getDebugTemplate() { - if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) { - $parent = $cache_id; - $cache_id = null; - } - if (!empty($parent) && is_array($parent)) { - $data = $parent; - $parent = null; - } else { - $data = null; - } - // default to cache_id and compile_id of Smarty object - $cache_id = $cache_id === null ? $this->cache_id : $cache_id; - $compile_id = $compile_id === null ? $this->compile_id : $compile_id; - // already in template cache? - $unique_template_name = Smarty_Resource::getUniqueTemplateName($this, $template); - $_templateId = sha1($unique_template_name . $cache_id . $compile_id); - if ($do_clone) { - if (isset($this->template_objects[$_templateId])) { - // return cached template object - $tpl = clone $this->template_objects[$_templateId]; - $tpl->smarty = clone $tpl->smarty; - $tpl->parent = $parent; - } else { - $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id); - } - } else { - if (isset($this->template_objects[$_templateId])) { - // return cached template object - $tpl = $this->template_objects[$_templateId]; - } else { - $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id); - } - } - // fill data if present - if (!empty($data) && is_array($data)) { - // set up variable values - foreach ($data as $_key => $_val) { - $tpl->tpl_vars[$_key] = new Smarty_variable($_val); - } - } - return $tpl; + return $this->debug_tpl; } + /** + * set the debug template + * + * @param string $tpl_name + * @return bool + */ + function setDebugTemplate($tpl_name) + { + return $this->debug_tpl = $tpl_name; + } /** - * Takes unknown classes and loads plugin files for them - * class name format: Smarty_PluginType_PluginName - * plugin filename format: plugintype.pluginname.php - * - * @param string $plugin_name class plugin name to load - * @param bool $check check if already loaded - * @return string |boolean filepath of loaded file or false - */ + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param string $plugin_name class plugin name to load + * @return string |boolean filepath of loaded file or false + */ 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))) { + 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); + $_plugin_name = strtolower($plugin_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') { + if (count($_name_parts) < 3 || $_name_parts[0] !== 'smarty') { throw new SmartyException("plugin {$plugin_name} is not a valid name format"); return false; } // if type is "internal", get plugin from sysplugins - if (strtolower($_name_parts[1]) == 'internal') { - $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php'; + if ($_name_parts[1] == 'internal') { + $file = SMARTY_SYSPLUGINS_DIR . $_plugin_name . '.php'; if (file_exists($file)) { require_once($file); return $file; @@ -1237,73 +701,21 @@ class Smarty extends Smarty_Internal_TemplateBase { } // plugin filename is expected to be: [type].[name].php $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php"; - // 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 (file_exists($file)) { - require_once($file); - return $file; - } - if ($this->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) { - // try PHP include_path - if (($file = Smarty_Internal_Get_Include_Path::getIncludePath($file)) !== false) { - require_once($file); - return $file; - } - } + foreach((array)$this->plugins_dir as $_plugin_dir) { + if (strpos('/\\', substr($_plugin_dir, -1)) === false) { + $_plugin_dir .= DS; + } + $file = $_plugin_dir . $_plugin_filename; + if (file_exists($file)) { + require_once($file); + return $file; } } // no plugin loaded return false; } - /** - * Compile all template 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 - */ - public function compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) - { - return Smarty_Internal_Utility::compileAllTemplates($extention, $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 - */ - public function compileAllConfig($extention = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null) - { - return Smarty_Internal_Utility::compileAllConfig($extention, $force_compile, $time_limit, $max_errors, $this); - } - - /** - * 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); - } - - /** * Return array of tag/attributes of all tags used by an template * @@ -1316,142 +728,101 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * 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 + * clean up properties on cloned object */ - public function testInstall(&$errors=null) + public function __clone() { - return Smarty_Internal_Utility::testInstall($this, $errors); - } + // clear config vars + $this->config_vars = array(); + // clear assigned tpl vars + $this->tpl_vars = array(); + // clear objects for external methods + unset($this->Register); + unset($this->Filter); + } + /** - * Error Handler to mute expected messages - * - * @link http://php.net/set_error_handler - * @param integer $errno Error level - * @return boolean + * Handle unknown class methods + * + * @param string $name unknown methode name + * @param array $args aurgument array */ - public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) - { - $_is_muted_directory = false; - - // add the SMARTY_DIR to the list of muted directories - if (!isset(Smarty::$_muted_directories[SMARTY_DIR])) { - $smarty_dir = realpath(SMARTY_DIR); - Smarty::$_muted_directories[SMARTY_DIR] = array( - 'file' => $smarty_dir, - 'length' => strlen($smarty_dir), - ); - } - - // walk the muted directories and test against $errfile - foreach (Smarty::$_muted_directories as $key => &$dir) { - if (!$dir) { - // resolve directory and length for speedy comparisons - $file = realpath($key); - $dir = array( - 'file' => $file, - 'length' => strlen($file), - ); - } - if (!strncmp($errfile, $dir['file'], $dir['length'])) { - $_is_muted_directory = true; - break; - } - } - - // pass to next error handler if this error did not occur inside SMARTY_DIR - // 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); - } else { + public function __call($name, $args) + { + static $camel_func; + 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) !== '_') { + // try to keep case correct for future PHP 6.0 case-sensitive class methods + // 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); + if (!property_exists($this, $property_name)) { + throw new SmartyException("property '$property_name' does not exist."); return false; } + if ($first3 == 'get') + return $this->$property_name; + else + return $this->$property_name = $args[0]; + } + // Smarty Backward Compatible wrapper + if (strpos($name,'_') !== false) { + if (!isset($this->wrapper)) { + $this->wrapper = new Smarty_Internal_Wrapper($this); + } + return $this->wrapper->convert($name, $args); + } + // external Smarty methods ? + foreach(array('Filter','Register') as $external) { + if (class_exists("Smarty_Internal_{$external}") && method_exists("Smarty_Internal_{$external}",$name)) { + if (!isset($this->$external)) { + $class = "Smarty_Internal_{$external}"; + $this->$external = new $class($this); + } + return call_user_func_array(array($this->$external,$name), $args); + } + } + if (in_array($name,array('clearCompiledTemplate','compileAllTemplates','compileAllConfig','testInstall','getTags'))) { + if (!isset($this->utility)) { + $this->utility = new Smarty_Internal_Utility($this); + } + return call_user_func_array(array($this->utility,$name), $args); + } + // PHP4 call to constructor? + if (strtolower($name) == 'smarty') { + throw new SmartyException('Please use parent::__construct() to call parent constuctor'); + return false; } - } - - /** - * Enable error handler to mute expected messages - * - * @return void - */ - public static function muteExpectedErrors() - { - /* - 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. - - 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, - which does not exist using the simple @filemtime() approach. - */ - $error_handler = array('Smarty', 'mutingErrorHandler'); - $previous = set_error_handler($error_handler); - - // avoid dead loops - if ($previous !== $error_handler) { - Smarty::$_previous_error_handler = $previous; - } - } - - /** - * Disable error handler muting expected messages - * - * @return void - */ - public static function unmuteExpectedErrors() - { - restore_error_handler(); - } + throw new SmartyException("Call of unknown function '$name'."); + } } /** -* Smarty exception class -* @package Smarty -*/ -class SmartyException extends Exception { + * Autoloader + */ +function smartyAutoload($class) +{ + $_class = strtolower($class); + if (substr($_class, 0, 16) === 'smarty_internal_' || $_class == 'smarty_security') { + include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; + } } /** -* Smarty compiler exception class -* @package Smarty -*/ -class SmartyCompilerException extends SmartyException { + * Smarty exception class + */ +Class SmartyException extends Exception { } /** -* Autoloader -*/ -function smartyAutoload($class) -{ - $_class = strtolower($class); - $_classes = array( - 'smarty_config_source' => true, - 'smarty_config_compiled' => true, - 'smarty_security' => true, - 'smarty_cacheresource' => true, - 'smarty_cacheresource_custom' => true, - 'smarty_cacheresource_keyvaluestore' => true, - 'smarty_resource' => true, - 'smarty_resource_custom' => true, - 'smarty_resource_uncompiled' => true, - 'smarty_resource_recompiled' => true, - ); - - if (!strncmp($_class, 'smarty_internal_', 16) || isset($_classes[$_class])) { - include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; - } + * Smarty compiler exception class + */ +Class SmartyCompilerException extends SmartyException { } ?> diff --git a/gosa-core/include/smarty/debug.tpl b/gosa-core/include/smarty/debug.tpl index 12eef0ffd..058c5b204 100644 --- a/gosa-core/include/smarty/debug.tpl +++ b/gosa-core/include/smarty/debug.tpl @@ -86,7 +86,7 @@ td { -

Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var nofilter}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}

+

Smarty Debug Console - {if isset($template_name)}{$template_name|debug_print_var}{else}Total Time {$execution_time|string_format:"%.5f"}{/if}

{if !empty($template_data)}

included templates & config files (load time in seconds)

@@ -108,7 +108,7 @@ td { {foreach $assigned_vars as $vars} ${$vars@key|escape:'html'} - {$vars|debug_print_var nofilter} + {$vars|debug_print_var} {/foreach} @@ -118,7 +118,7 @@ td { {foreach $config_vars as $vars} {$vars@key|escape:'html'} - {$vars|debug_print_var nofilter} + {$vars|debug_print_var} {/foreach} @@ -128,6 +128,6 @@ td { diff --git a/gosa-core/include/smartyAddons/block.render.php b/gosa-core/include/smartyAddons/block.render.php new file mode 100644 index 000000000..47e9a826b --- /dev/null +++ b/gosa-core/include/smartyAddons/block.render.php @@ -0,0 +1,126 @@ + */ + if(empty($text)) { + return(""); + } + + /* Get acl parameter */ + $acl = ""; + if (isset($params['acl'])) { + $acl = $params['acl']; + } + + /* Debug output */ + if (session::is_set('debugLevel') && session::get('debugLevel') & DEBUG_ACL ){ + echo " ".$acl.""; + } + + + + /* Parameter : checkbox, checked + * If the parameter 'checkbox' is given, we create a html checkbox in front + * of the current object. + * The parameter 'checked' specifies whether the box is checked or not. + * The checkbox disables or enables the current object. + */ + if(isset($params['checkbox']) && $params['checkbox']){ + + /* Detect name and id of the current object */ + $use_text = preg_replace("/\n/"," ",$text); + $name = preg_replace('/^.* name[ ]*=[ ]*("|\')([^\"\' ]*).*$/i',"\\2",$use_text); + + /* Detect id */ + if(preg_match("/ id=(\"|')[^\"']*(\"|')/i",$text)){ + $id = preg_replace('/^.* id[ ]*=[ ]*("|\')([^\"\' ]*).*$/i',"\\2",$use_text); + }else{ + $id = ""; + } + + /* Is the box checked? */ + isset($params['checked'])&&$params['checked'] ? $check = " checked " : $check = ""; + + /* If name isset, we have a html input field */ + if(!empty($name)){ + + /* Print checkbox */ + echo ""; + + /* Disable current object, if checkbox isn't checked */ + if($check == ""){ + $text = preg_replace("/name=/i"," disabled name=",$text); + } + + /* Add id to current entry, if it is missing */ + if($id == ""){ + $text = preg_replace("/name=/i"," id=\"".$name."\" name=",$text); + } + } + } + + + /* Read / Write*/ + if(preg_match("/w/i",$acl)){ + return ($text); + } + + $text = preg_replace ("/\n/","GOSA_LINE_BREAK",$text); + + /* Disable objects, but keep those active that have mode=read_active */ + if(!(isset($params['mode']) && ($params['mode']=='read_active') && preg_match("/(r|w)/",$acl))){ + + /* Disable options && greyout lists */ + $from = array("/class=['\"]list1nohighlight['\"]/i", + "/class=['\"]list0['\"]/i", + "/class=['\"]list1['\"]/i", + "/class=['\"]sortableListItem[^'\"]*['\"]/i"); + $to = array("class='list1nohighlightdisabled'", + "class='list1nohighlightdisabled'", + "class='list1nohighlightdisabled'", + "class='sortableListItemDisabled'"); + + if(!preg_match("/ disabled /",$text)){ + $from [] = "/name=/i" ; + $to [] = "disabled name="; + } + + $text = preg_replace($from,$to,$text); + + /* Replace picture if object is disabled */ + if(isset($params['disable_picture'])){ + $syn = "/src=['\"][^\"']*['\"]/i"; + $new = "src=\"".$params['disable_picture']."\""; + $text = preg_replace($syn,$new,$text); + } + } + + /* Read only */ + if(preg_match("/r/i",$acl)){ + return(preg_replace("/GOSA_LINE_BREAK/","\n",$text)); + } + + /* No acls */ + if(preg_match("/type['\"= ].*submit/",$text)){ + $text = preg_replace("/submit/","button",$text); + }else{ + $text = preg_replace("/value=['\"][^\"']*['\"]/","",$text); + } + + /* Remove select options */ + $from = array("##i", + "/().*(<\/textarea>)/i", + "/^(.*.*)$/i"); + + $to = array(" ", + "\\1\\2", + "\\1 \\2"); + $text = preg_replace($from,$to,$text); + $text = preg_replace("/GOSA_LINE_BREAK/","\n",$text); + + return $text; +} + +?> diff --git a/gosa-core/include/smartyAddons/block.t.php b/gosa-core/include/smartyAddons/block.t.php new file mode 100644 index 000000000..ca7382aeb --- /dev/null +++ b/gosa-core/include/smartyAddons/block.t.php @@ -0,0 +1,126 @@ + + * @copyright 2004-2005 Sagi Bashari + */ + +/** + * Replaces arguments in a string with their values. + * Arguments are represented by % followed by their number. + * + * @param string Source string + * @param mixed Arguments, can be passed in an array or through single variables. + * @returns string Modified string + */ +function smarty_gettext_strarg($str) +{ + $tr = array(); + $p = 0; + + for ($i=1; $i < func_num_args(); $i++) { + $arg = func_get_arg($i); + + if (is_array($arg)) { + foreach ($arg as $aarg) { + $tr['%'.++$p] = $aarg; + } + } else { + $tr['%'.++$p] = $arg; + } + } + + return strtr($str, $tr); +} + +/** + * Smarty block function, provides gettext support for smarty. + * + * The block content is the text that should be translated. + * + * Any parameter that is sent to the function will be represented as %n in the translation text, + * where n is 1 for the first parameter. The following parameters are reserved: + * - escape - sets escape mode: + * - 'html' for HTML escaping, this is the default. + * - 'js' for javascript escaping. + * - 'url' for url escaping. + * - 'no'/'off'/0 - turns off escaping + * - plural - The plural version of the text (2nd parameter of ngettext()) + * - count - The item count for plural mode (3rd parameter of ngettext()) + */ +function smarty_block_t($params, $text, &$smarty) +{ + $text = stripslashes($text); + + // set escape mode + if (isset($params['escape'])) { + $escape = $params['escape']; + unset($params['escape']); + } + + // set plural version + if (isset($params['plural'])) { + $plural = $params['plural']; + unset($params['plural']); + + // set count + if (isset($params['count'])) { + $count = $params['count']; + unset($params['count']); + } + } + + // use plural if required parameters are set + if (isset($count) && isset($plural)) { + $text = ngettext($text, $plural, $count); + } else { // use normal + $text = gettext($text); + } + + // run strarg if there are parameters + if (count($params)) { + $text = smarty_gettext_strarg($text, $params); + } + + if (!isset($escape) || $escape == 'html') { // html escape, default + $text = nl2br(htmlspecialchars($text)); + } elseif (isset($escape)) { + switch ($escape) { + case 'javascript': + case 'js': + // javascript escape + $text = str_replace('\'', '\\\'', stripslashes($text)); + break; + case 'url': + // url escape + $text = urlencode($text); + break; + } + } + + return $text; +} + +?> diff --git a/gosa-core/include/smartyAddons/block.tr.php b/gosa-core/include/smartyAddons/block.tr.php new file mode 100644 index 000000000..6427629d7 --- /dev/null +++ b/gosa-core/include/smartyAddons/block.tr.php @@ -0,0 +1,25 @@ + diff --git a/gosa-core/include/smartyAddons/function.factory.php b/gosa-core/include/smartyAddons/function.factory.php new file mode 100644 index 000000000..10b15ffc5 --- /dev/null +++ b/gosa-core/include/smartyAddons/function.factory.php @@ -0,0 +1,37 @@ +"; + } + return($str); +} + +?> diff --git a/gosa-core/include/smartyAddons/function.image.php b/gosa-core/include/smartyAddons/function.image.php new file mode 100644 index 000000000..3d120737f --- /dev/null +++ b/gosa-core/include/smartyAddons/function.image.php @@ -0,0 +1,25 @@ + diff --git a/gosa-core/include/smartyAddons/function.msgPool.php b/gosa-core/include/smartyAddons/function.msgPool.php new file mode 100644 index 000000000..c9c0275a6 --- /dev/null +++ b/gosa-core/include/smartyAddons/function.msgPool.php @@ -0,0 +1,21 @@ + $value){ + if(!preg_match("/^type$/i",$para)){ + $parameter[$para] = $value; + } + } + if(is_callable("msgPool::".$params['type'])){ + echo call_user_func_array(array("msgPool",$params['type']), $parameter); + }else{ + trigger_error("Unknown msgPool function ".$params['type']); + } + }else{ + trigger_error("Unknown class msgPool."); + } +} +?>