diff --git a/www/admin/class_test.smarty4.php b/www/admin/class_test.smarty4.php
new file mode 100644
index 00000000..d413f5c4
--- /dev/null
+++ b/www/admin/class_test.smarty4.php
@@ -0,0 +1,107 @@
+ BASE . LOG,
+ 'file_id' => $LOG_FILE_ID,
+ // add file date
+ 'print_file_date' => true,
+ // set debug and print flags
+ 'debug_all' => $DEBUG_ALL ?? false,
+ 'echo_all' => $ECHO_ALL ?? false,
+ 'print_all' => $PRINT_ALL ?? false,
+]);
+$basic = new CoreLibs\Basic($log);
+$smarty = new CoreLibs\Template\SmartyExtend4();
+// for testing with or without CMS
+// $cms = new CoreLibs\Admin\Backend(DB_CONFIG);
+$l = new CoreLibs\Language\L10n($lang);
+
+print "
TEST CLASS: SMARTY";
+print "";
+print '';
+
+$smarty->DATA['JS_DEBUG'] = DEBUG;
+$smarty->MASTER_TEMPLATE_NAME = 'main_body4.tpl';
+$smarty->TEMPLATE_NAME = 'smarty_test4.tpl';
+$smarty->CSS_SPECIAL_TEMPLATE_NAME = 'smart_test.css';
+$smarty->USE_PROTOTYPE = false;
+$smarty->USE_JQUERY = true;
+$smarty->JS_DATEPICKR = false;
+if ($smarty->USE_PROTOTYPE) {
+ $smarty->ADMIN_JAVASCRIPT = 'edit.pt.js';
+ $smarty->JS_SPECIAL_TEMPLATE_NAME = 'prototype.test.js';
+} elseif ($smarty->USE_JQUERY) {
+ $smarty->ADMIN_JAVASCRIPT = 'edit.jq.js';
+ $smarty->JS_SPECIAL_TEMPLATE_NAME = 'jquery.test.js';
+}
+$smarty->PAGE_WIDTH = '100%';
+// require BASE.INCLUDES.'admin_set_paths.php';
+$smarty->setSmartyPaths();
+
+// smarty test
+$smarty->DATA['SMARTY_TEST'] = 'Test Data';
+$smarty->DATA['TRANSLATE_TEST'] = $l->__('Are we translated?');
+$smarty->DATA['TRANSLATE_TEST_SMARTY'] = $smarty->l10n->__('Are we translated?');
+
+// drop down test with optgroups
+$options = [
+ '' => '選択してください',
+ '4/25(木)' => [
+ '4/25(木) 11:00-11:50' => '4/25(木) 11:00-11:50',
+ '4/25(木) 12:20-13:00' => '4/25(木) 12:20-13:00'
+ ],
+ '4/26(金)' => [
+ '4/26(金) 11:00-11:50' => '4/26(金) 11:00-11:50',
+ '4/26(金) 12:20-13:00' => '4/26(金) 12:20-13:00'
+ ],
+ '4/27(土)' => [
+ '4/27(土) 11:00-11:50' => '4/27(土) 11:00-11:50',
+ '4/27(土) 12:20-13:00' => '4/27(土) 12:20-13:00'
+ ],
+];
+
+$smarty->DATA['drop_down_test'] = $options;
+$smarty->DATA['drop_down_test_selected'] = '';
+$smarty->DATA['loop_start'] = 2;
+// require BASE.INCLUDES.'admin_smarty.php';
+$smarty->setSmartyVarsAdmin();
+
+// error message
+print $log->printErrorMsg();
+
+print "";
+
+// __END__
diff --git a/www/includes/templates/admin/main_body4.tpl b/www/includes/templates/admin/main_body4.tpl
new file mode 100644
index 00000000..25b52eed
--- /dev/null
+++ b/www/includes/templates/admin/main_body4.tpl
@@ -0,0 +1,156 @@
+{*
+ ********************************************************************
+ * AUTHOR: Clemens Schwaighofer
+ * DATE: 2005/06/23
+ * DESCRIPTION:
+ * edit body part
+ * HISTORY:
+ ********************************************************************
+*}
+
+
+
+ {$HTML_TITLE}
+
+ {if $STYLESHEET}
+
+ {/if}
+ {if $CSS_INCLUDE}
+
+ {/if}
+ {if $CSS_SPECIAL_INCLUDE}
+
+ {/if}
+
+
+
+ {if $USE_JQUERY}
+
+
+ {/if}
+ {if $USE_PROTOTYPE}
+
+ {if $USE_SCRIPTACULOUS}
+
+ {/if}
+ {/if}
+ {* for including datepickr or flatpickr *}
+ {if $JS_DATEPICKR}
+
+
+
+ {/if}
+ {if $JS_FLATPICKR}
+
+
+
+ {/if}
+ {if $JAVASCRIPT}
+
+ {/if}
+ {* declare prototype everywhere *}
+ {if $JS_INCLUDE}
+
+ {/if}
+ {if $JS_SPECIAL_INCLUDE}
+
+ {/if}
+ {if $USE_TINY_MCE}
+
+
+
+
+ {/if}
+
+
+{* {popup_init src="`$js`/overlib/overlib.js"} *}
+
+{* error/warning *}
+{if $messages}
+
+ {foreach from=$messages item=item key=key}
+
{$item.msg}
+ {/foreach}
+
+{/if}
+{include file="$TEMPLATE_NAME"}
+
+{* debug info *}
+{if $DEBUG}
+
+{$Id}
+ {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
+{$debug_error_msg}
+
+{/if}
+
+
+
diff --git a/www/includes/templates/admin/smarty_test4.tpl b/www/includes/templates/admin/smarty_test4.tpl
new file mode 100755
index 00000000..f9300036
--- /dev/null
+++ b/www/includes/templates/admin/smarty_test4.tpl
@@ -0,0 +1,37 @@
+
+ {$SMARTY_TEST}
+
+
+ TRANSLATION CLASS (OUT): {$TRANSLATE_TEST}
+
+
+ TRANSLATION CLASS (SMARTY): {$TRANSLATE_TEST_SMARTY}
+
+
+
+
+
+
+
+ Some content here or asdfasdfasf
+
+
+ {* TRANSLATION SMARTY: {t}I should be translated{/t} *}
+ TRANSLATION SMARTY: I should be translated
+
+
+
+
+
LOOP TEST
+{section name=page_list start=1 loop=$loop_start+1}
+
LOOP OUTPUT: {$smarty.section.page_list.index}
+{/section}
+
+{* progresss indicator *}
+
+{* the action confirm box *}
+
+{* The Overlay box *}
+
diff --git a/www/lib/CoreLibs/Template/SmartyExtend4.php b/www/lib/CoreLibs/Template/SmartyExtend4.php
new file mode 100644
index 00000000..ca587b75
--- /dev/null
+++ b/www/lib/CoreLibs/Template/SmartyExtend4.php
@@ -0,0 +1,533 @@
+ */
+ public $HEADER = [];
+ /** @var array */
+ public $DATA = [];
+ /** @var array */
+ public $DEBUG_DATA = [];
+ /** @var array */
+ private $CONTENT_DATA = [];
+ // control vars
+ /** @var bool */
+ public $USE_PROTOTYPE = USE_PROTOTYPE;
+ /** @var bool */
+ public $USE_JQUERY = USE_JQUERY;
+ /** @var bool */
+ public $USE_SCRIPTACULOUS = USE_SCRIPTACULOUS;
+ // sub content input vars
+ /** @var bool */
+ public $USE_TINY_MCE = false;
+ /** @var bool */
+ public $JS_DATEPICKR = false;
+ /** @var bool */
+ public $JS_FLATPICKR = false;
+ /** @var bool */
+ public $JS_FILE_UPLOADER = false;
+ /** @var bool */
+ public $DEBUG_TMPL = false;
+ /** @var bool */
+ public $USE_INCLUDE_TEMPLATE = false;
+ // cache & compile
+ /** @var string */
+ public $CACHE_ID = '';
+ /** @var string */
+ public $COMPILE_ID = '';
+ // template vars
+ /** @var string */
+ public $MASTER_TEMPLATE_NAME;
+ /** @var string */
+ public $PAGE_FILE_NAME;
+ /** @var string */
+ public $CONTENT_INCLUDE;
+ /** @var string */
+ public $FORM_NAME;
+ /** @var string */
+ public $FORM_ACTION;
+ /** @var string */
+ public $L_TITLE;
+ /** @var string|int */
+ public $PAGE_WIDTH;
+ // smarty include/set var
+ /** @var string */
+ public $TEMPLATE_PATH;
+ /** @var string */
+ public $TEMPLATE_NAME;
+ /** @var string */
+ public $INC_TEMPLATE_NAME;
+ /** @var string */
+ public $JS_TEMPLATE_NAME;
+ /** @var string */
+ public $CSS_TEMPLATE_NAME;
+ /** @var string|null */
+ public $TEMPLATE_TRANSLATE;
+ // core group
+ /** @var string */
+ public $JS_CORE_TEMPLATE_NAME;
+ /** @var string */
+ public $CSS_CORE_TEMPLATE_NAME;
+ /** @var string */
+ public $JS_CORE_INCLUDE;
+ /** @var string */
+ public $CSS_CORE_INCLUDE;
+ // local names
+ /** @var string */
+ public $JS_SPECIAL_TEMPLATE_NAME = '';
+ /** @var string */
+ public $CSS_SPECIAL_TEMPLATE_NAME = '';
+ /** @var string */
+ public $JS_INCLUDE;
+ /** @var string */
+ public $CSS_INCLUDE;
+ /** @var string */
+ public $JS_SPECIAL_INCLUDE;
+ /** @var string */
+ public $CSS_SPECIAL_INCLUDE;
+ /** @var string */
+ public $ADMIN_JAVASCRIPT;
+ /** @var string */
+ public $ADMIN_STYLESHEET;
+ /** @var string */
+ public $FRONTEND_JAVASCRIPT;
+ /** @var string */
+ public $FRONTEND_STYLESHEET;
+ // other smarty folder vars
+ /** @var string */
+ public $INCLUDES;
+ /** @var string */
+ public $JAVASCRIPT;
+ /** @var string */
+ public $CSS;
+ /** @var string */
+ public $FONT;
+ /** @var string */
+ public $PICTURES;
+ /** @var string */
+ public $CACHE_PICTURES;
+ /** @var string */
+ public $CACHE_PICTURES_ROOT;
+
+ // constructor class, just sets the language stuff
+ /**
+ * constructor class, just sets the language stuff
+ * calls L10 for pass on internaly in smarty
+ * also registers the getvar caller plugin
+ */
+ public function __construct()
+ {
+ // call basic smarty
+ parent::__construct();
+ // set lang vars
+ $this->setLangEncoding();
+ // iinit lang
+ $this->l10n = new \CoreLibs\Language\L10n($this->lang);
+ /** @phpstan-ignore-next-line */
+ $this->registerPlugin('modifier', 'getvar', [&$this, 'get_template_vars']);
+
+ $this->page_name = pathinfo($_SERVER["PHP_SELF"])['basename'];
+
+ // set internal settings
+ $this->CACHE_ID = defined('CACHE_ID') ? CACHE_ID : '';
+ $this->COMPILE_ID = defined('COMPILE_ID') ? COMPILE_ID : '';
+ }
+
+ /**
+ * ORIGINAL in \CoreLibs\Admin\Backend
+ * set the language encoding and language settings
+ * the default charset from _SESSION login or from
+ * config DEFAULT ENCODING
+ * the lang full name for mo loading from _SESSION login
+ * or SITE LANG or DEFAULT LANG from config
+ * creates short lang (only first two chars) from the lang
+ * @return void
+ */
+ private function setLangEncoding(): void
+ {
+ // just emergency fallback for language
+ // set encoding
+ if (isset($_SESSION['DEFAULT_CHARSET'])) {
+ $this->encoding = $_SESSION['DEFAULT_CHARSET'];
+ } else {
+ $this->encoding = DEFAULT_ENCODING;
+ }
+ // gobal override
+ if (isset($GLOBALS['OVERRIDE_LANG'])) {
+ $this->lang = $GLOBALS['OVERRIDE_LANG'];
+ } elseif (isset($_SESSION['DEFAULT_LANG'])) {
+ // session (login)
+ $this->lang = $_SESSION['DEFAULT_LANG'];
+ } else {
+ // mostly default SITE LANG or DEFAULT LANG
+ $this->lang = defined('SITE_LANG') ? SITE_LANG : DEFAULT_LANG;
+ }
+ // create the char lang encoding
+ $this->lang_short = substr($this->lang, 0, 2);
+ // set the language folder
+ $this->lang_dir = BASE . INCLUDES . LANG . CONTENT_PATH;
+ }
+
+ /**
+ * @return void
+ */
+ private function setSmartCoreIncludeCssJs(): void
+ {
+ // core CS
+ $this->CSS_CORE_INCLUDE = '';
+ if (
+ file_exists($this->CSS . $this->CSS_CORE_TEMPLATE_NAME) &&
+ is_file($this->CSS . $this->CSS_CORE_TEMPLATE_NAME)
+ ) {
+ $this->CSS_CORE_INCLUDE = $this->CSS . $this->CSS_CORE_TEMPLATE_NAME;
+ }
+ // core JS
+ $this->JS_CORE_INCLUDE = '';
+ if (
+ file_exists($this->JAVASCRIPT . $this->JS_CORE_TEMPLATE_NAME) &&
+ is_file($this->JAVASCRIPT . $this->JS_CORE_TEMPLATE_NAME)
+ ) {
+ $this->JS_CORE_INCLUDE = $this->JAVASCRIPT . $this->JS_CORE_TEMPLATE_NAME;
+ }
+ // additional per page Javascript include
+ $this->JS_INCLUDE = '';
+ if (
+ file_exists($this->JAVASCRIPT . $this->JS_TEMPLATE_NAME) &&
+ is_file($this->JAVASCRIPT . $this->JS_TEMPLATE_NAME)
+ ) {
+ $this->JS_INCLUDE = $this->JAVASCRIPT . $this->JS_TEMPLATE_NAME;
+ }
+ // per page css file
+ $this->CSS_INCLUDE = '';
+ if (
+ file_exists($this->CSS . $this->CSS_TEMPLATE_NAME) &&
+ is_file($this->CSS . $this->CSS_TEMPLATE_NAME)
+ ) {
+ $this->CSS_INCLUDE = $this->CSS . $this->CSS_TEMPLATE_NAME;
+ }
+ // optional CSS file
+ $this->CSS_SPECIAL_INCLUDE = '';
+ if (
+ file_exists($this->CSS . $this->CSS_SPECIAL_TEMPLATE_NAME) &&
+ is_file($this->CSS . $this->CSS_SPECIAL_TEMPLATE_NAME)
+ ) {
+ $this->CSS_SPECIAL_INCLUDE = $this->CSS . $this->CSS_SPECIAL_TEMPLATE_NAME;
+ }
+ // optional JS file
+ $this->JS_SPECIAL_INCLUDE = '';
+ if (
+ file_exists($this->JAVASCRIPT . $this->JS_SPECIAL_TEMPLATE_NAME) &&
+ is_file($this->JAVASCRIPT . $this->JS_SPECIAL_TEMPLATE_NAME)
+ ) {
+ $this->JS_SPECIAL_INCLUDE = $this->JAVASCRIPT . $this->JS_SPECIAL_TEMPLATE_NAME;
+ }
+ }
+
+
+ /**
+ * sets all internal paths and names that need to be passed on to the smarty template
+ * @return void
+ */
+ public function setSmartyPaths(): void
+ {
+ // master template
+ if (empty($this->MASTER_TEMPLATE_NAME)) {
+ $this->MASTER_TEMPLATE_NAME = MASTER_TEMPLATE_NAME;
+ }
+
+ // set include & template names
+ if (empty($this->CONTENT_INCLUDE)) {
+ $this->CONTENT_INCLUDE = str_replace('.php', '', $this->page_name) . '.tpl';
+ }
+ // strip tpl and replace it with php
+ // php include file per page
+ $this->INC_TEMPLATE_NAME = str_replace('.tpl', '.php', $this->CONTENT_INCLUDE);
+ // javascript include per page
+ $this->JS_TEMPLATE_NAME = str_replace('.tpl', '.js', $this->CONTENT_INCLUDE);
+ // css per page
+ $this->CSS_TEMPLATE_NAME = str_replace('.tpl', '.css', $this->CONTENT_INCLUDE);
+
+ // set basic template path (tmp)
+ $this->INCLUDES = BASE . INCLUDES; // no longer in templates, only global
+ $this->TEMPLATE_PATH = BASE . INCLUDES . TEMPLATES . CONTENT_PATH;
+ $this->setTemplateDir($this->TEMPLATE_PATH);
+ $this->JAVASCRIPT = LAYOUT . JS;
+ $this->CSS = LAYOUT . CSS;
+ $this->FONT = LAYOUT . FONT;
+ $this->PICTURES = LAYOUT . IMAGES;
+ $this->CACHE_PICTURES = LAYOUT . CACHE;
+ $this->CACHE_PICTURES_ROOT = ROOT . $this->CACHE_PICTURES;
+ // check if we have an external file with the template name
+ if (
+ file_exists($this->INCLUDES . $this->INC_TEMPLATE_NAME) &&
+ is_file($this->INCLUDES . $this->INC_TEMPLATE_NAME)
+ ) {
+ include($this->INCLUDES . $this->INC_TEMPLATE_NAME);
+ }
+ // check for template include
+ if (
+ $this->USE_INCLUDE_TEMPLATE === true &&
+ !$this->TEMPLATE_NAME
+ ) {
+ $this->TEMPLATE_NAME = $this->CONTENT_INCLUDE;
+ // add to cache & compile id
+ $this->COMPILE_ID .= '_' . $this->TEMPLATE_NAME;
+ $this->CACHE_ID .= '_' . $this->TEMPLATE_NAME;
+ }
+ // set all the additional CSS/JS parths
+ $this->setSmartCoreIncludeCssJs();
+ // check if template names exist
+ if (!$this->MASTER_TEMPLATE_NAME) {
+ exit('MASTER TEMPLATE is not set');
+ } elseif (!file_exists($this->getTemplateDir()[0] . DS . $this->MASTER_TEMPLATE_NAME)) {
+ // abort if master template could not be found
+ exit('MASTER TEMPLATE: ' . $this->MASTER_TEMPLATE_NAME . ' could not be found');
+ }
+ if (
+ $this->TEMPLATE_NAME &&
+ !file_exists($this->getTemplateDir()[0] . DS . $this->TEMPLATE_NAME)
+ ) {
+ exit('INCLUDE TEMPLATE: ' . $this->TEMPLATE_NAME . ' could not be found');
+ }
+ // javascript translate data as template for auto translate
+ if (empty($this->TEMPLATE_TRANSLATE)) {
+ $this->TEMPLATE_TRANSLATE = 'jsTranslate_' . $this->lang . '.tpl';
+ } else {
+ // we assume we have some fixed set
+ // we must add _<$this->lang>
+ // if .tpl, put before .tpl
+ // if not .tpl, add _<$this->lang>.tpl
+ if (strpos($this->TEMPLATE_TRANSLATE, '.tpl')) {
+ $this->TEMPLATE_TRANSLATE = str_replace('.tpl', '_' . $this->lang . '.tpl', $this->TEMPLATE_TRANSLATE);
+ } else {
+ $this->TEMPLATE_TRANSLATE .= '_' . $this->lang . '.tpl';
+ }
+ }
+ // if we can't find it, dump it
+ if (!file_exists($this->getTemplateDir()[0] . DS . $this->TEMPLATE_TRANSLATE)) {
+ $this->TEMPLATE_TRANSLATE = null;
+ }
+ }
+
+ /**
+ * wrapper call for setSmartyVars
+ * this is for frontend type and will not set any only admin needed variables
+ * @return void
+ */
+ public function setSmartyVarsFrontend(): void
+ {
+ $this->setSmartyVars();
+ }
+
+ /**
+ * wrapper call for setSmartyVars
+ * this is only for admin interface and will set additional variables
+ */
+ public function setSmartyVarsAdmin(): void
+ {
+ $this->setSmartyVars(true);
+ }
+
+ /**
+ * set smarty pass on variables, sub template names and finally calls the smarty parser
+ * @param boolean $admin_call default false, will set admin only variables
+ * @return void
+ */
+ private function setSmartyVars($admin_call = false): void
+ {
+ /** @var \CoreLibs\Admin\Backend This is an assumption */
+ global $cms;
+ if (is_object($cms)) {
+ $this->mergeCmsSmartyVars($cms);
+ }
+
+ // trigger flags
+ $this->HEADER['USE_PROTOTYPE'] = $this->USE_PROTOTYPE;
+ // scriptacolous, can only be used with prototype
+ if ($this->HEADER['USE_PROTOTYPE']) {
+ $this->HEADER['USE_SCRIPTACULOUS'] = $this->USE_SCRIPTACULOUS;
+ }
+ // jquery and prototype should not be used together
+ $this->HEADER['USE_JQUERY'] = $this->USE_JQUERY;
+
+ // set all the additional CSS/JS parths
+ $this->setSmartCoreIncludeCssJs();
+
+ // the actual include files for javascript (per page)
+ $this->HEADER['JS_CORE_INCLUDE'] = $this->JS_CORE_INCLUDE;
+ $this->HEADER['CSS_CORE_INCLUDE'] = $this->CSS_CORE_INCLUDE;
+ $this->HEADER['JS_INCLUDE'] = $this->JS_INCLUDE;
+ $this->HEADER['CSS_INCLUDE'] = $this->CSS_INCLUDE;
+ $this->HEADER['CSS_SPECIAL_INCLUDE'] = $this->CSS_SPECIAL_INCLUDE;
+ $this->HEADER['JS_SPECIAL_INCLUDE'] = $this->JS_SPECIAL_INCLUDE;
+ // paths to the files
+ $this->DATA['includes'] = $this->INCLUDES;
+ $this->DATA['js'] = $this->JAVASCRIPT;
+ $this->DATA['css'] = $this->CSS;
+ $this->DATA['pictures'] = $this->PICTURES;
+
+ // default CMS settings
+ // define all needed smarty stuff for the general HTML/page building
+ $this->HEADER['CSS'] = CSS;
+ $this->HEADER['FONT'] = FONT;
+ $this->HEADER['JS'] = JS;
+ $this->HEADER['ENCODING'] = $this->encoding;
+ $this->HEADER['DEFAULT_ENCODING'] = DEFAULT_ENCODING;
+
+ // form name
+ $this->DATA['FORM_NAME'] = !$this->FORM_NAME ?
+ str_replace('.php', '', $this->page_name) :
+ $this->FORM_NAME;
+ $this->DATA['FORM_ACTION'] = $this->FORM_ACTION;
+ // special for admin
+ if ($admin_call === true) {
+ // set ACL extra show
+ if (is_object($cms)) {
+ $this->DATA['show_ea_extra'] = $cms->acl['show_ea_extra'] ?? false;
+ $this->DATA['ADMIN'] = $cms->acl['admin'] ?? 0;
+ // top menu
+ $this->DATA['nav_menu'] = $cms->adbTopMenu();
+ $this->DATA['nav_menu_count'] = is_array($this->DATA['nav_menu']) ? count($this->DATA['nav_menu']) : 0;
+ // messages = ['msg' =>, 'class' => 'error/warning/...']
+ $this->DATA['messages'] = $cms->messages;
+ } else { /** @phpstan-ignore-line Because I assume object for phpstan */
+ $this->DATA['show_ea_extra'] = false;
+ $this->DATA['ADMIN'] = 0;
+ $this->DATA['nav_menu'] = [];
+ $this->DATA['nav_menu_count'] = 0;
+ $this->DATA['messages'] = [];
+ }
+ // set style sheets
+ $this->HEADER['STYLESHEET'] = $this->ADMIN_STYLESHEET ? $this->ADMIN_STYLESHEET : ADMIN_STYLESHEET;
+ $this->HEADER['JAVASCRIPT'] = $this->ADMIN_JAVASCRIPT ? $this->ADMIN_JAVASCRIPT : ADMIN_JAVASCRIPT;
+ // the page name
+ $this->DATA['page_name'] = $this->page_name;
+ $this->DATA['table_width'] = empty($this->PAGE_WIDTH) ?: PAGE_WIDTH;
+ $this->DATA['form_name'] = $this->DATA['FORM_NAME'];
+ // for tinymce special
+ $this->DATA['TINYMCE_LANG'] = $this->lang_short;
+ // include flags
+ $this->DATA['USE_TINY_MCE'] = $this->USE_TINY_MCE;
+ // debug data, if DEBUG flag is on, this data is print out
+ $this->DEBUG_DATA['DEBUG'] = $this->DEBUG_TMPL;
+ } else {
+ $this->HEADER['STYLESHEET'] = $this->FRONTEND_STYLESHEET ? $this->FRONTEND_STYLESHEET : STYLESHEET;
+ $this->HEADER['JAVASCRIPT'] = $this->FRONTEND_JAVASCRIPT ? $this->FRONTEND_JAVASCRIPT : JAVASCRIPT;
+ }
+ // html title
+ // set local page title
+ $this->HEADER['HTML_TITLE'] = !$this->L_TITLE ?
+ ucfirst(str_replace('_', ' ', \CoreLibs\Get\System::getPageName(1)))
+ . (defined('G_TITLE') ? ' - ' . $this->l10n->__(G_TITLE) : '') :
+ $this->l10n->__($this->L_TITLE);
+
+ // LANG
+ $this->DATA['LANG'] = $this->lang;
+ // include flags
+ $this->DATA['JS_DATEPICKR'] = $this->JS_DATEPICKR;
+ $this->DATA['JS_FLATPICKR'] = $this->JS_FLATPICKR;
+ $this->DATA['JS_FILE_UPLOADER'] = $this->JS_FILE_UPLOADER;
+ // user name
+ $this->DATA['USER_NAME'] = !empty($_SESSION['USER_NAME']) ? $_SESSION['USER_NAME'] : '';
+ // the template part to include into the body
+ $this->DATA['TEMPLATE_NAME'] = $this->TEMPLATE_NAME;
+ $this->DATA['CONTENT_INCLUDE'] = $this->CONTENT_INCLUDE;
+ $this->DATA['TEMPLATE_TRANSLATE'] = $this->TEMPLATE_TRANSLATE ?? null;
+ $this->DATA['PAGE_FILE_NAME'] = str_replace('.php', '', $this->page_name) . '.tpl';
+ // render page
+ $this->renderSmarty();
+ }
+
+ /**
+ * merge outside object HEADER/DATA/DEBUG_DATA vars into the smarty class
+ * @param object $cms object that has header/data/debug_data
+ * @return void
+ */
+ public function mergeCmsSmartyVars(object $cms): void
+ {
+ // array merge HEADER, DATA, DEBUG DATA
+ foreach (['HEADER', 'DATA', 'DEBUG_DATA'] as $ext_smarty) {
+ if (
+ isset($cms->{$ext_smarty}) &&
+ is_array($cms->{$ext_smarty})
+ ) {
+ $this->{$ext_smarty} = array_merge($this->{$ext_smarty}, $cms->{$ext_smarty});
+ }
+ }
+ }
+
+ /**
+ * render smarty data (can be called sepparate)
+ * @return void
+ */
+ public function renderSmarty(): void
+ {
+ // create main data array
+ $this->CONTENT_DATA = array_merge($this->HEADER, $this->DATA, $this->DEBUG_DATA);
+ // data is 1:1 mapping (all vars, values, etc)
+ foreach ($this->CONTENT_DATA as $key => $value) {
+ $this->assign($key, $value);
+ }
+ if (is_dir(BASE . TEMPLATES_C)) {
+ $this->setCompileDir(BASE . TEMPLATES_C);
+ }
+ if (is_dir(BASE . CACHE)) {
+ $this->setCacheDir(BASE . CACHE);
+ }
+ $this->display(
+ $this->MASTER_TEMPLATE_NAME,
+ $this->CACHE_ID . ($this->CACHE_ID ? '_' : '') . $this->lang,
+ $this->COMPILE_ID . ($this->COMPILE_ID ? '_' : '') . $this->lang
+ );
+ }
+}
+
+// __END__
diff --git a/www/lib/smarty-4.0.0/.github/workflows/ci.yml b/www/lib/smarty-4.0.0/.github/workflows/ci.yml
deleted file mode 100644
index e82642aa..00000000
--- a/www/lib/smarty-4.0.0/.github/workflows/ci.yml
+++ /dev/null
@@ -1,73 +0,0 @@
-# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
-
-on:
- - pull_request
- - push
-
-name: CI
-
-jobs:
- tests:
- name: Tests
-
- runs-on: ${{ matrix.os }}
-
- env:
- PHP_EXTENSIONS: dom, json, libxml, mbstring, pdo_sqlite, soap, xml, xmlwriter
- PHP_INI_VALUES: assert.exception=1, zend.assertions=1
-
- strategy:
- fail-fast: false
- matrix:
- os:
- - ubuntu-latest
-
- php-version:
- - "7.1"
- - "7.2"
- - "7.3"
- - "7.4"
- - "8.0"
-
- compiler:
- - default
-
- include:
- - os: ubuntu-latest
- php-version: "8.0"
- compiler: jit
-
- steps:
- - name: Checkout
- uses: actions/checkout@v2
-
- - name: Override PHP ini values for JIT compiler
- if: matrix.compiler == 'jit'
- run: echo "PHP_INI_VALUES::assert.exception=1, zend.assertions=1, opcache.enable=1, opcache.enable_cli=1, opcache.optimization_level=-1, opcache.jit=1255, opcache.jit_buffer_size=32M" >> $GITHUB_ENV
-
- - name: Install PHP with extensions
- uses: shivammathur/setup-php@v2
- with:
- php-version: ${{ matrix.php-version }}
- coverage: pcov
- extensions: ${{ env.PHP_EXTENSIONS }}
- ini-values: ${{ env.PHP_INI_VALUES }}
-
- - name: Validate composer.json and composer.lock
- run: composer validate
-
- - name: Cache Composer packages
- id: composer-cache
- uses: actions/cache@v2
- with:
- path: vendor
- key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
- restore-keys: |
- ${{ runner.os }}-php-${{ matrix.php-version }}-
-
- - name: Install dependencies
- if: steps.composer-cache.outputs.cache-hit != 'true'
- run: composer install --prefer-dist --no-progress --no-suggest
-
- - name: Run tests with phpunit
- run: ./phpunit.sh
diff --git a/www/lib/smarty-4.0.0/CHANGELOG.md b/www/lib/smarty-4.0.0/CHANGELOG.md
deleted file mode 100644
index d31ac9b8..00000000
--- a/www/lib/smarty-4.0.0/CHANGELOG.md
+++ /dev/null
@@ -1,3496 +0,0 @@
-# Changelog
-All notable changes to this project will be documented in this file.
-
-The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
-and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-
-## [Unreleased]
-
-## [4.0.0] - 2021-11-25
-
-## [4.0.0-rc.0] - 2021-10-13
-
-### Added
-- You can now use `$smarty->muteUndefinedOrNullWarnings()` to activate convert warnings about undefined or null template vars to notices when running PHP8
-
-### Changed
-- Switch CI from Travis to Github CI
-- Updated unit tests to avoid skipped and risky test warnings
-
-### Removed
-- Dropped support for PHP7.0 and below, so Smarty now requires PHP >=7.1
-- Dropped support for php asp tags in templates (removed from php since php7.0)
-- Dropped deprecated API calls that where only accessible through SmartyBC
-- Dropped support for {php} and {include_php} tags and embedded PHP in templates. Embedded PHP will now be passed through as is.
-- Removed all PHP_VERSION_ID and compare_version checks and conditional code blocks that are now no longer required
-- Dropped deprecated SMARTY_RESOURCE_CHAR_SET and SMARTY_RESOURCE_DATE_FORMAT constants
-- Dropped deprecated Smarty::muteExpectedErrors and Smarty::unmuteExpectedErrors API methods
-- Dropped deprecated $smarty->getVariable() method. Use $smarty->getTemplateVars() instead.
-- $smarty->registerResource() no longer accepts an array of callback functions
-
-## [3.1.40] - 2021-10-13
-
-### Changed
-- modifier escape now triggers a E_USER_NOTICE when an unsupported escape type is used https://github.com/smarty-php/smarty/pull/649
-
-### Security
-- More advanced javascript escaping to handle https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements thanks to m-haritonov
-
-## [3.1.39] - 2021-02-17
-
-### Security
-- Prevent access to `$smarty.template_object` in sandbox mode. This addresses CVE-2021-26119.
-- Fixed code injection vulnerability by using illegal function names in `{function name='blah'}{/function}`. This addresses CVE-2021-26120.
-
-## [3.1.38] - 2021-01-08
-
-### Fixed
-- Smarty::SMARTY_VERSION wasn't updated https://github.com/smarty-php/smarty/issues/628
-
-## [3.1.37] - 2021-01-07
-
-### Changed
-- Changed error handlers and handling of undefined constants for php8-compatibility (set $errcontext argument optional) https://github.com/smarty-php/smarty/issues/605
-- Changed expected error levels in unit tests for php8-compatibility
-- Travis unit tests now run for all php versions >= 5.3, including php8
-- Travis runs on Xenial where possible
-
-### Fixed
-- PHP5.3 compatibility fixes
-- Brought lexer source functionally up-to-date with compiled version
-
-## [3.1.36] - 2020-04-14
-
-### Fixed
- - Smarty::SMARTY_VERSION wasn't updated in v3.1.35 https://github.com/smarty-php/smarty/issues/584
-
-## [3.1.35] - 2020-04-14
- - remove whitespaces after comments https://github.com/smarty-php/smarty/issues/447
- - fix foreachelse on arrayiterators https://github.com/smarty-php/smarty/issues/506
- - fix files contained in git export archive for package maintainers https://github.com/smarty-php/smarty/issues/325
- - throw SmartyException when setting caching attributes for cacheable plugin https://github.com/smarty-php/smarty/issues/457
- - fix errors that occured where isset was replaced with null check such as https://github.com/smarty-php/smarty/issues/453
- - unit tests are now in the repository
-
-## 3.1.34 release - 05.11.2019
-13.01.2020
- - fix typo in exception message (JercSi)
- - fix typehint warning with callable (bets4breakfast)
- - add travis badge and compatability info to readme (matks)
- - fix stdClass cast when compiling foreach (carpii)
- - fix wrong set/get methods for memcached (IT-Experte)
- - fix pborm assigning value to object variables in smarty_internal_compile_assign (Hunman)
- - exclude error_reporting.ini from git export (glensc)
-
-## 3.1.34-dev-6 -
-30.10.2018
- - bugfix a nested subblock in an inheritance child template was not replace by
- outer level block with same name in same child template https://github.com/smarty-php/smarty/issues/500
-
-29.10.2018
- - bugfix Smarty::$php_handling == PHP_PASSTHRU (default) did eat the "\n" (newline) character if it did directly followed
- a PHP tag like "?>" or other https://github.com/smarty-php/smarty/issues/501
-
-14.10.2018
- - bugfix autoloader exit shortcut https://github.com/smarty-php/smarty/issues/467
-
-11.10.2018
- - bugfix {insert} not works when caching is enabled and included template is present
- https://github.com/smarty-php/smarty/issues/496
- - bugfix in date-format modifier; NULL at date string or default_date did not produce correct output
- https://github.com/smarty-php/smarty/pull/458
-
-09.10.2018
- - bugfix fix of 26.8.2017 https://github.com/smarty-php/smarty/issues/327
- modifier is applied to sum expression https://github.com/smarty-php/smarty/issues/491
- - bugfix indexed arrays could not be defined "array(...)""
-
-18.09.2018
- - bugfix large plain text template sections without a Smarty tag > 700kB could
- could fail in version 3.1.32 and 3.1.33 because PHP preg_match() restrictions
- https://github.com/smarty-php/smarty/issues/488
-
-## 3.1.33 release - 12.09.2018
-## 3.1.33-dev-12 -
-03.09.2018
- - bugfix {foreach} using new style property access like {$item@property} on
- Smarty 2 style named foreach loop could produce errors https://github.com/smarty-php/smarty/issues/484
-
-31.08.2018
- - bugfix some custom left and right delimiters like '{^' '^}' did not work
- https://github.com/smarty-php/smarty/issues/450 https://github.com/smarty-php/smarty/pull/482
-
- - reformating for PSR-2 coding standards https://github.com/smarty-php/smarty/pull/483
-
- - bugfix on Windows absolute filepathes did fail if the drive letter was followed by a linux DIRECTORY_SEPARATOR
- like C:/ at Smarty > 3.1.33-dev-5 https://github.com/smarty-php/smarty/issues/451
-
- - PSR-2 code style fixes for config and template file Lexer/Parser generated with
- the Smarty Lexer/Parser generator from https://github.com/smarty-php/smarty-lexer
- https://github.com/smarty-php/smarty/pull/483
-
-26.08.2018
- - bugfix/enhancement {capture} allow variable as capture block name in Smarty special variable
- like $smarty.capture.$foo https://github.com/smarty-php/smarty/issues/478 https://github.com/smarty-php/smarty/pull/481
-
-## 3.1.33-dev-6 -
-19.08.2018
- - fix PSR-2 coding standards and PHPDoc blocks https://github.com/smarty-php/smarty/pull/452
- https://github.com/smarty-php/smarty/pull/475
- https://github.com/smarty-php/smarty/pull/473
- - bugfix PHP5.2 compatibility https://github.com/smarty-php/smarty/pull/472
-
-## 3.1.33-dev-4 -
-17.05.2018
- - bugfix strip-block produces different output in Smarty v3.1.32 https://github.com/smarty-php/smarty/issues/436
- - bugfix Smarty::compileAllTemplates ignores `$extension` parameter https://github.com/smarty-php/smarty/issues/437
- https://github.com/smarty-php/smarty/pull/438
- - improvement do not compute total property in {foreach} if not needed https://github.com/smarty-php/smarty/issues/443
- - bugfix plugins may not be loaded when setMergeCompiledIncludes is true https://github.com/smarty-php/smarty/issues/435
-
-26.04.2018
- - bugfix regarding Security Vulnerability did not solve the problem under Linux.
- Security issue CVE-2018-16831
-
-## 3.1.32 - (24.04.2018)
-24.04.2018
- - bugfix possible Security Vulnerability in Smarty_Security class.
-
-26.03.2018
- - bugfix plugins may not be loaded if {function} or {block} tags are executed in nocache mode
- https://github.com/smarty-php/smarty/issues/371
-
-26.03.2018
- - new feature {parent} = {$smarty.block.parent} {child} = {$smarty.block.child}
-
-23.03.2018
- - bugfix preg_replace could fail on large content resulting in a blank page https://github.com/smarty-php/smarty/issues/417
-
-21.03.2018
- - bugfix {$smarty.section...} used outside {section}{/section} showed incorrect values if {section}{/section} was called inside
- another loop https://github.com/smarty-php/smarty/issues/422
- - bugfix short form of {section} attributes did not work https://github.com/smarty-php/smarty/issues/428
-
-17.03.2018
- - improvement Smarty::compileAllTemplates() exit with a non-zero status code if max errors is reached https://github.com/smarty-php/smarty/pull/402
-
-16.03.2018
- - bugfix extends resource did not work with user defined left/right delimiter https://github.com/smarty-php/smarty/issues/419
-
-22.11.2017
- - bugfix {break} and {continue} could fail if {foreach}{/foreach} did contain other
- looping tags like {for}, {section} and {while} https://github.com/smarty-php/smarty/issues/323
-
-20.11.2017
- - bugfix rework of newline spacing between tag code and template text.
- now again identical with Smarty2 (forum topic 26878)
- - replacement of " by '
-
-05.11.2017
- - lexer/parser optimization
- - code cleanup and optimizations
- - bugfix {$smarty.section.name.loop} used together with {$smarty.section.name.total} could produce
- wrong results (forum topic 27041)
-
-26.10.2017
- - bugfix Smarty version was not filled in header comment of compiled and cached files
- - optimization replace internal Smarty::$ds property by DIRECTORY_SEPARATOR
- - deprecate functions Smarty::muteExpectedErrors() and Smarty::unmuteExpectedErrors()
- as Smarty does no longer use error suppression like @filemtime().
- for backward compatibility code is moved from Smarty class to an external class and still can be
- called.
- - correction of PHPDoc blocks
- - minor code cleanup
-
-21.10.2017
- - bugfix custom delimiters could fail since modification of version 3.1.32-dev-23
- https://github.com/smarty-php/smarty/issues/394
-
-18.10.2017
- - bugfix fix implementation of unclosed block tag in double quoted string of 12.10.2017
- https://github.com/smarty-php/smarty/issues/396 https://github.com/smarty-php/smarty/issues/397
- https://github.com/smarty-php/smarty/issues/391 https://github.com/smarty-php/smarty/issues/392
-
-12.10.2017
- - bugfix $smarty.block.child and $smarty.block.parent could not be used like any
- $smarty special variable https://github.com/smarty-php/smarty/issues/393
- - unclosed block tag in double quoted string must throw compiler exception.
- https://github.com/smarty-php/smarty/issues/391 https://github.com/smarty-php/smarty/issues/392
-
-07.10.2017
- - bugfix modification of 9.8.2017 did fail on some recursive
- tag nesting. https://github.com/smarty-php/smarty/issues/389
-
-26.8.2017
- - bugfix chained modifier failed when last modifier parameter is a signed value
- https://github.com/smarty-php/smarty/issues/327
- - bugfix templates filepath with multibyte characters did not work
- https://github.com/smarty-php/smarty/issues/385
- - bugfix {make_nocache} did display code if the template did not contain other nocache code
- https://github.com/smarty-php/smarty/issues/369
-
-09.8.2017
- - improvement repeated delimiter like {{ and }} will be treated as literal
- https://groups.google.com/forum/#!topic/smarty-developers/h9r82Bx4KZw
-
-05.8.2017
- - bugfix wordwrap modifier could fail if used in nocache code.
- converted plugin file shared.mb_wordwrap.php into modifier.mb_wordwrap.php
- - cleanup of _getSmartyObj()
-
-31.7.2017
- - Call clearstatcache() after mkdir() failure https://github.com/smarty-php/smarty/pull/379
-
-30.7.2017
- - rewrite mkdir() bugfix to retry automatically see https://github.com/smarty-php/smarty/pull/377
- https://github.com/smarty-php/smarty/pull/379
-
-21.7.2017
- - security possible PHP code injection on custom resources at display() or fetch()
- calls if the resource does not sanitize the template name
- - bugfix fix 'mkdir(): File exists' error on create directory from parallel
- processes https://github.com/smarty-php/smarty/pull/377
- - bugfix solve preg_match() hhvm parameter problem https://github.com/smarty-php/smarty/pull/372
-
-27.5.2017
- - bugfix change compiled code for registered function and modifiers to called as callable to allow closures
- https://github.com/smarty-php/smarty/pull/368, https://github.com/smarty-php/smarty/issues/273
- - bugfix https://github.com/smarty-php/smarty/pull/368 did break the default plugin handler
- - improvement replace phpversion() by PHP_VERSION constant.
- https://github.com/smarty-php/smarty/pull/363
-
-21.5.2017
- - performance store flag for already required shared plugin functions in static variable or
- Smarty's $_cache to improve performance when plugins are often called
- https://github.com/smarty-php/smarty/commit/51e0d5cd405d764a4ea257d1bac1fb1205f74528#commitcomment-22280086
- - bugfix remove special treatment of classes implementing ArrayAccess in {foreach}
- https://github.com/smarty-php/smarty/issues/332
- - bugfix remove deleted files by clear_cache() and clear_compiled_template() from
- ACP cache if present, add some is_file() checks to avoid possible warnings on filemtime()
- caused by above functions.
- https://github.com/smarty-php/smarty/issues/341
- - bugfix version 3.1.31 did fail under PHP 5.2
- https://github.com/smarty-php/smarty/issues/365
-
-19.5.2017
- - change properties $accessMap and $obsoleteProperties from private to protected
- https://github.com/smarty-php/smarty/issues/351
- - new feature The named capture buffers can now be accessed also as array
- See NEWS_FEATURES.txt https://github.com/smarty-php/smarty/issues/366
- - improvement check if ini_get() and ini_set() not disabled
- https://github.com/smarty-php/smarty/pull/362
-
-24.4.2017
- - fix spelling https://github.com/smarty-php/smarty/commit/e3eda8a5f5653d8abb960eb1bc47e3eca679b1b4#commitcomment-21803095
-
-17.4.2017
- - correct generated code on empty() and isset() call, observe change PHP behaviour since PHP 5.5
- https://github.com/smarty-php/smarty/issues/347
-
-14.4.2017
- - merge pull requests https://github.com/smarty-php/smarty/pull/349, https://github.com/smarty-php/smarty/pull/322 and https://github.com/smarty-php/smarty/pull/337 to fix spelling and annotation
-
-13.4.2017
- - bugfix array_merge() parameter should be checked https://github.com/smarty-php/smarty/issues/350
-
-## 3.1.31 - (14.12.2016)
- 23.11.2016
- - move template object cache into static variables
-
- 19.11.2016
- - bugfix inheritance root child templates containing nested {block}{/block} could call sub-bock content from parent
- template https://github.com/smarty-php/smarty/issues/317
- - change version checking
-
- 11.11.2016
- - bugfix when Smarty is using a cached template object on Smarty::fetch() or Smarty::isCached() the inheritance data
- must be removed https://github.com/smarty-php/smarty/issues/312
- - smaller speed optimization
-
- 08.11.2016
- - add bootstrap file to load and register Smarty_Autoloader. Change composer.json to make it known to composer
-
- 07.11.2016
- - optimization of lexer speed https://github.com/smarty-php/smarty/issues/311
-
- 27.10.2016
- - bugfix template function definitions array has not been cached between Smarty::fetch() and Smarty::display() calls
- https://github.com/smarty-php/smarty/issues/301
-
- 23.10.2016
- - improvement/bugfix when Smarty::fetch() is called on a template object the inheritance and tplFunctions property
- should be copied to the called template object
-
- 21.10.2016
- - bugfix for compile locking touched timestamp of old compiled file was not restored on compilation error https://github.com/smarty-php/smarty/issues/308
-
- 20.10.2016
- - bugfix nocache code was not removed in cache file when subtemplate did contain PHP short tags in text but no other
- nocache code https://github.com/smarty-php/smarty/issues/300
-
- 19.10.2016
- - bugfix {make_nocache $var} did fail when variable value did contain '\' https://github.com/smarty-php/smarty/issues/305
- - bugfix {make_nocache $var} remove spaces from variable value https://github.com/smarty-php/smarty/issues/304
-
- 12.10.2016
- - bugfix {include} with template names including variable or constants could fail after bugfix from
- 28.09.2016 https://github.com/smarty-php/smarty/issues/302
-
- 08.10.2016
- - optimization move runtime extension for template functions into Smarty objects
-
- 29.09.2016
- - improvement new Smarty::$extends_recursion property to disable execution of {extends} in templates called by extends resource
- https://github.com/smarty-php/smarty/issues/296
-
- 28.09.2016
- - bugfix the generated code for calling a subtemplate must pass the template resource name in single quotes https://github.com/smarty-php/smarty/issues/299
- - bugfix nocache hash was not removed for tags in subtemplates https://github.com/smarty-php/smarty/issues/300
-
- 27.09.2016
- - bugfix when Smarty does use an internally cached template object on Smarty::fetch() calls
- the template and config variables must be cleared https://github.com/smarty-php/smarty/issues/297
-
- 20.09.2016
- - bugfix some $smarty special template variables are no longer accessed as real variable.
- using them on calls like {if isset($smarty.foo)} or {if empty($smarty.foo)} will fail
- http://www.smarty.net/forums/viewtopic.php?t=26222
- - temporary fix for https://github.com/smarty-php/smarty/issues/293 main reason still under investigation
- - improvement new tags {block_parent} {block_child} in template inheritance
-
- 19.09.2016
- - optimization clear compiled and cached folder completely on detected version change
- - cleanup convert cache resource file method clear into runtime extension
-
- 15.09.2016
- - bugfix assigning a variable in if condition by function like {if $value = array_shift($array)} the function got called twice https://github.com/smarty-php/smarty/issues/291
- - bugfix function plugins called with assign attribute like {foo assign='bar'} did not output returned content because
- because assumption was made that it was assigned to a variable https://github.com/smarty-php/smarty/issues/292
- - bugfix calling $smarty->isCached() on a not existing cache file with $smarty->cache_locking = true; could cause a 10 second delay http://www.smarty.net/forums/viewtopic.php?t=26282
- - improvement make Smarty::clearCompiledTemplate() on custom resource independent from changes of templateId computation
-
- 11.09.2016
- - improvement {math} misleading E_USER_WARNING messages when parameter value = null https://github.com/smarty-php/smarty/issues/288
- - improvement move often used code snippets into methods
- - performance Smarty::configLoad() did load unneeded template source object
-
- 09.09.2016
- - bugfix/optimization {foreach} did not execute the {foreachelse} when iterating empty objects https://github.com/smarty-php/smarty/pull/287
- - bugfix {foreach} must keep the @properties when restoring a saved $item variable as the properties might be used outside {foreach} https://github.com/smarty-php/smarty/issues/267
- - improvement {foreach} observe {break n} and {continue n} nesting levels when restoring saved $item and $key variables
-
- 08.09.2016
- - bugfix implement wrapper for removed method getConfigVariable() https://github.com/smarty-php/smarty/issues/286
-
- 07.09.2016
- - bugfix using nocache like attribute with value true like {plugin nocache=true} did not work https://github.com/smarty-php/smarty/issues/285
- - bugfix uppercase TRUE, FALSE and NULL did not work when security was enabled https://github.com/smarty-php/smarty/issues/282
- - bugfix when {foreach} was looping over an object the total property like {$item@total} did always return 1 https://github.com/smarty-php/smarty/issues/281
- - bugfix {capture}{/capture} did add in 3.1.30 unintended additional blank lines https://github.com/smarty-php/smarty/issues/268
-
- 01.09.2016
- - performance require_once should be called only once for shared plugins https://github.com/smarty-php/smarty/issues/280
-
- 26.08.2016
- - bugfix change of 23.08.2016 failed on linux when use_include_path = true
-
- 23.08.2016
- - bugfix remove constant DS as shortcut for DIRECTORY_SEPARATOR as the user may have defined it to something else https://github.com/smarty-php/smarty/issues/277
-
- 20.08-2016
- - bugfix {config_load ... scope="global"} shall not throw an arror but fallback to scope="smarty" https://github.com/smarty-php/smarty/issues/274
- - bugfix {make_nocache} failed when using composer autoloader https://github.com/smarty-php/smarty/issues/275
-
- 14.08.2016
- - bugfix $smarty_>debugging = true; did E_NOTICE messages when {eval} tag was used https://github.com/smarty-php/smarty/issues/266
- - bugfix Class 'Smarty_Internal_Runtime_ValidateCompiled' not found when upgrading from some older Smarty versions with existing
- compiled or cached template files https://github.com/smarty-php/smarty/issues/269
- - optimization remove unneeded call to update acopes when {assign} scope and template scope was local (default)
-
-## 3.1.30 - (07.08.2016)
-
- 07.08.2016
- - bugfix update of 04.08.2016 was incomplete
-
- 05.08.2016
- - bugfix compiling of templates failed when the Smarty delimiter did contain '/' https://github.com/smarty-php/smarty/issues/264
- - updated error checking at template and config default handler
-
- 04.08.2016
- - improvement move template function source parameter into extension
-
- 26.07.2016
- - optimization unneeded loading of compiled resource
-
- 24.07.2016
- - regression this->addPluginsDir('/abs/path/to/dir') adding absolute path without trailing '/' did fail https://github.com/smarty-php/smarty/issues/260
-
- 23.07.2016
- - bugfix setTemplateDir('/') and setTemplateDir('') did create wrong absolute filepath https://github.com/smarty-php/smarty/issues/245
- - optimization of filepath normalization
- - improvement remove double function declaration in plugin shared.escape_special_cars.php https://github.com/smarty-php/smarty/issues/229
-
- 19.07.2016
- - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246
- - bugfix {math} shell injection vulnerability patch provided by Tim Weber
-
- 18.07.2016
- - bugfix {foreach} if key variable and item@key attribute have been used both the key variable was not updated https://github.com/smarty-php/smarty/issues/254
- - bugfix modifier on plugins like {plugin|modifier ... } did fail when the plugin does return an array https://github.com/smarty-php/smarty/issues/228
- - bugfix avoid opcache_invalidate to result in ErrorException when opcache.restrict_api is not empty https://github.com/smarty-php/smarty/pull/244
- - bugfix multiple {include} with relative filepath within {block}{/block} could fail https://github.com/smarty-php/smarty/issues/246
-
- 14.07.2016
- - bugfix wrong parameter on compileAllTemplates() and compileAllConfig() https://github.com/smarty-php/smarty/issues/231
-
- 13.07.2016
- - bugfix PHP 7 compatibility on registered compiler plugins https://github.com/smarty-php/smarty/issues/241
- - update testInstall() https://github.com/smarty-php/smarty/issues/248https://github.com/smarty-php/smarty/issues/248
- - bugfix enable debugging could fail when template objects did already exists https://github.com/smarty-php/smarty/issues/237
- - bugfix template function data should be merged when loading subtemplate https://github.com/smarty-php/smarty/issues/240
- - bugfix wrong parameter on compileAllTemplates() https://github.com/smarty-php/smarty/issues/231
-
- 12.07.2016
- - bugfix {foreach} item variable must be created also on empty from array https://github.com/smarty-php/smarty/issues/238 and https://github.com/smarty-php/smarty/issues/239
- - bugfix enableSecurity() must init cache flags https://github.com/smarty-php/smarty/issues/247
-
- 27.05.2016
- - bugfix/improvement of compileAlltemplates() follow symlinks in template folder (PHP >= 5.3.1) https://github.com/smarty-php/smarty/issues/224
- clear internal cache and expension handler for each template to avoid possible conflicts https://github.com/smarty-php/smarty/issues/231
-
- 16.05.2016
- - optimization {foreach} compiler and processing
- - broken PHP 5.3 and 5.4 compatibility
-
- 15.05.2016
- - optimization and cleanup of resource code
-
- 10.05.2016
- - optimization of inheritance processing
-
- 07.05.2016
- -bugfix Only variables should be assigned by reference https://github.com/smarty-php/smarty/issues/227
-
- 02.05.2016
- - enhancement {block} tag names can now be variable https://github.com/smarty-php/smarty/issues/221
-
- 01.05.2016
- - bugfix same relative filepath at {include} called from template in different folders could display wrong sub-template
-
- 29.04.2016
- - bugfix {strip} remove space on linebreak between html tags https://github.com/smarty-php/smarty/issues/213
-
- 24.04.2016
- - bugfix nested {include} with relative file path could fail when called in {block} ... {/block} https://github.com/smarty-php/smarty/issues/218
-
- 14.04.2016
- - bugfix special variable {$smarty.capture.name} was not case sensitive on name https://github.com/smarty-php/smarty/issues/210
- - bugfix the default template handler must calculate the source uid https://github.com/smarty-php/smarty/issues/205
-
- 13.04.2016
- - bugfix template inheritance status must be saved when calling sub-templates https://github.com/smarty-php/smarty/issues/215
-
- 27.03.2016
- - bugfix change of 11.03.2016 cause again {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153
-
- 11.03.2016
- - optimization of capture and security handling
- - improvement $smarty->clearCompiledTemplate() should return on recompiled or uncompiled resources
-
- 10.03.2016
- - optimization of resource processing
-
- 09.03.2016
- - improvement rework of 'scope' attribute handling see see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/194
- https://github.com/smarty-php/smarty/issues/186 https://github.com/smarty-php/smarty/issues/179
- - bugfix correct Autoloader update of 2.3.2014 https://github.com/smarty-php/smarty/issues/199
-
- 04.03.2016
- - bugfix change from 01.03.2016 will cause $smarty->isCached(..) failure if called multiple time for same template
- (forum topic 25935)
-
- 02.03.2016
- - revert autoloader optimizations because of unexplainable warning when using plugins https://github.com/smarty-php/smarty/issues/199
-
- 01.03.2016
- - bugfix template objects must be cached on $smarty->fetch('foo.tpl) calls incase the template is fetched
- multiple times (forum topic 25909)
-
- 25.02.2016
- - bugfix wrong _realpath with 4 or more parent-directories https://github.com/smarty-php/smarty/issues/190
- - optimization of _realpath
- - bugfix instanceof expression in template code must be treated as value https://github.com/smarty-php/smarty/issues/191
-
- 20.02.2016
- - bugfix {strip} must keep space between hmtl tags. Broken by changes of 10.2.2016 https://github.com/smarty-php/smarty/issues/184
- - new feature/bugfix {foreach}{section} add 'properties' attribute to force compilation of loop properties
- see NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/189
-
- 19.02.2016
- - revert output buffer flushing on display, echo content again because possible problems when PHP files had
- characters (newline} after ?> at file end https://github.com/smarty-php/smarty/issues/187
-
- 14.02.2016
- - new tag {make_nocache} read NEW_FEATURES.txt https://github.com/smarty-php/smarty/issues/110
- - optimization of sub-template processing
- - bugfix using extendsall as default resource and {include} inside {block} tags could produce unexpected results https://github.com/smarty-php/smarty/issues/183
- - optimization of tag attribute compiling
- - optimization make compiler tag object cache static for higher compilation speed
-
- 11.02.2016
- - improvement added KnockoutJS comments to trimwhitespace outputfilter https://github.com/smarty-php/smarty/issues/82
- https://github.com/smarty-php/smarty/pull/181
-
- 10.02.2016
- - bugfix {strip} must keep space on output creating smarty tags within html tags https://github.com/smarty-php/smarty/issues/177
- - bugfix wrong precedence on special if conditions like '$foo is ... by $bar' could cause wrong code https://github.com/smarty-php/smarty/issues/178
- - improvement because of ambiguities the inline constant support has been removed from the $foo.bar syntax https://github.com/smarty-php/smarty/issues/149
- - bugfix other {strip} error with output tags between hmtl https://github.com/smarty-php/smarty/issues/180
-
- 09.02.2016
- - move some code from parser into compiler
- - reformat all code for unique style
- - update/bugfix scope attribute handling reworked. Read the newfeatures.txt file
-
- 05.02.2016
- - improvement internal compiler changes
-
- 01.02.2016
- - bugfix {foreach} compilation failed when $smarty->merge_compiled_includes = true and pre-filters are used.
-
- 29.01.2016
- - bugfix implement replacement code for _tag_stack property https://github.com/smarty-php/smarty/issues/151
-
- 28.01.2016
- - bugfix allow windows network filepath or wrapper (forum topic 25876) https://github.com/smarty-php/smarty/issues/170
- - bugfix if fetch('foo.tpl') is called on a template object the $parent parameter should default to the calling template object https://github.com/smarty-php/smarty/issues/152
-
- 27.01.2016
- - revert bugfix compiling {section} did create warning
- - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161
- update of yesterdays fix
- - bugfix string resource could inject code at {block} or inline subtemplates through PHP comments https://github.com/smarty-php/smarty/issues/157
- - bugfix output filters did not observe nocache code flhttps://github.com/smarty-php/smarty/issues/154g https://github.com/smarty-php/smarty/issues/160
- - bugfix {extends} with relative file path did not work https://github.com/smarty-php/smarty/issues/154
- https://github.com/smarty-php/smarty/issues/158
- - bugfix {capture} data could not been seen in other templates with {$smarty.capture.name} https://github.com/smarty-php/smarty/issues/153
-
- 26.01.2016
- - improvement observe Smarty::$_CHARSET in debugging console https://github.com/smarty-php/smarty/issues/169
- - bugfix compiling {section} did create warning
- - bugfix {$smarty.section.customer.loop} did throw compiler error https://github.com/smarty-php/smarty/issues/161
-
- 02.01.2016
- - update scope handling
- - optimize block plugin compiler
- - improvement runtime checks if registered block plugins are callable
-
- 01.01.2016
- - remove Smarty::$resource_cache_mode property
-
- 31.12.2015
- - optimization of {assign}, {if} and {while} compiled code
-
- 30.12.2015
- - bugfix plugin names starting with "php" did not compile https://github.com/smarty-php/smarty/issues/147
-
- 29.12.2015
- - bugfix Smarty::error_reporting was not observed when display() or fetch() was called on template objects https://github.com/smarty-php/smarty/issues/145
-
- 28.12.2015
- - optimization of {foreach} code size and processing
-
- 27.12.2015
- - improve inheritance code
- - update external methods
- - code fixes
- - PHPdoc updates
-
- 25.12.2015
- - compile {block} tag code and its processing into classes
- - optimization replace hhvm extension by inline code
- - new feature If ACP is enabled force an apc_compile_file() when compiled or cached template was updated
-
- 24.12.2015
- - new feature Compiler does now observe the template_dir setting and will create separate compiled files if required
- - bugfix post filter did fail on template inheritance https://github.com/smarty-php/smarty/issues/144
-
- 23.12.2015
- - optimization move internal method decodeProperties back into template object
- - optimization move subtemplate processing back into template object
- - new feature Caching does now observe the template_dir setting and will create separate cache files if required
-
- 22.12.2015
- - change $xxx_dir properties from private to protected in case Smarty class gets extended
- - code optimizations
-
- 21.12.2015
- - bugfix a filepath starting with '/' or '\' on windows should normalize to the root dir
- of current working drive https://github.com/smarty-php/smarty/issues/134
- - optimization of filepath normalization
- - bugfix {strip} must remove all blanks between html tags https://github.com/smarty-php/smarty/issues/136
-
- - 3.1.29 - (21.12.2015)
- 21.12.2015
- - optimization improve speed of filetime checks on extends and extendsall resource
-
- 20.12.2015
- - bugfix failure when the default resource type was set to 'extendsall' https://github.com/smarty-php/smarty/issues/123
- - update compilation of Smarty special variables
- - bugfix add addition check for OS type on normalization of file path https://github.com/smarty-php/smarty/issues/134
- - bugfix the source uid of the extendsall resource must contain $template_dir settings https://github.com/smarty-php/smarty/issues/123
-
- 19.12.2015
- - bugfix using $smarty.capture.foo in expressions could fail https://github.com/smarty-php/smarty/pull/138
- - bugfix broken PHP 5.2 compatibility https://github.com/smarty-php/smarty/issues/139
- - remove no longer used code
- - improvement make sure that compiled and cache templates never can contain a trailing '?>?
-
- 18.12.2015
- - bugfix regression when modifier parameter was followed by math https://github.com/smarty-php/smarty/issues/132
-
- 17.12.2015
- - bugfix {$smarty.capture.nameFail} did lowercase capture name https://github.com/smarty-php/smarty/issues/135
- - bugfix using {block append/prepend} on same block in multiple levels of inheritance templates could fail (forum topic 25827)
- - bugfix text content consisting of just a single '0' like in {if true}0{/if} was suppressed (forum topic 25834)
-
- 16.12.2015
- - bugfix {foreach} did fail if from atrribute is a Generator class https://github.com/smarty-php/smarty/issues/128
- - bugfix direct access $smarty->template_dir = 'foo'; should call Smarty::setTemplateDir() https://github.com/smarty-php/smarty/issues/121
-
- 15.12.2015
- - bugfix {$smarty.cookies.foo} did return the $_COOKIE array not the 'foo' value https://github.com/smarty-php/smarty/issues/122
- - bugfix a call to clearAllCache() and other should clear all internal template object caches (forum topic 25828)
-
- 14.12.2015
- - bugfix {$smarty.config.foo} broken in 3.1.28 https://github.com/smarty-php/smarty/issues/120
- - bugfix multiple calls of {section} with same name droped E_NOTICE error https://github.com/smarty-php/smarty/issues/118
-
- - 3.1.28 - (13.12.2015)
- 13.12.2015
- - bugfix {foreach} and {section} with uppercase characters in name attribute did not work (forum topic 25819)
- - bugfix $smarty->debugging_ctrl = 'URL' did not work (forum topic 25811)
- - bugfix Debug Console could display incorrect data when using subtemplates
-
- 09.12.2015
- - bugfix Smarty did fail under PHP 7.0.0 with use_include_path = true;
-
- 09.12.2015
- - bugfix {strip} should exclude some html tags from stripping, related to fix for https://github.com/smarty-php/smarty/issues/111
-
- 08.12.2015
- - bugfix internal template function data got stored in wrong compiled file https://github.com/smarty-php/smarty/issues/114
-
- 05.12.2015
- -bugfix {strip} should insert a single space https://github.com/smarty-php/smarty/issues/111
-
- 25.11.2015
- -bugfix a left delimter like '[%' did fail on [%$var_[%$variable%]%] (forum topic 25798)
-
- 02.11.2015
- - bugfix {include} with variable file name like {include file="foo_`$bar`.tpl"} did fail in 3.1.28-dev https://github.com/smarty-php/smarty/issues/102
-
- 01.11.2015
- - update config file processing
-
- 31.10.2015
- - bugfix add missing $trusted_dir property to SmartyBC class (forum topic 25751)
-
- 29.10.2015
- - improve template scope handling
-
- 24.10.2015
- - more optimizations of template processing
- - bugfix Error when using {include} within {capture} https://github.com/smarty-php/smarty/issues/100
-
- 21.10.2015
- - move some code into runtime extensions
-
- 18.10.2015
- - optimize filepath normalization
- - rework of template inheritance
- - speed and size optimizations
- - bugfix under HHVM temporary cache file must only be created when caches template was updated
- - fix compiled code for new {block} assign attribute
- - update code generated by template function call handler
-
- 18.09.2015
- - bugfix {if $foo instanceof $bar} failed to compile if 2nd value is a variable https://github.com/smarty-php/smarty/issues/92
-
- 17.09.2015
- - bugfix {foreach} first attribute was not correctly reset since commit 05a8fa2 of 02.08.2015 https://github.com/smarty-php/smarty/issues/90
-
- 16.09.2015
- - update compiler by moving no longer needed properties, code optimizations and other
-
- 14.09.2015
- - optimize autoloader
- - optimize subtemplate handling
- - update template inheritance processing
- - move code of {call} processing back into Smarty_Internal_Template class
- - improvement invalidate OPCACHE for cleared compiled and cached template files (forum topic 25557)
- - bugfix unintended multiple debug windows (forum topic 25699)
-
- 30.08.2015
- - size optimization move some runtime functions into extension
- - optimize inline template processing
- - optimization merge inheritance child and parent templates into one compiled template file
-
- 29.08.2015
- - improvement convert template inheritance into runtime processing
- - bugfix {$smarty.block.parent} did always reference the root parent block https://github.com/smarty-php/smarty/issues/68
-
- 23.08.2015
- - introduce Smarty::$resource_cache_mode and cache template object of {include} inside loop
- - load seldom used Smarty API methods dynamically to reduce memory footprint
- - cache template object of {include} if same template is included several times
- - convert debug console processing to object
- - use output buffers for better performance and less memory usage
- - optimize nocache hash processing
- - remove not really needed properties
- - optimize rendering
- - move caching to Smarty::_cache
- - remove properties with redundant content
- - optimize Smarty::templateExists()
- - optimize use_include_path processing
- - relocate properties for size optimization
- - remove redundant code
- - bugfix compiling super globals like {$smarty.get.foo} did fail in the master branch https://github.com/smarty-php/smarty/issues/77
-
- 06.08.2015
- - avoid possible circular object references caused by parser/lexer objects
- - rewrite compileAll... utility methods
- - commit several internal improvements
- - bugfix Smarty failed when compile_id did contain "|"
-
- 03.08.2015
- - rework clear cache methods
- - bugfix compileAllConfig() was broken since 3.1.22 because of the changes in config file processing
- - improve getIncludePath() to return directory if no file was given
-
- 02.08.2015
- - optimization and code cleanup of {foreach} and {section} compiler
- - rework {capture} compiler
-
- 01.08.2015
- - update DateTime object can be instance of DateTimeImmutable since PHP5.5 https://github.com/smarty-php/smarty/pull/75
- - improvement show resource type and start of template source instead of uid on eval: and string: resource (forum topic 25630)
-
- 31.07.2015
- - optimize {foreach} and {section} compiler
-
- 29.07.2015
- - optimize {section} compiler for speed and size of compiled code
-
- 28.07.2015
- - update for PHP 7 compatibility
-
- 26.07.2015
- - improvement impement workaround for HHVM PHP incompatibillity https://github.com/facebook/hhvm/issues/4797
-
- 25.07.2015
- - bugfix parser did hang on text starting fetch('foo.tpl') https://github.com/smarty-php/smarty/issues/70
- - improvement Added $limit parameter to regex_replace modifier #71
- - new feature multiple indices on file: resource
-
- 06.07.2015
- - optimize {block} compilation
- - optimization get rid of __get and __set in source object
-
- 01.07.2015
- - optimize compile check handling
- - update {foreach} compiler
- - bugfix debugging console did not display string values containing \n, \r or \t correctly https://github.com/smarty-php/smarty/issues/66
- - optimize source resources
-
- 28.06.2015
- - move $smarty->enableSecurity() into Smarty_Security class
- - optimize security isTrustedResourceDir()
- - move auto load filter methods into extension
- - move $smarty->getTemplateVars() into extension
- - move getStreamVariable() into extension
- - move $smarty->append() and $smarty->appendByRef() into extension
- - optimize autoloader
- - optimize file path normalization
- - bugfix PATH_SEPARATOR was replaced by mistake in autoloader
- - remove redundant code
-
- 27.06.2015
- - bugfix resolve naming conflict between custom Smarty delimiter '<%' and PHP ASP tags https://github.com/smarty-php/smarty/issues/64
- - update $smarty->_realpath for relative path not starting with './'
- - update Smarty security with new realpath handling
- - update {include_php} with new realpath handling
- - move $smarty->loadPlugin() into extension
- - minor compiler optimizations
- - bugfix allow function plugins with name ending with 'close' https://github.com/smarty-php/smarty/issues/52
- - rework of $smarty->clearCompiledTemplate() and move it to its own extension
-
- 19.06.2015
- - improvement allow closures as callback at $smarty->registerFilter() https://github.com/smarty-php/smarty/issues/59
-
- - 3.1.27- (18.06.2015)
- 18.06.2015
- - bugfix another update on file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56
-
- - 3.1.26- (18.06.2015)
- 18.06.2015
- - bugfix file path normalization failed on path containing something like "/.foo/" https://github.com/smarty-php/smarty/issues/56
-
- 17.06.2015
- - bugfix calling a plugin with nocache option but no other attributes like {foo nocache} caused call to undefined function https://github.com/smarty-php/smarty/issues/55
-
- - 3.1.25- (15.06.2015)
- 15.06.2015
- - optimization of smarty_cachereource_keyvaluestore.php code
-
- 14.06.2015
- - bugfix a relative sub template path could fail if template_dir path did contain /../ https://github.com/smarty-php/smarty/issues/50
- - optimization rework of path normalization
- - bugfix an output tag with variable, modifier followed by an operator like {$foo|modifier+1} did fail https://github.com/smarty-php/smarty/issues/53
-
- 13.06.2015
- - bugfix a custom cache resource using smarty_cachereource_keyvaluestore.php did fail if php.ini mbstring.func_overload = 2 (forum topic 25568)
-
- 11.06.2015
- - bugfix the lexer could hang on very large quoted strings (forum topic 25570)
-
- 08.06.2015
- - bugfix using {$foo} as array index like $bar.{$foo} or in double quoted string like "some {$foo} thing" failed https://github.com/smarty-php/smarty/issues/49
-
- 04.06.2015
- - bugfix possible error message on unset() while compiling {block} tags https://github.com/smarty-php/smarty/issues/46
-
- 01.06.2015
- - bugfix including template variables broken since 3.1.22 https://github.com/smarty-php/smarty/issues/47
-
- 27.05.2015
- - bugfix {include} with variable file name must not create by default individual cache file (since 3.1.22) https://github.com/smarty-php/smarty/issues/43
-
- 24.05.2015
- - bugfix if condition string 'neq' broken due to a typo https://github.com/smarty-php/smarty/issues/42
-
- - 3.1.24- (23.05.2015)
- 23.05.2015
- - improvement on php_handling to allow very large PHP sections, better error handling
- - improvement allow extreme large comment sections (forum 25538)
-
- 21.05.2015
- - bugfix broken PHP 5.2 compatibility when compiling 1 did compile into wrong code https://github.com/smarty-php/smarty/issues/41
-
- 19.05.2015
- - bugfix compiler did overwrite existing variable value when setting the nocache attribute https://github.com/smarty-php/smarty/issues/39
- - bugfix output filter trimwhitespace could run into the pcre.backtrack_limit on large output (code.google issue 220)
- - bugfix compiler could run into the pcre.backtrack_limit on larger comment or {php} tag sections (forum 25538)
-
- 18.05.2015
- - improvement introduce shortcuts in lexer/parser rules for most frequent terms for higher
- compilation speed
-
- 16.05.2015
- - bugfix {php}{/php} did work just for single lines https://github.com/smarty-php/smarty/issues/33
- - improvement remove not needed ?> handling from parser to new compiler module
-
- 05.05.2015
- - bugfix code could be messed up when {tags} are used in multiple attributes https://github.com/smarty-php/smarty/issues/23
-
- 04.05.2015
- - bugfix Smarty_Resource::parseResourceName incompatible with Google AppEngine (https://github.com/smarty-php/smarty/issues/22)
- - improvement use is_file() checks to avoid errors suppressed by @ which could still cause problems (https://github.com/smarty-php/smarty/issues/24)
-
- 28.04.2015
- - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508) 2nd fix
-
- 28.04.2015
- - bugfix plugins of merged subtemplates not loaded in 3.1.22-dev (forum topic 25508)
-
- 23.04.2015
- - bugfix a nocache template variable used as parameter at {insert} was by mistake cached
-
- 20.04.2015
- - bugfix at a template function containing nocache code a parmeter could overwrite a template variable of same name
-
- 27.03.2015
- - bugfix Smarty_Security->allow_constants=false; did also disable true, false and null (change of 16.03.2015)
- - improvement added a whitelist for trusted constants to security Smarty_Security::$trusted_constants (forum topic 25471)
-
- 20.03.2015
- - bugfix make sure that function properties get saved only in compiled files containing the fuction definition {forum topic 25452}
- - bugfix correct update of global variable values on exit of template functions. (reported under Smarty Developers)
-
- 16.03.2015
- - bugfix problems with {function}{/function} and {call} tags in different subtemplate cache files {forum topic 25452}
- - bugfix Smarty_Security->allow_constants=false; did not disallow direct usage of defined constants like {SMARTY_DIR} {forum topic 25457}
- - bugfix {block}{/block} tags did not work inside double quoted strings https://github.com/smarty-php/smarty/issues/18
-
-
- 15.03.2015
- - bugfix $smarty->compile_check must be restored before rendering of a just updated cache file {forum 25452}
-
- 14.03.2015
- - bugfix {nocache} {/nocache} tags corrupted code when used within a nocache section caused by a nocache template variable.
-
- - bugfix template functions defined with {function} in an included subtemplate could not be called in nocache
- mode with {call... nocache} if the subtemplate had it's own cache file {forum 25452}
-
- 10.03.2015
- - bugfix {include ... nocache} whith variable file or compile_id attribute was not executed in nocache mode.
-
- 12.02.2015
- - bugfix multiple Smarty::fetch() of same template when $smarty->merge_compiled_includes = true; could cause function already defined error
-
- 11.02.2015
- - bugfix recursive {includes} did create E_NOTICE message when $smarty->merge_compiled_includes = true; (github issue #16)
-
- 22.01.2015
- - new feature security can now control access to static methods and properties
- see also NEW_FEATURES.txt
-
- 21.01.2015
- - bugfix clearCompiledTemplates(), clearAll() and clear() could try to delete whole drive at wrong path permissions because realpath() fail (forum 25397)
- - bugfix 'self::' and 'parent::' was interpreted in template syntax as static class
-
- 04.01.2015
- - push last weeks changes to github
-
- - different optimizations
- - improvement automatically create different versions of compiled templates and config files depending
- on property settings.
- - optimization restructure template processing by moving code into classes it better belongs to
- - optimization restructure config file processing
-
- 31.12.2014
- - bugfix use function_exists('mb_get_info') for setting Smarty::$_MBSTRING.
- Function mb_split could be overloaded depending on php.ini mbstring.func_overload
-
-
- 29.12.2014
- - new feature security can now limit the template nesting level by property $max_template_nesting
- see also NEW_FEATURES.txt (forum 25370)
-
- 29.12.2014
- - new feature security can now disable special $smarty variables listed in property $disabled_special_smarty_vars
- see also NEW_FEATURES.txt (forum 25370)
-
- 27.12.2014
- - bugfix clear internal _is_file_cache when plugins_dir was modified
-
- 13.12.2014
- - improvement optimization of lexer and parser resulting in a up to 30% higher compiling speed
-
- 11.12.2014
- - bugfix resolve parser ambiguity between constant print tag {CONST} and other smarty tags after change of 09.12.2014
-
- 09.12.2014
- - bugfix variables $null, $true and $false did not work after the change of 12.11.2014 (forum 25342)
- - bugfix call of template function by a variable name did not work after latest changes (forum 25342)
-
- 23.11.2014
- - bugfix a plugin with attached modifier could fail if the tag was immediately followed by another Smarty tag (since 3.1.21) (forum 25326)
-
- 13.11.2014
- - improvement move autoload code into Autoloader.php. Use Composer autoloader when possible
-
- 12.11.2014
- - new feature added support of namespaces to template code
-
- 08.11.2014 - 10.11.2014
- - bugfix subtemplate called in nocache mode could be called with wrong compile_id when it did change on one of the calling templates
- - improvement add code of template functions called in nocache mode dynamically to cache file (related to bugfix of 01.11.2014)
- - bugfix Debug Console did not include all data from merged compiled subtemplates
-
- 04.11.2014
- - new feature $smarty->debugging = true; => overwrite existing Debug Console window (old behaviour)
- $smarty->debugging = 2; => individual Debug Console window by template name
-
- 03.11.2014
- - bugfix Debug Console did not show included subtemplates since 3.1.17 (forum 25301)
- - bugfix Modifier debug_print_var did not limit recursion or prevent recursive object display at Debug Console
- (ATTENTION: parameter order has changed to be able to specify maximum recursion)
- - bugfix Debug consol did not include subtemplate information with $smarty->merge_compiled_includes = true
- - improvement The template variables are no longer displayed as objects on the Debug Console
- - improvement $smarty->createData($parent = null, $name = null) new optional name parameter for display at Debug Console
- - addition of some hooks for future extension of Debug Console
-
- 01.11.2014
- - bugfix and enhancement on subtemplate {include} and template {function} tags.
- * Calling a template which has a nocache section could fail if it was called from a cached and a not cached subtemplate.
- * Calling the same subtemplate cached and not cached with the $smarty->merge_compiled_includes enabled could cause problems
- * Many smaller related changes
-
- 30.10.2014
- - bugfix access to class constant by object like {$object::CONST} or variable class name {$class::CONST} did not work (forum 25301)
-
- 26.10.2014
- - bugfix E_NOTICE message was created during compilation when ASP tags '<%' or '%>' are in template source text
- - bugfix merge_compiled_includes option failed when caching enables and same subtemplate was included cached and not cached
-
- - 3.1.21 - (18.10.2014)
- 18.10.2014
- - composer moved to github
-
- 17.10.2014
- - bugfix on $php_handling security and optimization of smarty_internal_parsetree (Thue Kristensen)
-
- 16.10.2014
- - bugfix composer.json update
-
- 15.10.2014
- - bugfix calling a new created cache file with fetch() and Smarty::CACHING_LIFETIME_SAVED multiple times did fail (forum 22350)
-
- 14.10.2014
- - bugfix any tag placed within "
diff --git a/www/lib/smarty-4.0.0/libs/plugins/block.t.php b/www/lib/smarty-4.0.0/libs/plugins/block.t.php
deleted file mode 100644
index fb34307f..00000000
--- a/www/lib/smarty-4.0.0/libs/plugins/block.t.php
+++ /dev/null
@@ -1,120 +0,0 @@
-register_block('t', 'smarty_translate');
- *
- * @package smarty-gettext
- * @version $Id: block.t.php 4737 2013-12-11 06:29:51Z gullevek $
- * @link http://smarty-gettext.sf.net/
- * @author Sagi Bashari
- * @copyright 2004 Sagi Bashari
- */
-
-/**
- * Replace 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 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.
- * - '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())
- */
-
-// cs modified: __ calls instead of direct gettext calls
-
-function smarty_block_t($params, $text, $template, &$repeat)
-{
- if ($text) {
- $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 = $template->l10n->__ngettext($text, $plural, $count);
- } else { // use normal
- $text = $template->l10n->__($text);
- }
-
- // run strarg if there are parameters
- if (count($params)) {
- $text = strarg($text, $params);
- }
-
- if (!isset($escape) || $escape == 'html') { // html escape, default
- $text = nl2br(htmlspecialchars($text));
- } elseif (isset($escape) && ($escape == 'javascript' || $escape == 'js')) { // javascript escape
- $text = str_replace('\'','\\\'',stripslashes($text));
- }
-
- return $text;
- }
-}
-
-?>
diff --git a/www/lib/smarty-4.0.0/libs/plugins/block.textformat.php b/www/lib/smarty-4.0.0/libs/plugins/block.textformat.php
deleted file mode 100644
index fed090e4..00000000
--- a/www/lib/smarty-4.0.0/libs/plugins/block.textformat.php
+++ /dev/null
@@ -1,121 +0,0 @@
-
- * @throws \SmartyException
- */
-function smarty_block_textformat($params, $content, Smarty_Internal_Template $template, &$repeat)
-{
- if (is_null($content)) {
- return;
- }
- if (Smarty::$_MBSTRING) {
- $template->_checkPlugins(
- array(
- array(
- 'function' => 'smarty_modifier_mb_wordwrap',
- 'file' => SMARTY_PLUGINS_DIR . 'modifier.mb_wordwrap.php'
- )
- )
- );
- }
- $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;
- }
-}
diff --git a/www/lib/smarty-4.0.0/libs/plugins/function.counter.php b/www/lib/smarty-4.0.0/libs/plugins/function.counter.php
deleted file mode 100644
index 54795459..00000000
--- a/www/lib/smarty-4.0.0/libs/plugins/function.counter.php
+++ /dev/null
@@ -1,62 +0,0 @@
-
- * @link https://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;
-}
diff --git a/www/lib/smarty-4.0.0/libs/plugins/function.cycle.php b/www/lib/smarty-4.0.0/libs/plugins/function.cycle.php
deleted file mode 100644
index 79356999..00000000
--- a/www/lib/smarty-4.0.0/libs/plugins/function.cycle.php
+++ /dev/null
@@ -1,92 +0,0 @@
-
- * @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;
-}
diff --git a/www/lib/smarty-4.0.0/libs/plugins/function.fetch.php b/www/lib/smarty-4.0.0/libs/plugins/function.fetch.php
deleted file mode 100644
index 4a3e8819..00000000
--- a/www/lib/smarty-4.0.0/libs/plugins/function.fetch.php
+++ /dev/null
@@ -1,204 +0,0 @@
-
- *
- * @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;
- }
-}
diff --git a/www/lib/smarty-4.0.0/libs/plugins/function.html_checkboxes.php b/www/lib/smarty-4.0.0/libs/plugins/function.html_checkboxes.php
deleted file mode 100644
index 0ed418ec..00000000
--- a/www/lib/smarty-4.0.0/libs/plugins/function.html_checkboxes.php
+++ /dev/null
@@ -1,296 +0,0 @@
-' 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 https://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 Smarty_Internal_Template $template template object
- *
- * @return string
- * @uses smarty_function_escape_special_chars()
- * @throws \SmartyException
- */
-function smarty_function_html_checkboxes($params, Smarty_Internal_Template $template)
-{
- $template->_checkPlugins(
- array(
- array(
- 'function' => 'smarty_function_escape_special_chars',
- 'file' => SMARTY_PLUGINS_DIR . 'shared.escape_special_chars.php'
- )
- )
- );
- $name = 'checkbox';
- $values = null;
- $options = null;
- $selected = array();
- $separator = '';
- $escape = true;
- $labels = true;
- $label_ids = false;
- $output = null;
- $pos = 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 'pos':
- $$_key = array_values((array)$_val);
- 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!
- // no break
- 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) {
- $_pos = isset($pos[ $_key ]) ? $pos[ $_key ] : '';
- $_html_result[] =
- smarty_function_html_checkboxes_output(
- $name,
- $_key,
- $_val,
- $selected,
- $extra,
- $separator,
- $labels,
- $label_ids,
- $_pos,
- $escape
- );
- }
- } else {
- foreach ($values as $_i => $_key) {
- $_val = isset($output[ $_i ]) ? $output[ $_i ] : '';
- $_pos = isset($pos[ $_i ]) ? $pos[ $_i ] : '';
- $_html_result[] =
- smarty_function_html_checkboxes_output(
- $name,
- $_key,
- $_val,
- $selected,
- $extra,
- $separator,
- $labels,
- $label_ids,
- $_pos,
- $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 $pos
- * @param bool $escape
- *
- * @return string
- */
-function smarty_function_html_checkboxes_output(
- $name,
- $value,
- $output,
- $selected,
- $extra,
- $separator,
- $labels,
- $label_ids,
- $pos,
- $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 .= '