Repository: xcg340122/PHP300Framework2.0 Branch: master Commit: 2ba403cd2776 Files: 247 Total size: 1.2 MB Directory structure: gitextract_9fpoihz6/ ├── .gitignore ├── Extend/ │ ├── Class/ │ │ └── UploadFile.class.php │ └── Package/ │ └── smarty/ │ ├── Autoloader.php │ ├── Smarty.class.php │ ├── SmartyBC.class.php │ ├── bootstrap.php │ ├── noted.txt │ ├── plugins/ │ │ ├── block.textformat.php │ │ ├── function.counter.php │ │ ├── function.cycle.php │ │ ├── function.fetch.php │ │ ├── function.html_checkboxes.php │ │ ├── function.html_image.php │ │ ├── function.html_options.php │ │ ├── function.html_radios.php │ │ ├── function.html_select_date.php │ │ ├── function.html_select_time.php │ │ ├── function.html_table.php │ │ ├── function.mailto.php │ │ ├── function.math.php │ │ ├── modifier.capitalize.php │ │ ├── modifier.date_format.php │ │ ├── modifier.debug_print_var.php │ │ ├── modifier.escape.php │ │ ├── modifier.mb_wordwrap.php │ │ ├── modifier.regex_replace.php │ │ ├── modifier.replace.php │ │ ├── modifier.spacify.php │ │ ├── modifier.truncate.php │ │ ├── modifiercompiler.cat.php │ │ ├── modifiercompiler.count_characters.php │ │ ├── modifiercompiler.count_paragraphs.php │ │ ├── modifiercompiler.count_sentences.php │ │ ├── modifiercompiler.count_words.php │ │ ├── modifiercompiler.default.php │ │ ├── modifiercompiler.escape.php │ │ ├── modifiercompiler.from_charset.php │ │ ├── modifiercompiler.indent.php │ │ ├── modifiercompiler.lower.php │ │ ├── modifiercompiler.noprint.php │ │ ├── modifiercompiler.string_format.php │ │ ├── modifiercompiler.strip.php │ │ ├── modifiercompiler.strip_tags.php │ │ ├── modifiercompiler.to_charset.php │ │ ├── modifiercompiler.unescape.php │ │ ├── modifiercompiler.upper.php │ │ ├── modifiercompiler.wordwrap.php │ │ ├── outputfilter.trimwhitespace.php │ │ ├── shared.escape_special_chars.php │ │ ├── shared.literal_compiler_param.php │ │ ├── shared.make_timestamp.php │ │ ├── shared.mb_str_replace.php │ │ ├── shared.mb_unicode.php │ │ └── variablefilter.htmlspecialchars.php │ └── sysplugins/ │ ├── smarty_cacheresource.php │ ├── smarty_cacheresource_custom.php │ ├── smarty_cacheresource_keyvaluestore.php │ ├── smarty_data.php │ ├── smarty_internal_block.php │ ├── smarty_internal_cacheresource_file.php │ ├── smarty_internal_compile_append.php │ ├── smarty_internal_compile_assign.php │ ├── smarty_internal_compile_block.php │ ├── smarty_internal_compile_break.php │ ├── smarty_internal_compile_call.php │ ├── smarty_internal_compile_capture.php │ ├── smarty_internal_compile_config_load.php │ ├── smarty_internal_compile_continue.php │ ├── smarty_internal_compile_debug.php │ ├── smarty_internal_compile_eval.php │ ├── smarty_internal_compile_extends.php │ ├── smarty_internal_compile_for.php │ ├── smarty_internal_compile_foreach.php │ ├── smarty_internal_compile_function.php │ ├── smarty_internal_compile_if.php │ ├── smarty_internal_compile_include.php │ ├── smarty_internal_compile_include_php.php │ ├── smarty_internal_compile_insert.php │ ├── smarty_internal_compile_ldelim.php │ ├── smarty_internal_compile_make_nocache.php │ ├── smarty_internal_compile_nocache.php │ ├── smarty_internal_compile_private_block_plugin.php │ ├── smarty_internal_compile_private_foreachsection.php │ ├── smarty_internal_compile_private_function_plugin.php │ ├── smarty_internal_compile_private_modifier.php │ ├── smarty_internal_compile_private_object_block_function.php │ ├── smarty_internal_compile_private_object_function.php │ ├── smarty_internal_compile_private_php.php │ ├── smarty_internal_compile_private_print_expression.php │ ├── smarty_internal_compile_private_registered_block.php │ ├── smarty_internal_compile_private_registered_function.php │ ├── smarty_internal_compile_private_special_variable.php │ ├── smarty_internal_compile_rdelim.php │ ├── smarty_internal_compile_section.php │ ├── smarty_internal_compile_setfilter.php │ ├── smarty_internal_compile_shared_inheritance.php │ ├── smarty_internal_compile_while.php │ ├── smarty_internal_compilebase.php │ ├── smarty_internal_config_file_compiler.php │ ├── smarty_internal_configfilelexer.php │ ├── smarty_internal_configfileparser.php │ ├── smarty_internal_data.php │ ├── smarty_internal_debug.php │ ├── smarty_internal_errorhandler.php │ ├── smarty_internal_extension_handler.php │ ├── smarty_internal_method_addautoloadfilters.php │ ├── smarty_internal_method_adddefaultmodifiers.php │ ├── smarty_internal_method_append.php │ ├── smarty_internal_method_appendbyref.php │ ├── smarty_internal_method_assignbyref.php │ ├── smarty_internal_method_assignglobal.php │ ├── smarty_internal_method_clearallassign.php │ ├── smarty_internal_method_clearallcache.php │ ├── smarty_internal_method_clearassign.php │ ├── smarty_internal_method_clearcache.php │ ├── smarty_internal_method_clearcompiledtemplate.php │ ├── smarty_internal_method_clearconfig.php │ ├── smarty_internal_method_compileallconfig.php │ ├── smarty_internal_method_compilealltemplates.php │ ├── smarty_internal_method_configload.php │ ├── smarty_internal_method_createdata.php │ ├── smarty_internal_method_getautoloadfilters.php │ ├── smarty_internal_method_getconfigvariable.php │ ├── smarty_internal_method_getconfigvars.php │ ├── smarty_internal_method_getdebugtemplate.php │ ├── smarty_internal_method_getdefaultmodifiers.php │ ├── smarty_internal_method_getglobal.php │ ├── smarty_internal_method_getregisteredobject.php │ ├── smarty_internal_method_getstreamvariable.php │ ├── smarty_internal_method_gettags.php │ ├── smarty_internal_method_gettemplatevars.php │ ├── smarty_internal_method_literals.php │ ├── smarty_internal_method_loadfilter.php │ ├── smarty_internal_method_loadplugin.php │ ├── smarty_internal_method_mustcompile.php │ ├── smarty_internal_method_registercacheresource.php │ ├── smarty_internal_method_registerclass.php │ ├── smarty_internal_method_registerdefaultconfighandler.php │ ├── smarty_internal_method_registerdefaultpluginhandler.php │ ├── smarty_internal_method_registerdefaulttemplatehandler.php │ ├── smarty_internal_method_registerfilter.php │ ├── smarty_internal_method_registerobject.php │ ├── smarty_internal_method_registerplugin.php │ ├── smarty_internal_method_registerresource.php │ ├── smarty_internal_method_setautoloadfilters.php │ ├── smarty_internal_method_setdebugtemplate.php │ ├── smarty_internal_method_setdefaultmodifiers.php │ ├── smarty_internal_method_unloadfilter.php │ ├── smarty_internal_method_unregistercacheresource.php │ ├── smarty_internal_method_unregisterfilter.php │ ├── smarty_internal_method_unregisterobject.php │ ├── smarty_internal_method_unregisterplugin.php │ ├── smarty_internal_method_unregisterresource.php │ ├── smarty_internal_nocache_insert.php │ ├── smarty_internal_parsetree.php │ ├── smarty_internal_parsetree_code.php │ ├── smarty_internal_parsetree_dq.php │ ├── smarty_internal_parsetree_dqcontent.php │ ├── smarty_internal_parsetree_tag.php │ ├── smarty_internal_parsetree_template.php │ ├── smarty_internal_parsetree_text.php │ ├── smarty_internal_resource_eval.php │ ├── smarty_internal_resource_extends.php │ ├── smarty_internal_resource_file.php │ ├── smarty_internal_resource_php.php │ ├── smarty_internal_resource_registered.php │ ├── smarty_internal_resource_stream.php │ ├── smarty_internal_resource_string.php │ ├── smarty_internal_runtime_cachemodify.php │ ├── smarty_internal_runtime_cacheresourcefile.php │ ├── smarty_internal_runtime_capture.php │ ├── smarty_internal_runtime_codeframe.php │ ├── smarty_internal_runtime_filterhandler.php │ ├── smarty_internal_runtime_foreach.php │ ├── smarty_internal_runtime_getincludepath.php │ ├── smarty_internal_runtime_inheritance.php │ ├── smarty_internal_runtime_make_nocache.php │ ├── smarty_internal_runtime_tplfunction.php │ ├── smarty_internal_runtime_updatecache.php │ ├── smarty_internal_runtime_updatescope.php │ ├── smarty_internal_runtime_writefile.php │ ├── smarty_internal_smartytemplatecompiler.php │ ├── smarty_internal_template.php │ ├── smarty_internal_templatebase.php │ ├── smarty_internal_templatecompilerbase.php │ ├── smarty_internal_templatelexer.php │ ├── smarty_internal_templateparser.php │ ├── smarty_internal_testinstall.php │ ├── smarty_internal_undefined.php │ ├── smarty_resource.php │ ├── smarty_resource_custom.php │ ├── smarty_resource_recompiled.php │ ├── smarty_resource_uncompiled.php │ ├── smarty_security.php │ ├── smarty_template_cached.php │ ├── smarty_template_compiled.php │ ├── smarty_template_config.php │ ├── smarty_template_resource_base.php │ ├── smarty_template_source.php │ ├── smarty_undefined_variable.php │ ├── smarty_variable.php │ ├── smartycompilerexception.php │ └── smartyexception.php ├── Framework/ │ ├── Config/ │ │ └── frame.cfg.php │ ├── Library/ │ │ ├── Common/ │ │ │ └── helper.php │ │ ├── Interfaces/ │ │ │ ├── CacheInterface.php │ │ │ ├── ConfigInterface.php │ │ │ ├── DbInterface.php │ │ │ ├── LogInterface.php │ │ │ ├── LogicExceptionsInterface.php │ │ │ ├── RouterInterface.php │ │ │ ├── SessionInterface.php │ │ │ ├── ViewInterface.php │ │ │ └── VisitInterface.php │ │ └── Process/ │ │ ├── Cache.class.php │ │ ├── Config.class.php │ │ ├── Db.class.php │ │ ├── Drive/ │ │ │ ├── Cache/ │ │ │ │ ├── File.php │ │ │ │ ├── Memcache.php │ │ │ │ └── Redis.php │ │ │ └── Db/ │ │ │ ├── Mysqli.php │ │ │ └── PDO.php │ │ ├── Extend.class.php │ │ ├── Log.class.php │ │ ├── LogicExceptions.class.php │ │ ├── ReturnHandle.class.php │ │ ├── Router.class.php │ │ ├── Running.class.php │ │ ├── Session.class.php │ │ ├── Structure.class.php │ │ ├── Tool.class.php │ │ ├── Tpl/ │ │ │ ├── error.tpl │ │ │ ├── error_page.tpl │ │ │ └── success_page.tpl │ │ ├── View.class.php │ │ └── Visit.class.php │ └── frame.php ├── LICENSE.txt ├── Project/ │ ├── config/ │ │ └── App.cfg.php │ ├── home/ │ │ └── Index.class.php │ ├── model/ │ │ └── UserModel.class.php │ └── view/ │ └── home/ │ └── index.html ├── README.md ├── Web/ │ ├── .htaccess │ ├── Public/ │ │ └── system/ │ │ └── noted.txt │ └── index.php └── composer.json ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ .idea/ ================================================ FILE: Extend/Class/UploadFile.class.php ================================================ allowExts = array_map('strtolower', $allowExts); } else { $this->allowExts = explode(',', strtolower($allowExts)); } } if (!empty($maxSize) && is_numeric($maxSize)) { $this->maxSize = $maxSize; } if (!empty($allowTypes)) { if (is_array($allowTypes)) { $this->allowTypes = array_map('strtolower', $allowTypes); } else { $this->allowTypes = explode(',', strtolower($allowTypes)); } } } /** * 上传所有文件 * @param string $savePath * @return bool */ public function upload($savePath = '') { if (empty($savePath)) $savePath = $this->savePath; $savePath = rtrim($savePath, '/') . '/'; if (!is_dir($savePath)) { $this->createDir($savePath); if (!is_dir($savePath)) { $this->error = "目录{$savePath}不存在"; return false; } } else { if (!is_writeable($savePath)) { $this->error = "目录{$savePath}不可写"; return false; } } $fileInfo = array(); $isUpload = false; $files = $this->dealFiles($_FILES); foreach ($files as $key => $file) { if (!empty($file['name'])) { $file['key'] = $key; $file['extension'] = $this->getExt($file['name']); $file['savepath'] = $savePath; $file['savename'] = $this->getSaveName($file); if ($this->autoCheck) { if (!$this->check($file)) return false; } if (!$this->save($file)) return false; unset($file['tmp_name'], $file['error']); $fileInfo[] = $file; $isUpload = true; } } if ($isUpload) { $this->uploadFileInfo = $fileInfo; return true; } else { $this->error = '没有选择上传文件'; return false; } } /** * 遍历创建文件夹 * @param $path */ private function createDir($path) { if (!file_exists($path)) { $this->createDir(dirname($path)); mkdir($path, 0777); } } /** * 处理$_FILES信息 将多个file分离 * @param $files * @return array */ private function dealFiles($files) { $fileArray = array(); $n = 0; foreach ($files as $file) { if (is_array($file['name'])) { //关联数组 $keys = array_keys($file); $count = count($file['name']); for ($i = 0; $i < $count; $i++) { foreach ($keys as $key) { $fileArray[$n][$key] = $file[$key][$i]; } $n++; } } else { $fileArray[$n] = $file; $n++; } } return $fileArray; } /** * 获取扩展名 * @param $filename * @return mixed */ private function getExt($filename) { $pathinfo = pathinfo($filename); return $pathinfo['extension']; } /** * 文件命名 规则 * @param $file * @return string */ private function getSaveName($file) { $saveName = md5(uniqid()) . '.' . $file['extension']; return $saveName; } /** * 检测文件大小,文件扩展名,文件Mime类型,是否非法上传 * @param $file * @return bool */ private function check($file) { if ($file['error'] !== 0) { $this->error($file['error']); return false; } if (!$this->checkSize($file['size'])) { $this->error = '上传文件大小不符!'; return false; } if (!$this->checkExt($file['extension'])) { $this->error = '上传文件类型不允许!'; return false; } if (!$this->checkType($file['type'])) { $this->error = '上传文件MIME类型不允许!'; return false; } if (!$this->checkUpload($file['tmp_name'])) { $this->error = '非法上传文件!'; return false; } return true; } /** * 捕获错误上传信息 * @param $errorCode */ private function error($errorCode) { switch ($errorCode) { case 1: $this->error = '上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值'; break; case 2: $this->error = '上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值'; break; case 3: $this->error = '文件只有部分被上传'; break; case 4: $this->error = '没有文件被上传'; break; case 6: $this->error = '找不到临时文件夹'; break; case 7: $this->error = '文件写入失败'; break; default: $this->error = '未知上传错误!'; } return; } /** * 检测文件大小 * @param $size * @return bool */ private function checkSize($size) { return $size < $this->maxSize; } /** * 检测文件扩展名 * @param $extension * @return bool */ private function checkExt($extension) { if (!empty($this->allowExts)) return in_array(strtolower($extension), $this->allowExts, true); return true; } /** * 检查文件Mime类型 * @param $type * @return bool */ private function checkType($type) { if (!empty($this->allowTypes)) return in_array(strtolower($type), $this->allowTypes, true); return true; } /** * 检测是否非法上传 * @param $filename * @return bool */ private function checkUpload($filename) { return is_uploaded_file($filename); } /** * 保存一个文件 * @param $file * @return bool */ private function save($file) { $filename = $file['savepath'] . $file['savename']; if (!$this->uploadReplace && is_file($filename)) { $this->error = '文件已经存在!' . $filename; return false; } if (in_array(strtolower($file['extension']), array('gif', 'jpg', 'jpeg', 'bmp', 'png', 'swf')) && false === getimagesize($file['tmp_name'])) { $this->error = '非法图像文件'; return false; } if (!move_uploaded_file($file['tmp_name'], $filename)) { $this->error = '文件上传保存错误!'; return false; } return true; } /** * 通过指定文件的$_FILES['name']上传文件 * @param $file * @param string $savePath * @return bool */ public function uploadOne($file, $savePath = '') { if (empty($savePath)) $savePath = $this->savePath; $savePath = rtrim($savePath, '/') . '/'; if (!is_dir($savePath)) { $this->createDir($savePath); if (!is_dir($savePath)) { $this->error = "目录{$savePath}不存在"; return false; } } else { if (!is_writeable($savePath)) { $this->error = '上传目录' . $savePath . '不可写'; return false; } } if (!empty($file['name'])) { $fileArray = array(); if (is_array($file['name'])) { $keys = array_keys($file); $count = count($file['name']); for ($i = 0; $i < $count; $i++) { foreach ($keys as $key) $fileArray[$i][$key] = $file[$key][$i]; } } else { $fileArray[] = $file; } $fileInfo = array(); foreach ($fileArray as $key => $file) { $file['extension'] = $this->getExt($file['name']); $file['savepath'] = $savePath; $file['savename'] = $this->getSaveName($file); if ($this->autoCheck) { if (!$this->check($file)) return false; } if (!$this->save($file)) return false; unset($file['tmp_name'], $file['error']); $fileInfo[] = $file; } $this->uploadFileInfo = $fileInfo; return true; } else { $this->error = '没有选择上传文件'; return false; } } /** * 获取文件上传成功之后的信息 * @return array 文件上传信息 */ public function getUploadFileInfo() { return $this->uploadFileInfo; } /** * 获取最近一次的错误信息 * @return string */ public function getErrorMsg() { return $this->error; } } ================================================ FILE: Extend/Package/smarty/Autoloader.php ================================================ 'Smarty.class.php', 'smartybc' => 'SmartyBC.class.php',); /** * Registers Smarty_Autoloader backward compatible to older installations. * * @param bool $prepend Whether to prepend the autoloader or not. */ public static function registerBC($prepend = false) { /** * register the class autoloader */ if (!defined('SMARTY_SPL_AUTOLOAD')) { define('SMARTY_SPL_AUTOLOAD', 0); } if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false ) { $registeredAutoLoadFunctions = spl_autoload_functions(); if (!isset($registeredAutoLoadFunctions[ 'spl_autoload' ])) { spl_autoload_register(); } } else { self::register($prepend); } } /** * Registers Smarty_Autoloader as an SPL autoloader. * * @param bool $prepend Whether to prepend the autoloader or not. */ public static function register($prepend = false) { self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR; self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR : self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR; if (version_compare(PHP_VERSION, '5.3.0', '>=')) { spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); } else { spl_autoload_register(array(__CLASS__, 'autoload')); } } /** * Handles auto loading of classes. * * @param string $class A class name. */ public static function autoload($class) { if ($class[ 0 ] !== 'S' && strpos($class, 'Smarty') !== 0) { return; } $_class = strtolower($class); if (isset(self::$rootClasses[ $_class ])) { $file = self::$SMARTY_DIR . self::$rootClasses[ $_class ]; if (is_file($file)) { include $file; } } else { $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php'; if (is_file($file)) { include $file; } } return; } } ================================================ FILE: Extend/Package/smarty/Smarty.class.php ================================================ * @author Uwe Tews * @author Rodney Rehm * @package Smarty * @version 3.1.32-dev */ /** * 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__) . DIRECTORY_SEPARATOR); } /** * 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' . DIRECTORY_SEPARATOR); } if (!defined('SMARTY_PLUGINS_DIR')) { /** * */ define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DIRECTORY_SEPARATOR); } if (!defined('SMARTY_MBSTRING')) { /** * */ define('SMARTY_MBSTRING', function_exists('mb_get_info')); } if (!defined('SMARTY_RESOURCE_CHAR_SET')) { // UTF-8 can only be done properly when mbstring is available! /** * @deprecated in favor of Smarty::$_CHARSET */ define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1'); } if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { /** * @deprecated in favor of Smarty::$_DATE_FORMAT */ define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); } /** * Load Smarty_Autoloader */ if (!class_exists('Smarty_Autoloader')) { include dirname(__FILE__) . '/bootstrap.php'; } /** * Load always needed external class files */ 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'; require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php'; /** * This is the main Smarty class * * @package Smarty * * The following methods will be dynamically loaded by the extension handler when they are called. * They are located in a corresponding Smarty_Internal_Method_xxxx class * * @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(string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, $max_errors = null) * @method int compileAllConfig(string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, $max_errors = null) * @method int clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) */ class Smarty extends Smarty_Internal_TemplateBase { /** * smarty version */ const SMARTY_VERSION = '3.1.32-dev-38'; /** * define variable scopes */ const SCOPE_LOCAL = 1; const SCOPE_PARENT = 2; const SCOPE_TPL_ROOT = 4; const SCOPE_ROOT = 8; const SCOPE_SMARTY = 16; const SCOPE_GLOBAL = 32; /** * define caching modes */ const CACHING_OFF = 0; const CACHING_LIFETIME_CURRENT = 1; const CACHING_LIFETIME_SAVED = 2; /** * define constant for clearing cache files be saved expiration dates */ const CLEAR_EXPIRED = -1; /** * define compile check modes */ const COMPILECHECK_OFF = 0; const COMPILECHECK_ON = 1; const COMPILECHECK_CACHEMISS = 2; /** * define debug modes */ const DEBUG_OFF = 0; const DEBUG_ON = 1; const DEBUG_INDIVIDUAL = 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(); /** * Flag denoting if Multibyte String functions are available */ public static $_MBSTRING = SMARTY_MBSTRING; /** * The character set to adhere to (e.g. "UTF-8") */ public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET; /** * The date format to be used internally * (accepts date() and strftime()) */ public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT; /** * Flag denoting if PCRE should run in UTF-8 mode */ public static $_UTF8_MODIFIER = 'u'; /** * Flag denoting if operating system is windows */ public static $_IS_WINDOWS = false; /** * auto literal on delimiters with whitespace * * @var boolean */ public $auto_literal = true; /** * display error on not assigned variables * * @var boolean */ public $error_unassigned = false; /** * look up relative file path in include_path * * @var boolean */ public $use_include_path = false; /** * flag if template_dir is normalized * * @var bool */ public $_templateDirNormalized = false; /** * joined template directory string used in cache keys * * @var string */ public $_joined_template_dir = null; /** * flag if config_dir is normalized * * @var bool */ public $_configDirNormalized = false; /** * joined config directory string used in cache keys * * @var string */ public $_joined_config_dir = null; /** * default template handler * * @var callable */ 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; /** * flag if template_dir is normalized * * @var bool */ public $_compileDirNormalized = false; /** * flag if plugins_dir is normalized * * @var bool */ public $_pluginsDirNormalized = false; /** * flag if template_dir is normalized * * @var bool */ public $_cacheDirNormalized = false; /** * force template compiling? * * @var boolean */ public $force_compile = false; /** * use sub dirs for compiled/cached files? * * @var boolean */ public $use_sub_dirs = false; /** * allow ambiguous resources (that are made unique by the resource handler) * * @var boolean */ public $allow_ambiguous_resources = false; /** * merge compiled includes * * @var boolean */ public $merge_compiled_includes = false; /* * flag for behaviour when extends: resource and {extends} tag are used simultaneous * if false disable execution of {extends} in templates called by extends resource. * (behaviour as versions < 3.1.28) * * @var boolean */ public $extends_recursion = true; /** * force cache file creation * * @var boolean */ public $force_cache = false; /** * template left-delimiter * * @var string */ public $left_delimiter = "{"; /** * template right-delimiter * * @var string */ public $right_delimiter = "}"; /** * array of strings which shall be treated as literal by compiler * * @var array string */ public $literals = array(); /** * class name * This should be instance of Smarty_Security. * * @var string * @see Smarty_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_templates = false; /** * debug mode * Setting this to true enables the debug-console. * * @var boolean */ 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 string */ 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 */ public $error_reporting = null; /** * 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; /** * locking concurrent compiles * * @var boolean */ public $compile_locking = true; /** * Controls whether cache resources should use 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; /** * resource type used if none given * Must be an valid key of $registered_resources. * * @var string */ public $default_resource_type = 'file'; /** * caching type * Must be an element of $cache_resource_types. * * @var string */ public $caching_type = 'file'; /** * config type * * @var string */ public $default_config_type = 'file'; /** * check If-Modified-Since headers * * @var boolean */ public $cache_modified_check = false; /** * registered plugins * * @var array */ public $registered_plugins = array(); /** * registered objects * * @var array */ public $registered_objects = array(); /** * registered classes * * @var array */ public $registered_classes = array(); /** * registered filters * * @var array */ public $registered_filters = array(); /** * registered resources * * @var array */ public $registered_resources = array(); /** * registered cache resources * * @var array */ public $registered_cache_resources = array(); /** * autoload filter * * @var array */ public $autoload_filters = array(); /** * default modifier * * @var array */ public $default_modifiers = array(); /** * autoescape variable output * * @var boolean */ public $escape_html = false; /** * start time for execution time calculation * * @var int */ public $start_time = 0; /** * required by the compiler for BC * * @var string */ public $_current_file = null; /** * internal flag to enable parser debugging * * @var bool */ public $_parserdebug = false; /** * This object type (Smarty = 1, template = 2, data = 4) * * @var int */ public $_objType = 1; /** * Debug object * * @var Smarty_Internal_Debug */ public $_debug = null; /** * template directory * * @var array */ protected $template_dir = array('./templates/'); /** * flags for normalized template directory entries * * @var array */ protected $_processedTemplateDir = array(); /** * config directory * * @var array */ protected $config_dir = array('./configs/'); /** * flags for normalized template directory entries * * @var array */ protected $_processedConfigDir = array(); /** * compile directory * * @var string */ protected $compile_dir = './templates_c/'; /** * plugins directory * * @var array */ protected $plugins_dir = array(); /** * cache directory * * @var string */ protected $cache_dir = './cache/'; /** * removed properties * * @var string[] */ protected $obsoleteProperties = array('resource_caching', 'template_resource_caching', 'direct_access_security', '_dir_perms', '_file_perms', 'plugin_search_order', 'inheritance_merge_compiled_includes', 'resource_cache_mode',); /** * List of private properties which will call getter/setter on a direct access * * @var string[] */ protected $accessMap = array('template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir', 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir', 'cache_dir' => 'CacheDir',); /** * Initialize new Smarty object */ public function __construct() { $this->_clearTemplateCache(); parent::__construct(); if (is_callable('mb_internal_encoding')) { mb_internal_encoding(Smarty::$_CHARSET); } $this->start_time = microtime(true); if (isset($_SERVER[ 'SCRIPT_NAME' ])) { Smarty::$global_tpl_vars[ 'SCRIPT_NAME' ] = new Smarty_Variable($_SERVER[ 'SCRIPT_NAME' ]); } // Check if we're running on windows Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8 if (Smarty::$_CHARSET !== 'UTF-8') { Smarty::$_UTF8_MODIFIER = ''; } } /** * Enable error handler to mute expected messages * * @return boolean * @deprecated */ public static function muteExpectedErrors() { return Smarty_Internal_ErrorHandler::muteExpectedErrors(); } /** * Disable error handler muting expected messages * * @deprecated */ public static function unmuteExpectedErrors() { restore_error_handler(); } /** * Check if a template resource exists * * @param string $resource_name template name * * @return bool status * @throws \SmartyException */ public function templateExists($resource_name) { // create source object $source = Smarty_Template_Source::load(null, $this, $resource_name); return $source->exists; } /** * 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) { Smarty_Security::enableSecurity($this, $security_class); return $this; } /** * Disable security * * @return Smarty current Smarty instance for chaining */ public function disableSecurity() { $this->security_policy = null; 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 * @param bool $isConfig true for config_dir * * @return Smarty current Smarty instance for chaining */ public function addTemplateDir($template_dir, $key = null, $isConfig = false) { if ($isConfig) { $processed = &$this->_processedConfigDir; $dir = &$this->config_dir; $this->_configDirNormalized = false; } else { $processed = &$this->_processedTemplateDir; $dir = &$this->template_dir; $this->_templateDirNormalized = false; } if (is_array($template_dir)) { foreach ($template_dir as $k => $v) { if (is_int($k)) { // indexes are not merged but appended $dir[] = $v; } else { // string indexes are overridden $dir[ $k ] = $v; unset($processed[ $key ]); } } } else { if ($key !== null) { // override directory at specified index $dir[ $key ] = $template_dir; unset($processed[ $key ]); } else { // append new directory $dir[] = $template_dir; } } return $this; } /** * Get template directories * * @param mixed $index index of directory to get, null to get all * @param bool $isConfig true for config_dir * * @return array list of template directories, or directory of $index */ public function getTemplateDir($index = null, $isConfig = false) { if ($isConfig) { $dir = &$this->config_dir; } else { $dir = &$this->template_dir; } if ($isConfig ? !$this->_configDirNormalized : !$this->_templateDirNormalized) { $this->_normalizeTemplateConfig($isConfig); } if ($index !== null) { return isset($dir[ $index ]) ? $dir[ $index ] : null; } return $dir; } /** * 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 */ public function setTemplateDir($template_dir, $isConfig = false) { if ($isConfig) { $this->config_dir = array(); $this->_processedConfigDir = array(); } else { $this->template_dir = array(); $this->_processedTemplateDir = array(); } $this->addTemplateDir($template_dir, null, $isConfig); return $this; } /** * Add config directory(s) * * @param string|array $config_dir directory(s) of config sources * @param mixed $key 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) { return $this->addTemplateDir($config_dir, $key, true); } /** * Get config directory * * @param mixed $index index of directory to get, null to get all * * @return array configuration directory */ public function getConfigDir($index = null) { return $this->getTemplateDir($index, true); } /** * Set config directory * * @param $config_dir * * @return Smarty current Smarty instance for chaining */ public function setConfigDir($config_dir) { return $this->setTemplateDir($config_dir, true); } /** * Adds directory of plugin files * * @param null|array|string $plugins_dir * * @return Smarty current Smarty instance for chaining */ public function addPluginsDir($plugins_dir) { if (empty($this->plugins_dir)) { $this->plugins_dir[] = SMARTY_PLUGINS_DIR; } $this->plugins_dir = array_merge($this->plugins_dir, (array)$plugins_dir); $this->_pluginsDirNormalized = false; return $this; } /** * Get plugin directories * * @return array list of plugin directories */ public function getPluginsDir() { if (empty($this->plugins_dir)) { $this->plugins_dir[] = SMARTY_PLUGINS_DIR; $this->_pluginsDirNormalized = false; } if (!$this->_pluginsDirNormalized) { if (!is_array($this->plugins_dir)) { $this->plugins_dir = (array)$this->plugins_dir; } foreach ($this->plugins_dir as $k => $v) { $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true); } $this->_cache[ 'plugin_files' ] = array(); $this->_pluginsDirNormalized = true; } return $this->plugins_dir; } /** * Set plugins directory * * @param string|array $plugins_dir directory(s) of plugins * * @return Smarty current Smarty instance for chaining */ public function setPluginsDir($plugins_dir) { $this->plugins_dir = (array)$plugins_dir; $this->_pluginsDirNormalized = false; return $this; } /** * Get compiled directory * * @return string path to compiled templates */ public function getCompileDir() { if (!$this->_compileDirNormalized) { $this->_normalizeDir('compile_dir', $this->compile_dir); $this->_compileDirNormalized = true; } return $this->compile_dir; } /** * * @param string $compile_dir directory to store compiled templates in * * @return Smarty current Smarty instance for chaining */ public function setCompileDir($compile_dir) { $this->_normalizeDir('compile_dir', $compile_dir); $this->_compileDirNormalized = true; return $this; } /** * Get cache directory * * @return string path of cache directory */ public function getCacheDir() { if (!$this->_cacheDirNormalized) { $this->_normalizeDir('cache_dir', $this->cache_dir); $this->_cacheDirNormalized = true; } return $this->cache_dir; } /** * 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) { $this->_normalizeDir('cache_dir', $cache_dir); $this->_cacheDirNormalized = true; return $this; } /** * 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 \Smarty_Internal_Template template object * @throws \SmartyException */ public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) { if ($cache_id !== null && (is_object($cache_id) || is_array($cache_id))) { $parent = $cache_id; $cache_id = null; } if ($parent !== null && is_array($parent)) { $data = $parent; $parent = null; } else { $data = null; } if (!$this->_templateDirNormalized) { $this->_normalizeTemplateConfig(false); } $_templateId = $this->_getTemplateId($template, $cache_id, $compile_id); $tpl = null; if ($this->caching && isset(Smarty_Internal_Template::$isCacheTplObj[ $_templateId ])) { $tpl = $do_clone ? clone Smarty_Internal_Template::$isCacheTplObj[ $_templateId ] : Smarty_Internal_Template::$isCacheTplObj[ $_templateId ]; $tpl->inheritance = null; $tpl->tpl_vars = $tpl->config_vars = array(); } else if (!$do_clone && isset(Smarty_Internal_Template::$tplObjCache[ $_templateId ])) { $tpl = clone Smarty_Internal_Template::$tplObjCache[ $_templateId ]; $tpl->inheritance = null; $tpl->tpl_vars = $tpl->config_vars = array(); } else { /* @var Smarty_Internal_Template $tpl */ $tpl = new $this->template_class($template, $this, null, $cache_id, $compile_id, null, null); $tpl->templateId = $_templateId; } if ($do_clone) { $tpl->smarty = clone $tpl->smarty; } $tpl->parent = $parent ? $parent : $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); } } if ($this->debugging || $this->debugging_ctrl === 'URL') { $tpl->smarty->_debug = new Smarty_Internal_Debug(); // check URL debugging control if (!$this->debugging && $this->debugging_ctrl === 'URL') { $tpl->smarty->_debug->debugUrl($tpl->smarty); } } return $tpl; } /** * 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 * * @throws SmartyException * @return string |boolean filepath of loaded file or false */ public function loadPlugin($plugin_name, $check = true) { return $this->ext->loadPlugin->loadPlugin($this, $plugin_name, $check); } /** * Get unique template id * * @param string $template_name * @param null|mixed $cache_id * @param null|mixed $compile_id * @param null $caching * @param \Smarty_Internal_Template $template * * @return string * @throws \SmartyException */ public function _getTemplateId($template_name, $cache_id = null, $compile_id = null, $caching = null, Smarty_Internal_Template $template = null) { $template_name = (strpos($template_name, ':') === false) ? "{$this->default_resource_type}:{$template_name}" : $template_name; $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); if ((isset($template) && strpos($template_name, ':.') !== false) || $this->allow_ambiguous_resources) { $_templateId = Smarty_Resource::getUniqueTemplateName((isset($template) ? $template : $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; } /** * Normalize path * - remove /./ and /../ * - make it absolute if required * * @param string $path file path * @param bool $realpath if true - convert to absolute * false - convert to relative * null - keep as it is but remove /./ /../ * * @return string */ public function _realpath($path, $realpath = null) { $nds = DIRECTORY_SEPARATOR === '/' ? '\\' : '/'; // normalize DIRECTORY_SEPARATOR $path = str_replace($nds, DIRECTORY_SEPARATOR, $path); preg_match('%^(?(?:[[:alpha:]]:[\\\\]|/|[\\\\]{2}[[:alpha:]]+|[[:print:]]{2,}:[/]{2}|[\\\\])?)(?(.*))$%u', $path, $parts); $path = $parts[ 'path' ]; if ($parts[ 'root' ] === '\\') { $parts[ 'root' ] = substr(getcwd(), 0, 2) . $parts[ 'root' ]; } else { if ($realpath !== null && !$parts[ 'root' ]) { $path = getcwd() . DIRECTORY_SEPARATOR . $path; } } // remove noop 'DIRECTORY_SEPARATOR DIRECTORY_SEPARATOR' and 'DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR' patterns $path = preg_replace('#([\\\\/]([.]?[\\\\/])+)#u', DIRECTORY_SEPARATOR, $path); // resolve '..DIRECTORY_SEPARATOR' pattern, smallest first if (strpos($path, '..' . DIRECTORY_SEPARATOR) !== false && preg_match_all('#(([.]?[\\\\/])*([.][.])[\\\\/]([.]?[\\\\/])*)+#u', $path, $match) ) { $counts = array(); foreach ($match[ 0 ] as $m) { $counts[] = (int)((strlen($m) - 1) / 3); } sort($counts); foreach ($counts as $count) { $path = preg_replace('#(([\\\\/]([.]?[\\\\/])*[^\\\\/.]+){' . $count . '}[\\\\/]([.]?[\\\\/])*([.][.][\\\\/]([.]?[\\\\/])*){' . $count . '})(?=[^.])#u', DIRECTORY_SEPARATOR, $path); } } return $parts[ 'root' ] . $path; } /** * Empty template objects cache */ public function _clearTemplateCache() { Smarty_Internal_Template::$isCacheTplObj = array(); Smarty_Internal_Template::$tplObjCache = array(); } /** * @param boolean $use_sub_dirs */ public function setUseSubDirs($use_sub_dirs) { $this->use_sub_dirs = $use_sub_dirs; } /** * @param int $error_reporting */ public function setErrorReporting($error_reporting) { $this->error_reporting = $error_reporting; } /** * @param boolean $escape_html */ public function setEscapeHtml($escape_html) { $this->escape_html = $escape_html; } /** * Return auto_literal flag * * @return boolean */ public function getAutoLiteral() { return $this->auto_literal; } /** * Set auto_literal flag * * @param boolean $auto_literal */ public function setAutoLiteral($auto_literal = true) { $this->auto_literal = $auto_literal; } /** * @param boolean $force_compile */ public function setForceCompile($force_compile) { $this->force_compile = $force_compile; } /** * @param boolean $merge_compiled_includes */ public function setMergeCompiledIncludes($merge_compiled_includes) { $this->merge_compiled_includes = $merge_compiled_includes; } /** * Get left delimiter * * @return string */ public function getLeftDelimiter() { return $this->left_delimiter; } /** * Set left delimiter * * @param string $left_delimiter */ public function setLeftDelimiter($left_delimiter) { $this->left_delimiter = $left_delimiter; } /** * Get right delimiter * * @return string $right_delimiter */ public function getRightDelimiter() { return $this->right_delimiter; } /** * Set right delimiter * * @param string */ public function setRightDelimiter($right_delimiter) { $this->right_delimiter = $right_delimiter; } /** * @param boolean $debugging */ public function setDebugging($debugging) { $this->debugging = $debugging; } /** * @param boolean $config_overwrite */ public function setConfigOverwrite($config_overwrite) { $this->config_overwrite = $config_overwrite; } /** * @param boolean $config_booleanize */ public function setConfigBooleanize($config_booleanize) { $this->config_booleanize = $config_booleanize; } /** * @param boolean $config_read_hidden */ public function setConfigReadHidden($config_read_hidden) { $this->config_read_hidden = $config_read_hidden; } /** * @param boolean $compile_locking */ public function setCompileLocking($compile_locking) { $this->compile_locking = $compile_locking; } /** * @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); } /** * Get Smarty object * * @return Smarty */ public function _getSmartyObj() { return $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) { if (isset($this->accessMap[ $name ])) { $method = 'get' . $this->accessMap[ $name ]; return $this->{$method}(); } else if (isset($this->_cache[ $name ])) { return $this->_cache[ $name ]; } else if (in_array($name, $this->obsoleteProperties)) { return null; } else { trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); } return null; } /** * <> 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) { if (isset($this->accessMap[ $name ])) { $method = 'set' . $this->accessMap[ $name ]; $this->{$method}($value); } else if (in_array($name, $this->obsoleteProperties)) { return; } else { if (is_object($value) && method_exists($value, $name)) { $this->$name = $value; } else { trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); } } } /** * Normalize and set directory string * * @param string $dirName cache_dir or compile_dir * @param string $dir filepath of folder */ private function _normalizeDir($dirName, $dir) { $this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . DIRECTORY_SEPARATOR, true); if (class_exists('Smarty_Internal_ErrorHandler', false)) { if (!isset(Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ])) { Smarty_Internal_ErrorHandler::$mutedDirectories[ $this->{$dirName} ] = null; } } } /** * Normalize template_dir or config_dir * * @param bool $isConfig true for config_dir * */ private function _normalizeTemplateConfig($isConfig) { if ($isConfig) { $processed = &$this->_processedConfigDir; $dir = &$this->config_dir; } else { $processed = &$this->_processedTemplateDir; $dir = &$this->template_dir; } if (!is_array($dir)) { $dir = (array)$dir; } foreach ($dir as $k => $v) { if (!isset($processed[ $k ])) { $dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true); $processed[ $k ] = true; } } $isConfig ? $this->_configDirNormalized = true : $this->_templateDirNormalized = true; $isConfig ? $this->_joined_config_dir = join('#', $this->config_dir) : $this->_joined_template_dir = join('#', $this->template_dir); } } ================================================ FILE: Extend/Package/smarty/SmartyBC.class.php ================================================ * @author Uwe Tews * @author Rodney Rehm * @package Smarty */ /** * @ignore */ require_once(dirname(__FILE__) . '/Smarty.class.php'); /** * Smarty Backward Compatibility Wrapper Class * * @package Smarty */ class SmartyBC extends Smarty { /** * Smarty 2 BC * * @var string */ public $_version = self::SMARTY_VERSION; /** * This is an array of directories where trusted php scripts reside. * * @var array */ public $trusted_dir = array(); /** * Initialize new SmartyBC object * */ public function __construct() { parent::__construct(); } /** * wrapper for assign_by_ref * * @param string $tpl_var the template variable name * @param mixed &$value the referenced value to assign */ public function assign_by_ref($tpl_var, &$value) { $this->assignByRef($tpl_var, $value); } /** * wrapper for append_by_ref * * @param string $tpl_var the template variable name * @param mixed &$value the referenced value to append * @param boolean $merge flag if array elements shall be merged */ public function append_by_ref($tpl_var, &$value, $merge = false) { $this->appendByRef($tpl_var, $value, $merge); } /** * clear the given assigned template variable. * * @param string $tpl_var the template variable to clear */ public function clear_assign($tpl_var) { $this->clearAssign($tpl_var); } /** * Registers custom function to be used in templates * * @param string $function the name of the template function * @param string $function_impl the name of the PHP function to register * @param bool $cacheable * @param mixed $cache_attrs * * @throws \SmartyException */ public function register_function($function, $function_impl, $cacheable = true, $cache_attrs = null) { $this->registerPlugin('function', $function, $function_impl, $cacheable, $cache_attrs); } /** * Unregister custom function * * @param string $function name of template function */ public function unregister_function($function) { $this->unregisterPlugin('function', $function); } /** * Registers object to be used in templates * * @param string $object name of template object * @param object $object_impl the referenced PHP object to register * @param array $allowed list of allowed methods (empty = all) * @param boolean $smarty_args smarty argument format, else traditional * @param array $block_methods list of methods that are block format * * @throws SmartyException * @internal param array $block_functs list of methods that are block format */ public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) { settype($allowed, 'array'); settype($smarty_args, 'boolean'); $this->registerObject($object, $object_impl, $allowed, $smarty_args, $block_methods); } /** * Unregister object * * @param string $object name of template object */ public function unregister_object($object) { $this->unregisterObject($object); } /** * Registers block function to be used in templates * * @param string $block name of template block * @param string $block_impl PHP function to register * @param bool $cacheable * @param mixed $cache_attrs * * @throws \SmartyException */ public function register_block($block, $block_impl, $cacheable = true, $cache_attrs = null) { $this->registerPlugin('block', $block, $block_impl, $cacheable, $cache_attrs); } /** * Unregister block function * * @param string $block name of template function */ public function unregister_block($block) { $this->unregisterPlugin('block', $block); } /** * Registers compiler function * * @param string $function name of template function * @param string $function_impl name of PHP function to register * @param bool $cacheable * * @throws \SmartyException */ public function register_compiler_function($function, $function_impl, $cacheable = true) { $this->registerPlugin('compiler', $function, $function_impl, $cacheable); } /** * Unregister compiler function * * @param string $function name of template function */ public function unregister_compiler_function($function) { $this->unregisterPlugin('compiler', $function); } /** * Registers modifier to be used in templates * * @param string $modifier name of template modifier * @param string $modifier_impl name of PHP function to register * * @throws \SmartyException */ public function register_modifier($modifier, $modifier_impl) { $this->registerPlugin('modifier', $modifier, $modifier_impl); } /** * Unregister modifier * * @param string $modifier name of template modifier */ public function unregister_modifier($modifier) { $this->unregisterPlugin('modifier', $modifier); } /** * Registers a resource to fetch a template * * @param string $type name of resource * @param array $functions array of functions to handle resource */ public function register_resource($type, $functions) { $this->registerResource($type, $functions); } /** * Unregister a resource * * @param string $type name of resource */ public function unregister_resource($type) { $this->unregisterResource($type); } /** * Registers a prefilter function to apply * to a template before compiling * * @param callable $function * * @throws \SmartyException */ public function register_prefilter($function) { $this->registerFilter('pre', $function); } /** * Unregister a prefilter function * * @param callable $function */ public function unregister_prefilter($function) { $this->unregisterFilter('pre', $function); } /** * Registers a postfilter function to apply * to a compiled template after compilation * * @param callable $function * * @throws \SmartyException */ public function register_postfilter($function) { $this->registerFilter('post', $function); } /** * Unregister a postfilter function * * @param callable $function */ public function unregister_postfilter($function) { $this->unregisterFilter('post', $function); } /** * Registers an output filter function to apply * to a template output * * @param callable $function * * @throws \SmartyException */ public function register_outputfilter($function) { $this->registerFilter('output', $function); } /** * Unregister an outputfilter function * * @param callable $function */ public function unregister_outputfilter($function) { $this->unregisterFilter('output', $function); } /** * load a filter of specified type and name * * @param string $type filter type * @param string $name filter name * * @throws \SmartyException */ public function load_filter($type, $name) { $this->loadFilter($type, $name); } /** * clear cached content for the given template and cache id * * @param string $tpl_file name of template file * @param string $cache_id name of cache_id * @param string $compile_id name of compile_id * @param string $exp_time expiration time * * @return boolean */ public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) { return $this->clearCache($tpl_file, $cache_id, $compile_id, $exp_time); } /** * clear the entire contents of cache (all templates) * * @param string $exp_time expire time * * @return boolean */ public function clear_all_cache($exp_time = null) { return $this->clearCache(null, null, null, $exp_time); } /** * test to see if valid cache exists for this template * * @param string $tpl_file name of template file * @param string $cache_id * @param string $compile_id * * @return bool * @throws \Exception * @throws \SmartyException */ public function is_cached($tpl_file, $cache_id = null, $compile_id = null) { return $this->isCached($tpl_file, $cache_id, $compile_id); } /** * clear all the assigned template variables. */ public function clear_all_assign() { $this->clearAllAssign(); } /** * clears compiled version of specified template resource, * or all compiled template files if one is not specified. * This function is for advanced use only, not normally needed. * * @param string $tpl_file * @param string $compile_id * @param string $exp_time * * @return boolean results of {@link smarty_core_rm_auto()} */ public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) { return $this->clearCompiledTemplate($tpl_file, $compile_id, $exp_time); } /** * Checks whether requested template exists. * * @param string $tpl_file * * @return bool * @throws \SmartyException */ public function template_exists($tpl_file) { return $this->templateExists($tpl_file); } /** * Returns an array containing template variables * * @param string $name * * @return array */ public function get_template_vars($name = null) { return $this->getTemplateVars($name); } /** * Returns an array containing config variables * * @param string $name * * @return array */ public function get_config_vars($name = null) { return $this->getConfigVars($name); } /** * load configuration values * * @param string $file * @param string $section * @param string $scope */ public function config_load($file, $section = null, $scope = 'global') { $this->ConfigLoad($file, $section, $scope); } /** * return a reference to a registered object * * @param string $name * * @return object */ public function get_registered_object($name) { return $this->getRegisteredObject($name); } /** * clear configuration values * * @param string $var */ public function clear_config($var = null) { $this->clearConfig($var); } /** * trigger Smarty error * * @param string $error_msg * @param integer $error_type */ public function trigger_error($error_msg, $error_type = E_USER_WARNING) { trigger_error("Smarty error: $error_msg", $error_type); } } ================================================ FILE: Extend/Package/smarty/bootstrap.php ================================================ */ function smarty_block_textformat($params, $content, $template, &$repeat) { static $mb_wordwrap_loaded = false; if (is_null($content)) { return; } if (Smarty::$_MBSTRING && !$mb_wordwrap_loaded) { if (!is_callable('smarty_modifier_mb_wordwrap')) { require_once(SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'); } $mb_wordwrap_loaded = true; } $style = null; $indent = 0; $indent_first = 0; $indent_char = ' '; $wrap = 80; $wrap_char = "\n"; $wrap_cut = false; $assign = null; foreach ($params as $_key => $_val) { switch ($_key) { case 'style': case 'indent_char': case 'wrap_char': case 'assign': $$_key = (string) $_val; break; case 'indent': case 'indent_first': case 'wrap': $$_key = (int) $_val; break; case 'wrap_cut': $$_key = (bool) $_val; break; default: trigger_error("textformat: unknown attribute '{$_key}'"); } } if ($style === 'email') { $wrap = 72; } // split into paragraphs $_paragraphs = preg_split('![\r\n]{2}!', $content); foreach ($_paragraphs as &$_paragraph) { if (!$_paragraph) { continue; } // convert mult. spaces & special chars to single space $_paragraph = preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), array(' ', ''), $_paragraph); // indent first line if ($indent_first > 0) { $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; } // wordwrap sentences if (Smarty::$_MBSTRING) { $_paragraph = smarty_modifier_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); } else { $_paragraph = wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); } // indent lines if ($indent > 0) { $_paragraph = preg_replace('!^!m', str_repeat($indent_char, $indent), $_paragraph); } } $_output = implode($wrap_char . $wrap_char, $_paragraphs); if ($assign) { $template->assign($assign, $_output); } else { return $_output; } } ================================================ FILE: Extend/Package/smarty/plugins/function.counter.php ================================================ * @link http://www.smarty.net/manual/en/language.function.counter.php {counter} * (Smarty online manual) * * @param array $params parameters * @param Smarty_Internal_Template $template template object * * @return string|null */ function smarty_function_counter($params, $template) { static $counters = array(); $name = (isset($params[ 'name' ])) ? $params[ 'name' ] : 'default'; if (!isset($counters[ $name ])) { $counters[ $name ] = array('start' => 1, 'skip' => 1, 'direction' => 'up', 'count' => 1); } $counter =& $counters[ $name ]; if (isset($params[ 'start' ])) { $counter[ 'start' ] = $counter[ 'count' ] = (int) $params[ 'start' ]; } if (!empty($params[ 'assign' ])) { $counter[ 'assign' ] = $params[ 'assign' ]; } if (isset($counter[ 'assign' ])) { $template->assign($counter[ 'assign' ], $counter[ 'count' ]); } if (isset($params[ 'print' ])) { $print = (bool) $params[ 'print' ]; } else { $print = empty($counter[ 'assign' ]); } if ($print) { $retval = $counter[ 'count' ]; } else { $retval = null; } if (isset($params[ 'skip' ])) { $counter[ 'skip' ] = $params[ 'skip' ]; } if (isset($params[ 'direction' ])) { $counter[ 'direction' ] = $params[ 'direction' ]; } if ($counter[ 'direction' ] === 'down') { $counter[ 'count' ] -= $counter[ 'skip' ]; } else { $counter[ 'count' ] += $counter[ 'skip' ]; } return $retval; } ================================================ FILE: Extend/Package/smarty/plugins/function.cycle.php ================================================ * @author credit to Mark Priatel * @author credit to Gerard * @author credit to Jason Sweat * @version 1.3 * * @param array $params parameters * @param Smarty_Internal_Template $template template object * * @return string|null */ function smarty_function_cycle($params, $template) { static $cycle_vars; $name = (empty($params[ 'name' ])) ? 'default' : $params[ 'name' ]; $print = (isset($params[ 'print' ])) ? (bool) $params[ 'print' ] : true; $advance = (isset($params[ 'advance' ])) ? (bool) $params[ 'advance' ] : true; $reset = (isset($params[ 'reset' ])) ? (bool) $params[ 'reset' ] : false; if (!isset($params[ 'values' ])) { if (!isset($cycle_vars[ $name ][ 'values' ])) { trigger_error('cycle: missing \'values\' parameter'); return; } } else { if (isset($cycle_vars[ $name ][ 'values' ]) && $cycle_vars[ $name ][ 'values' ] !== $params[ 'values' ]) { $cycle_vars[ $name ][ 'index' ] = 0; } $cycle_vars[ $name ][ 'values' ] = $params[ 'values' ]; } if (isset($params[ 'delimiter' ])) { $cycle_vars[ $name ][ 'delimiter' ] = $params[ 'delimiter' ]; } elseif (!isset($cycle_vars[ $name ][ 'delimiter' ])) { $cycle_vars[ $name ][ 'delimiter' ] = ','; } if (is_array($cycle_vars[ $name ][ 'values' ])) { $cycle_array = $cycle_vars[ $name ][ 'values' ]; } else { $cycle_array = explode($cycle_vars[ $name ][ 'delimiter' ], $cycle_vars[ $name ][ 'values' ]); } if (!isset($cycle_vars[ $name ][ 'index' ]) || $reset) { $cycle_vars[ $name ][ 'index' ] = 0; } if (isset($params[ 'assign' ])) { $print = false; $template->assign($params[ 'assign' ], $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]); } if ($print) { $retval = $cycle_array[ $cycle_vars[ $name ][ 'index' ] ]; } else { $retval = null; } if ($advance) { if ($cycle_vars[ $name ][ 'index' ] >= count($cycle_array) - 1) { $cycle_vars[ $name ][ 'index' ] = 0; } else { $cycle_vars[ $name ][ 'index' ] ++; } } return $retval; } ================================================ FILE: Extend/Package/smarty/plugins/function.fetch.php ================================================ * * @param array $params parameters * @param Smarty_Internal_Template $template template object * * @throws SmartyException * @return string|null if the assign parameter is passed, Smarty assigns the result to a template variable */ function smarty_function_fetch($params, $template) { if (empty($params[ 'file' ])) { trigger_error('[plugin] fetch parameter \'file\' cannot be empty', E_USER_NOTICE); return; } // strip file protocol if (stripos($params[ 'file' ], 'file://') === 0) { $params[ 'file' ] = substr($params[ 'file' ], 7); } $protocol = strpos($params[ 'file' ], '://'); if ($protocol !== false) { $protocol = strtolower(substr($params[ 'file' ], 0, $protocol)); } if (isset($template->smarty->security_policy)) { if ($protocol) { // remote resource (or php stream, …) if (!$template->smarty->security_policy->isTrustedUri($params[ 'file' ])) { return; } } else { // local file if (!$template->smarty->security_policy->isTrustedResourceDir($params[ 'file' ])) { return; } } } $content = ''; if ($protocol === 'http') { // http fetch if ($uri_parts = parse_url($params[ 'file' ])) { // set defaults $host = $server_name = $uri_parts[ 'host' ]; $timeout = 30; $accept = 'image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*'; $agent = 'Smarty Template Engine ' . Smarty::SMARTY_VERSION; $referer = ''; $uri = !empty($uri_parts[ 'path' ]) ? $uri_parts[ 'path' ] : '/'; $uri .= !empty($uri_parts[ 'query' ]) ? '?' . $uri_parts[ 'query' ] : ''; $_is_proxy = false; if (empty($uri_parts[ 'port' ])) { $port = 80; } else { $port = $uri_parts[ 'port' ]; } if (!empty($uri_parts[ 'user' ])) { $user = $uri_parts[ 'user' ]; } if (!empty($uri_parts[ 'pass' ])) { $pass = $uri_parts[ 'pass' ]; } // loop through parameters, setup headers foreach ($params as $param_key => $param_value) { switch ($param_key) { case 'file': case 'assign': case 'assign_headers': break; case 'user': if (!empty($param_value)) { $user = $param_value; } break; case 'pass': if (!empty($param_value)) { $pass = $param_value; } break; case 'accept': if (!empty($param_value)) { $accept = $param_value; } break; case 'header': if (!empty($param_value)) { if (!preg_match('![\w\d-]+: .+!', $param_value)) { trigger_error("[plugin] invalid header format '{$param_value}'", E_USER_NOTICE); return; } else { $extra_headers[] = $param_value; } } break; case 'proxy_host': if (!empty($param_value)) { $proxy_host = $param_value; } break; case 'proxy_port': if (!preg_match('!\D!', $param_value)) { $proxy_port = (int) $param_value; } else { trigger_error("[plugin] invalid value for attribute '{$param_key }'", E_USER_NOTICE); return; } break; case 'agent': if (!empty($param_value)) { $agent = $param_value; } break; case 'referer': if (!empty($param_value)) { $referer = $param_value; } break; case 'timeout': if (!preg_match('!\D!', $param_value)) { $timeout = (int) $param_value; } else { trigger_error("[plugin] invalid value for attribute '{$param_key}'", E_USER_NOTICE); return; } break; default: trigger_error("[plugin] unrecognized attribute '{$param_key}'", E_USER_NOTICE); return; } } if (!empty($proxy_host) && !empty($proxy_port)) { $_is_proxy = true; $fp = fsockopen($proxy_host, $proxy_port, $errno, $errstr, $timeout); } else { $fp = fsockopen($server_name, $port, $errno, $errstr, $timeout); } if (!$fp) { trigger_error("[plugin] unable to fetch: $errstr ($errno)", E_USER_NOTICE); return; } else { if ($_is_proxy) { fputs($fp, 'GET ' . $params[ 'file' ] . " HTTP/1.0\r\n"); } else { fputs($fp, "GET $uri HTTP/1.0\r\n"); } if (!empty($host)) { fputs($fp, "Host: $host\r\n"); } if (!empty($accept)) { fputs($fp, "Accept: $accept\r\n"); } if (!empty($agent)) { fputs($fp, "User-Agent: $agent\r\n"); } if (!empty($referer)) { fputs($fp, "Referer: $referer\r\n"); } if (isset($extra_headers) && is_array($extra_headers)) { foreach ($extra_headers as $curr_header) { fputs($fp, $curr_header . "\r\n"); } } if (!empty($user) && !empty($pass)) { fputs($fp, 'Authorization: BASIC ' . base64_encode("$user:$pass") . "\r\n"); } fputs($fp, "\r\n"); while (!feof($fp)) { $content .= fgets($fp, 4096); } fclose($fp); $csplit = preg_split("!\r\n\r\n!", $content, 2); $content = $csplit[ 1 ]; if (!empty($params[ 'assign_headers' ])) { $template->assign($params[ 'assign_headers' ], preg_split("!\r\n!", $csplit[ 0 ])); } } } else { trigger_error("[plugin fetch] unable to parse URL, check syntax", E_USER_NOTICE); return; } } else { $content = @file_get_contents($params[ 'file' ]); if ($content === false) { throw new SmartyException("{fetch} cannot read resource '" . $params[ 'file' ] . "'"); } } if (!empty($params[ 'assign' ])) { $template->assign($params[ 'assign' ], $content); } else { return $content; } } ================================================ FILE: Extend/Package/smarty/plugins/function.html_checkboxes.php ================================================ ' output=$names} * {html_checkboxes values=$ids checked=$checked separator='
' output=$names} * * Params: * * - name (optional) - string default "checkbox" * - values (required) - array * - options (optional) - associative array * - checked (optional) - array default not set * - separator (optional) - ie
or   * - output (optional) - the output next to each checkbox * - assign (optional) - assign the output as an array to this variable * - escape (optional) - escape the content (not value), defaults to true * * * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} * (Smarty online manual) * @author Christopher Kvarme * @author credits to Monte Ohrt * @version 1.0 * * @param array $params parameters * @param object $template template object * * @return string * @uses smarty_function_escape_special_chars() */ function smarty_function_html_checkboxes($params, $template) { if (!isset($template->smarty->_cache[ '_required_sesc' ])) { require_once(SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'); $template->smarty->_cache[ '_required_sesc' ] = true; } $name = 'checkbox'; $values = null; $options = null; $selected = array(); $separator = ''; $escape = true; $labels = true; $label_ids = false; $output = null; $extra = ''; foreach ($params as $_key => $_val) { switch ($_key) { case 'name': case 'separator': $$_key = (string) $_val; break; case 'escape': case 'labels': case 'label_ids': $$_key = (bool) $_val; break; case 'options': $$_key = (array) $_val; break; case 'values': case 'output': $$_key = array_values((array) $_val); break; case 'checked': case 'selected': if (is_array($_val)) { $selected = array(); foreach ($_val as $_sel) { if (is_object($_sel)) { if (method_exists($_sel, '__toString')) { $_sel = smarty_function_escape_special_chars((string) $_sel->__toString()); } else { trigger_error('html_checkboxes: selected attribute contains an object of class \'' . get_class($_sel) . '\' without __toString() method', E_USER_NOTICE); continue; } } else { $_sel = smarty_function_escape_special_chars((string) $_sel); } $selected[ $_sel ] = true; } } elseif (is_object($_val)) { if (method_exists($_val, '__toString')) { $selected = smarty_function_escape_special_chars((string) $_val->__toString()); } else { trigger_error('html_checkboxes: selected attribute is an object of class \'' . get_class($_val) . '\' without __toString() method', E_USER_NOTICE); } } else { $selected = smarty_function_escape_special_chars((string) $_val); } break; case 'checkboxes': trigger_error('html_checkboxes: the use of the "checkboxes" attribute is deprecated, use "options" instead', E_USER_WARNING); $options = (array) $_val; break; case 'assign': break; case 'strict': break; case 'disabled': case 'readonly': if (!empty($params[ 'strict' ])) { if (!is_scalar($_val)) { trigger_error("html_options: {$_key} attribute must be a scalar, only boolean true or string '{$_key}' will actually add the attribute", E_USER_NOTICE); } if ($_val === true || $_val === $_key) { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; } break; } // omit break; to fall through! default: if (!is_array($_val)) { $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_val) . '"'; } else { trigger_error("html_checkboxes: extra attribute '{$_key}' cannot be an array", E_USER_NOTICE); } break; } } if (!isset($options) && !isset($values)) { return ''; } /* raise error here? */ $_html_result = array(); if (isset($options)) { foreach ($options as $_key => $_val) { $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); } } else { foreach ($values as $_i => $_key) { $_val = isset($output[ $_i ]) ? $output[ $_i ] : ''; $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); } } if (!empty($params[ 'assign' ])) { $template->assign($params[ 'assign' ], $_html_result); } else { return implode("\n", $_html_result); } } /** * @param $name * @param $value * @param $output * @param $selected * @param $extra * @param $separator * @param $labels * @param $label_ids * @param bool $escape * * @return string */ function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape = true) { $_output = ''; if (is_object($value)) { if (method_exists($value, '__toString')) { $value = (string) $value->__toString(); } else { trigger_error('html_options: value is an object of class \'' . get_class($value) . '\' without __toString() method', E_USER_NOTICE); return ''; } } else { $value = (string) $value; } if (is_object($output)) { if (method_exists($output, '__toString')) { $output = (string) $output->__toString(); } else { trigger_error('html_options: output is an object of class \'' . get_class($output) . '\' without __toString() method', E_USER_NOTICE); return ''; } } else { $output = (string) $output; } if ($labels) { if ($label_ids) { $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); $_output .= '