diff --git a/.gitattributes b/.gitattributes
index bbf8135e..c6644c99 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8,8 +8,9 @@
# exclude from git export
/tests export-ignore
/utilities export-ignore
+/docker-compose.yml export-ignore
/.github export-ignore
-
+/run_tests_for_all_php_versions.sh export-ignore
/.gitattributes export-ignore
/.gitignore export-ignore
/make-release.sh export-ignore
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e27b60bf..33224fcb 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,8 +1,10 @@
# https://help.github.com/en/categories/automating-your-workflow-with-github-actions
on:
- - pull_request
- - push
+ pull_request:
+ push:
+ branches:
+ - 'master'
name: CI
@@ -29,6 +31,7 @@ jobs:
- "7.4"
- "8.0"
- "8.1"
+ - "8.2"
compiler:
- default
@@ -40,6 +43,9 @@ jobs:
- os: ubuntu-latest
php-version: "8.1"
compiler: jit
+ - os: ubuntu-latest
+ php-version: "8.2"
+ compiler: jit
steps:
- name: Checkout
@@ -69,9 +75,5 @@ jobs:
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
+ run: ./run-tests.sh
diff --git a/.gitignore b/.gitignore
index 5bd891e4..67f0dc51 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,7 +5,6 @@
lexer/*.php
lexer/*.php.bak
lexer/*.out
-utilies/*.php
# Dev
phpunit*
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 93c5cbb7..5b5b0179 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,9 +7,64 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Fixed
+- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP7 notices for undefined array indexes [#736](https://github.com/smarty-php/smarty/issues/736)
+- `$smarty->muteUndefinedOrNullWarnings()` now treats undefined vars and array access of a null or false variables
+ equivalent across all supported PHP versions
+
+## [4.3.0] - 2022-11-22
+
+### Added
+- PHP8.2 compatibility [#775](https://github.com/smarty-php/smarty/pull/775)
+
+### Changed
+- Include docs and demo in the releases [#799](https://github.com/smarty-php/smarty/issues/799)
+- Using PHP functions as modifiers now triggers a deprecation notice because we will drop support for this in the next major release [#813](https://github.com/smarty-php/smarty/issues/813)
+- Dropped remaining references to removed PHP-support in Smarty 4 from docs, lexer and security class. [#816](https://github.com/smarty-php/smarty/issues/816)
+- Support umask when writing (template) files and set dir permissions to 777 [#548](https://github.com/smarty-php/smarty/issues/548) [#819](https://github.com/smarty-php/smarty/issues/819)
+
+### Fixed
+- Output buffer is now cleaned for internal PHP errors as well, not just for Exceptions [#514](https://github.com/smarty-php/smarty/issues/514)
+- Fixed recursion and out of memory errors when caching in complicated template set-ups using inheritance and includes [#801](https://github.com/smarty-php/smarty/pull/801)
+- Fixed PHP8.1 deprecation errors in strip_tags
+- Fix Variable Usage in Exception message when unable to load subtemplate [#808](https://github.com/smarty-php/smarty/pull/808)
+- Fixed PHP8.1 deprecation notices for strftime [#672](https://github.com/smarty-php/smarty/issues/672)
+- Fixed PHP8.1 deprecation errors passing null to parameter in trim [#807](https://github.com/smarty-php/smarty/pull/807)
+- Adapt Smarty upper/lower functions to be codesafe (e.g. for Turkish locale) [#586](https://github.com/smarty-php/smarty/pull/586)
+- Bug fix for underscore and limited length in template name in custom resources [#581](https://github.com/smarty-php/smarty/pull/581)
+
+
+## [4.2.1] - 2022-09-14
+
+### Security
+- Applied appropriate javascript and html escaping in mailto plugin to counter injection attacks [#454](https://github.com/smarty-php/smarty/issues/454)
+
+### Fixed
+- Fixed PHP8.1 deprecation notices in modifiers (upper, explode, number_format and replace) [#755](https://github.com/smarty-php/smarty/pull/755) and [#788](https://github.com/smarty-php/smarty/pull/788)
+- Fixed PHP8.1 deprecation notices in capitalize modifier [#789](https://github.com/smarty-php/smarty/issues/789)
+- Fixed use of `rand()` without a parameter in math function [#794](https://github.com/smarty-php/smarty/issues/794)
+- Fixed unselected year/month/day not working in html_select_date [#395](https://github.com/smarty-php/smarty/issues/395)
+
+## [4.2.0] - 2022-08-01
+
+### Fixed
+- Fixed problems with smarty_mb_str_replace [#549](https://github.com/smarty-php/smarty/issues/549)
+- Fixed second parameter of unescape modifier not working [#777](https://github.com/smarty-php/smarty/issues/777)
+
+### Changed
+- Updated HTML of the debug template [#599](https://github.com/smarty-php/smarty/pull/599)
+
+## [4.1.1] - 2022-05-17
+
+### Security
+- Prevent PHP injection through malicious block name or include file name. This addresses CVE-2022-29221
+
+### Fixed
+- Exclude docs and demo from export and composer [#751](https://github.com/smarty-php/smarty/pull/751)
- PHP 8.1 deprecation notices in demo/plugins/cacheresource.pdo.php [#706](https://github.com/smarty-php/smarty/issues/706)
- PHP 8.1 deprecation notices in truncate modifier [#699](https://github.com/smarty-php/smarty/issues/699)
- Math equation `max(x, y)` didn't work anymore [#721](https://github.com/smarty-php/smarty/issues/721)
+- Fix PHP 8.1 deprecated warning when calling rtrim [#743](https://github.com/smarty-php/smarty/pull/743)
+- PHP 8.1: fix deprecation in escape modifier [#727](https://github.com/smarty-php/smarty/pull/727)
## [4.1.0] - 2022-02-06
diff --git a/README.md b/README.md
index 782f0b2c..0ef3cfab 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,7 @@ Smarty is a template engine for PHP, facilitating the separation of presentation
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
## Requirements
-Smarty can be run with PHP 7.1 to PHP 8.1.
+Smarty can be run with PHP 7.1 to PHP 8.2.
## Installation
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
diff --git a/SECURITY.md b/SECURITY.md
index d98ea018..ae9d5dc8 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -2,7 +2,7 @@
## Supported Versions
-Smarty currently supports the latest minor version of Smarty 3 and Smarty 4. (Smarty 4 has not been released yet.)
+Smarty currently supports the latest minor version of Smarty 3 and Smarty 4.
| Version | Supported |
| ------- | ------------------ |
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 00000000..cc90fb8b
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,45 @@
+version: "2"
+services:
+ base:
+ build:
+ context: .
+ dockerfile: ./utilities/testrunners/php71/Dockerfile
+ volumes:
+ - .:/app
+ working_dir: /app
+ entrypoint: sh ./run-tests.sh
+ php71:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php71/Dockerfile
+ php72:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php72/Dockerfile
+ php73:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php73/Dockerfile
+ php74:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php74/Dockerfile
+ php80:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php80/Dockerfile
+ php81:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php81/Dockerfile
+ php82:
+ extends:
+ service: base
+ build:
+ dockerfile: ./utilities/testrunners/php82/Dockerfile
diff --git a/docs/appendixes/tips.md b/docs/appendixes/tips.md
index b0ea40cc..cdcc56b1 100644
--- a/docs/appendixes/tips.md
+++ b/docs/appendixes/tips.md
@@ -188,67 +188,6 @@ See also [`{html_select_date}`](#language.function.html.select.date),
[`date_format`](#language.modifier.date.format) and
[`$smarty.now`](#language.variables.smarty.now),
-WAP/WML {#tips.wap}
-=======
-
-WAP/WML templates require a php [Content-Type
-header](&url.php-manual;header) to be passed along with the template.
-The easist way to do this would be to write a custom function that
-prints the header. If you are using [caching](#caching), that won\'t
-work so we\'ll do it using the [`{insert}`](#language.function.insert)
-tag; remember `{insert}` tags are not cached! Be sure that there is
-nothing output to the browser before the template, or else the header
-may fail.
-
-
-
-
-
-
-your Smarty template *must* begin with the insert tag :
-
-
- {insert name=header content="Content-Type: text/vnd.wap.wml"}
-
-
-
-
-
-
- Welcome to WAP with Smarty!
- Press OK to continue...
-
- Pretty easy isn't it?
-
- {/foreach}
-
-
-
-See also [`{include}`](#language.function.include),
-[`$trusted_dir`](#variable.trusted.dir),
-[`{php}`](#language.function.php),
-[`{capture}`](#language.function.capture), [template
-resources](#resources) and [componentized
-templates](#tips.componentized.templates)
diff --git a/docs/designers/language-builtin-functions/language-function-include.md b/docs/designers/language-builtin-functions/language-function-include.md
index 956d893e..bda2d802 100644
--- a/docs/designers/language-builtin-functions/language-function-include.md
+++ b/docs/designers/language-builtin-functions/language-function-include.md
@@ -131,7 +131,7 @@ cache lifetime of 500 seconds.
In this example included template will be cached independent of the
-global cahing setting.
+global caching setting.
{include 'sub_template.tpl' caching}
@@ -188,7 +188,5 @@ current template.
-See also [`{include_php}`](#language.function.include.php),
-[`{insert}`](#language.function.insert),
-[`{php}`](#language.function.php), [template resources](#resources) and
+See also [`{insert}`](#language.function.insert), [template resources](#resources) and
[componentized templates](#tips.componentized.templates).
diff --git a/docs/designers/language-builtin-functions/language-function-insert.md b/docs/designers/language-builtin-functions/language-function-insert.md
index e37c7389..e5bc7dcb 100644
--- a/docs/designers/language-builtin-functions/language-function-insert.md
+++ b/docs/designers/language-builtin-functions/language-function-insert.md
@@ -65,7 +65,7 @@ and display the returned results in place of the {insert} tag.
The path can be either absolute, or relative to
[`$trusted_dir`](#variable.trusted.dir). If security is enabled,
then the script must be located in the `$trusted_dir` path of the
- securty policy. See the [Security](#advanced.features.security)
+ security policy. See the [Security](#advanced.features.security)
section for details.
The Smarty object is passed as the second argument. This way you can
diff --git a/docs/designers/language-builtin-functions/language-function-section.md b/docs/designers/language-builtin-functions/language-function-section.md
index 0bab5c71..b28bb924 100644
--- a/docs/designers/language-builtin-functions/language-function-section.md
+++ b/docs/designers/language-builtin-functions/language-function-section.md
@@ -251,8 +251,8 @@ The above example will output:
{section}\'s can be nested as deep as you like. With nested
{section}\'s, you can access complex data structures, such as
-multi-dimensional arrays. This is an example `.php` script thats
-assign\'s the arrays.
+multi-dimensional arrays. This is an example `.php` script that
+assigns the arrays.
> If security is enabled and you are fetching a file from the local
> file system, `{fetch}` will only allow files from within the
- > `$secure_dir` path of the securty policy. See the
+ > `$secure_dir` path of the security policy. See the
> [Security](#advanced.features.security) section for details.
- If the `assign` attribute is set, the output of the `{fetch}`
diff --git a/docs/designers/language-custom-functions/language-function-html-image.md b/docs/designers/language-custom-functions/language-function-html-image.md
index 76740a1f..e21f2a12 100644
--- a/docs/designers/language-custom-functions/language-function-html-image.md
+++ b/docs/designers/language-custom-functions/language-function-html-image.md
@@ -19,7 +19,7 @@ automatically calculated from the image file if they are not supplied.
from. If not given, the web server\'s document root
`$_ENV['DOCUMENT_ROOT']` is used as the base. If security is
enabled, then the image must be located in the `$secure_dir` path of
- the securty policy. See the [Security](#advanced.features.security)
+ the security policy. See the [Security](#advanced.features.security)
section for details.
- `href` is the href value to link the image to. If link is supplied,
diff --git a/docs/designers/language-modifiers.md b/docs/designers/language-modifiers.md
index 4cb69cd1..4626dbe5 100644
--- a/docs/designers/language-modifiers.md
+++ b/docs/designers/language-modifiers.md
@@ -115,7 +115,7 @@ These parameters follow the modifier name and are separated by a `:`
- Secondly - if security is enabled, all php-functions that are to
be used as modifiers have to be declared trusted in the
- `$modifiers` property of the securty policy. See the
+ `$modifiers` property of the security policy. See the
[Security](../programmers/advanced-features/advanced-features-security.md) section for details.
See also [`registerPlugin()`](../programmers/api-functions/api-register-plugin.md), [combining
diff --git a/docs/designers/language-modifiers/language-modifier-from-charset.md b/docs/designers/language-modifiers/language-modifier-from-charset.md
index 8b7fdd50..1c301c3b 100644
--- a/docs/designers/language-modifiers/language-modifier-from-charset.md
+++ b/docs/designers/language-modifiers/language-modifier-from-charset.md
@@ -15,5 +15,5 @@ modifier](#language.modifier.to_charset).
> modifier should only be used in cases where the application cannot
> anticipate that a certain string is required in another encoding.
-See also [Charset Enconding](#charset), [from\_charset
+See also [Charset Encoding](#charset), [from\_charset
modifier](#language.modifier.from_charset).
diff --git a/docs/designers/language-modifiers/language-modifier-to-charset.md b/docs/designers/language-modifiers/language-modifier-to-charset.md
index 6c53232c..a0d95f53 100644
--- a/docs/designers/language-modifiers/language-modifier-to-charset.md
+++ b/docs/designers/language-modifiers/language-modifier-to-charset.md
@@ -15,5 +15,5 @@ modifier](#language.modifier.from_charset).
> modifier should only be used in cases where the application cannot
> anticipate that a certain string is required in another encoding.
-See also [Charset Enconding](#charset), [from\_charset
+See also [Charset Encoding](#charset), [from\_charset
modifier](#language.modifier.from_charset).
diff --git a/docs/designers/language-variables/language-variables-smarty.md b/docs/designers/language-variables/language-variables-smarty.md
index f9aa2330..e2949e0e 100644
--- a/docs/designers/language-variables/language-variables-smarty.md
+++ b/docs/designers/language-variables/language-variables-smarty.md
@@ -157,13 +157,13 @@ Returns the version of Smarty the template was compiled with.
----------------------
Returns block text from child template. See [Template
-interitance](#advanced.features.template.inheritance).
+inheritance](#advanced.features.template.inheritance).
{\$smarty.block.parent} {#language.variables.smarty.block.parent}
-----------------------
Returns block text from parent template. See [Template
-interitance](#advanced.features.template.inheritance)
+inheritance](#advanced.features.template.inheritance)
{\$smarty.ldelim}, {\$smarty.rdelim} {#language.variables.smarty.ldelim}
------------------------------------
diff --git a/docs/getting-started.md b/docs/getting-started.md
index de55ffe8..2a1391f4 100644
--- a/docs/getting-started.md
+++ b/docs/getting-started.md
@@ -2,7 +2,7 @@ What is Smarty?
==============
## Requirements
-Smarty can be run with PHP 7.1 to PHP 8.1.
+Smarty can be run with PHP 7.1 to PHP 8.2.
## Installation
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
diff --git a/docs/programmers/advanced-features/advanced-features-objects.md b/docs/programmers/advanced-features/advanced-features-objects.md
index 6b4870b5..88bd647a 100644
--- a/docs/programmers/advanced-features/advanced-features-objects.md
+++ b/docs/programmers/advanced-features/advanced-features-objects.md
@@ -29,7 +29,7 @@ determined by your needs, but use the first method whenever possible to
keep template syntax to a minimum.
If security is enabled, no private methods or functions can be accessed
-(beginningwith \'\_\'). If a method and property of the same name exist,
+(beginning with \'\_\'). If a method and property of the same name exist,
the method will be used.
You can restrict the methods and properties that can be accessed by
diff --git a/docs/programmers/advanced-features/advanced-features-security.md b/docs/programmers/advanced-features/advanced-features-security.md
index 98817a43..730915f1 100644
--- a/docs/programmers/advanced-features/advanced-features-security.md
+++ b/docs/programmers/advanced-features/advanced-features-security.md
@@ -2,36 +2,20 @@ Security {#advanced.features.security}
========
Security is good for situations when you have untrusted parties editing
-the templates eg via ftp, and you want to reduce the risk of system
+the templates e.g. via ftp, and you want to reduce the risk of system
security compromises through the template language.
The settings of the security policy are defined by properties of an
instance of the Smarty\_Security class. These are the possible settings:
-- `$php_handling` determines how Smarty to handle PHP code embedded in
- templates. Possible values are:
-
- - Smarty::PHP\_PASSTHRU -\> echo PHP tags as they are
-
- - Smarty::PHP\_QUOTE -\> escape tags as entities
-
- - Smarty::PHP\_REMOVE -\> remove php tags
-
- - Smarty::PHP\_ALLOW -\> execute php tags
-
- The default value is Smarty::PHP\_PASSTHRU.
-
- If security is enabled the [`$php_handling`](#variable.php.handling)
- setting of the Smarty object is not checked for security.
-
- `$secure_dir` is an array of template directories that are
considered secure. [`$template_dir`](#variable.template.dir)
- concidered secure implicitly. The default is an empty array.
+ considered secure implicitly. The default is an empty array.
- `$trusted_dir` is an array of all directories that are considered
trusted. Trusted directories are where you keep php scripts that are
executed directly from the templates with
- [`{include_php}`](#language.function.include.php). The default is an
+ [`{insert}`](#language.function.insert.php). The default is an
empty array.
- `$trusted_uri` is an array of regular expressions matching URIs that
@@ -43,7 +27,7 @@ instance of the Smarty\_Security class. These are the possible settings:
like authentication-tokens).
The expression `'#https?://.*smarty.net$#i'` would allow accessing
- the follwing URIs:
+ the following URIs:
- `http://smarty.net/foo`
@@ -110,12 +94,8 @@ instance of the Smarty\_Security class. These are the possible settings:
super globals can be accessed by the template. The default is
\"true\".
-- `$allow_php_tag` is a boolean flag which controls if {php} and
- {include\_php} tags can be used by the template. The default is
- \"false\".
-
If security is enabled, no private methods, functions or properties of
-static classes or assigned objects can be accessed (beginningwith
+static classes or assigned objects can be accessed (beginning with
\'\_\') by the template.
To customize the security policy settings you can extend the
@@ -128,8 +108,6 @@ Smarty\_Security class or create an instance of it.
class My_Security_Policy extends Smarty_Security {
// disable all PHP functions
public $php_functions = null;
- // remove PHP tags
- public $php_handling = Smarty::PHP_REMOVE;
// allow everthing as modifier
public $php_modifiers = array();
}
@@ -145,8 +123,6 @@ Smarty\_Security class or create an instance of it.
$my_security_policy = new Smarty_Security($smarty);
// disable all PHP functions
$my_security_policy->php_functions = null;
- // remove PHP tags
- $my_security_policy->php_handling = Smarty::PHP_REMOVE;
// allow everthing as modifier
$my_security_policy->php_modifiers = array();
// enable security
@@ -164,5 +140,5 @@ Smarty\_Security class or create an instance of it.
> **Note**
>
> Most security policy settings are only checked when the template gets
-> compiled. For that reasion you should delete all cached and compiled
+> compiled. For that reason you should delete all cached and compiled
> template files when you change your security settings.
diff --git a/docs/programmers/advanced-features/advanced-features-template-inheritance.md b/docs/programmers/advanced-features/advanced-features-template-inheritance.md
index 25295c38..ce47310c 100644
--- a/docs/programmers/advanced-features/advanced-features-template-inheritance.md
+++ b/docs/programmers/advanced-features/advanced-features-template-inheritance.md
@@ -33,7 +33,7 @@ can override all or some of the parent named block areas.
you can define the whole template inheritance tree in the PHP script
when you are calling [`fetch()`](#api.fetch) or
[`display()`](#api.display) with the `extends:` template resource
- type. The later provides even more flexibillity.
+ type. The later provides even more flexibility.
> **Note**
>
diff --git a/docs/programmers/advanced-features/advanced-features-template-settings.md b/docs/programmers/advanced-features/advanced-features-template-settings.md
index df1f86a8..b06430ff 100644
--- a/docs/programmers/advanced-features/advanced-features-template-settings.md
+++ b/docs/programmers/advanced-features/advanced-features-template-settings.md
@@ -8,7 +8,7 @@ Modifications done to the Smarty object will be global for all
templates.
However the Smarty class variables and functions can be accessed or
-called by induvidual template objects. Modification done to a template
+called by individual template objects. Modification done to a template
object will apply only for that template and its included subtemplates.
diff --git a/docs/programmers/api-functions/api-create-data.md b/docs/programmers/api-functions/api-create-data.md
index 2d9f281b..7e083776 100644
--- a/docs/programmers/api-functions/api-create-data.md
+++ b/docs/programmers/api-functions/api-create-data.md
@@ -26,7 +26,7 @@ the following parameters:
variables assigned to any of the objects in it\'s parent chain.
Data objects are used to create scopes for assigned variables. They can
-be used to have controll which variables are seen by which templates.
+be used to control which variables are seen by which templates.
**Note**
->
-> Embedding PHP code into templates is highly discouraged. Use [custom
-> functions](#plugins.functions) or [modifiers](#plugins.modifiers)
-> instead.
diff --git a/docs/programmers/api-variables/variable-trusted-dir.md b/docs/programmers/api-variables/variable-trusted-dir.md
index 3d1a308f..9720ae8a 100644
--- a/docs/programmers/api-variables/variable-trusted-dir.md
+++ b/docs/programmers/api-variables/variable-trusted-dir.md
@@ -5,4 +5,4 @@
array of all directories that are considered trusted. Trusted
directories are where you keep php scripts that are executed directly
from the templates with
-[`{include_php}`](#language.function.include.php).
+[`{insert}`](#language.function.insert.php).
diff --git a/docs/programmers/api-variables/variable-use-sub-dirs.md b/docs/programmers/api-variables/variable-use-sub-dirs.md
index a95ac415..d973c240 100644
--- a/docs/programmers/api-variables/variable-use-sub-dirs.md
+++ b/docs/programmers/api-variables/variable-use-sub-dirs.md
@@ -10,7 +10,7 @@ environments do not allow PHP processes to create directories, so this
must be disabled which is the default.
Sub directories are more efficient, so use them if you can.
-Theoretically you get much better perfomance on a filesystem with 10
+Theoretically you get much better performance on a filesystem with 10
directories each having 100 files, than with 1 directory having 1000
files. This was certainly the case with Solaris 7 (UFS)\... with newer
filesystems such as ext3 and especially reiserfs, the difference is
diff --git a/docs/programmers/caching/caching-groups.md b/docs/programmers/caching/caching-groups.md
index 98e5d45c..7e248b2f 100644
--- a/docs/programmers/caching/caching-groups.md
+++ b/docs/programmers/caching/caching-groups.md
@@ -25,10 +25,10 @@ like.
- You CANNOT remove a specified template name under multiple cache
groups such as `'/a/b/*/foo.tpl'`, the cache grouping works
left-to-right ONLY. You will need to group your templates under a
- single cache group heirarchy to be able to clear them as a group.
+ single cache group hierarchy to be able to clear them as a group.
Cache grouping should not be confused with your template directory
-heirarchy, the cache grouping has no knowledge of how your templates are
+hierarchy, the cache grouping has no knowledge of how your templates are
structured. So for example, if you have a template structure like
`themes/blue/index.tpl` and you want to be able to clear all the cache
files for the "blue" theme, you will need to create a cache group
diff --git a/docs/programmers/charset.md b/docs/programmers/charset.md
index 72842b3f..9dedf4dc 100644
--- a/docs/programmers/charset.md
+++ b/docs/programmers/charset.md
@@ -5,17 +5,17 @@ Charset Encoding {#charset.encoding}
================
There are a variety of encodings for textual data, ISO-8859-1 (Latin1)
-and UTF-8 being the most popular. Unless specified otherwise with the
-`SMARTY_RESOURCE_CHAR_SET` constant, Smarty recognizes `UTF-8` as the
-internal charset if [Multibyte String](https://www.php.net/mbstring) is
-available, `ISO-8859-1` if not.
+and UTF-8 being the most popular. Unless you change `Smarty::$_CHARSET`,
+Smarty recognizes `UTF-8` as the internal charset if
+[Multibyte String](https://www.php.net/mbstring) is available,
+`ISO-8859-1` if not.
> **Note**
>
> `ISO-8859-1` has been PHP\'s default internal charset since the
> beginning. Unicode has been evolving since 1991. Since then it has
> become the one charset to conquer them all, as it is capable of
-> encoding most of the known characters even accross different character
+> encoding most of the known characters even across different character
> systems (latin, cyrillic, japanese, ...). `UTF-8` is unicode\'s most
> used encoding, as it allows referencing the thousands of character
> with the smallest size overhead possible.
@@ -36,8 +36,9 @@ available, `ISO-8859-1` if not.
if (function_exists('mb_internal_charset')) {
mb_internal_charset('EUC-JP');
}
- define('SMARTY_RESOURCE_CHAR_SET', 'EUC-JP');
+
require_once 'libs/Smarty.class.php';
+ Smarty::$_CHARSET = 'EUC-JP';
$smarty = new Smarty();
diff --git a/docs/programmers/resources/resources-extends.md b/docs/programmers/resources/resources-extends.md
index ad2e8f5d..d7213d89 100644
--- a/docs/programmers/resources/resources-extends.md
+++ b/docs/programmers/resources/resources-extends.md
@@ -3,20 +3,20 @@ Extends Template Resources {#resources.extends}
The `extends:` resource is used to define child/parent relationships for
template inheritance from the PHP script. For details see section of
-[Template Interitance](#advanced.features.template.inheritance).
+[Template Inheritance](#advanced.features.template.inheritance).
As of Smarty 3.1 the `extends:` resource may use any available [template
resource](#resources), including `string:` and `eval:`. When [templates
from strings](#resources.string) are used, make sure they are properly
(url or base64) encoded. Is an `eval:` resource found within an
inheritance chain, its \"don\'t save a compile file\" property is
-superseeded by the `extends:` resource. The templates within an
+superseded by the `extends:` resource. The templates within an
inheritance chain are not compiled separately, though. Only a single
compiled template will be generated.
> **Note**
>
-> Use this when inheritance is required programatically. When inheriting
+> Use this when inheritance is required programmatically. When inheriting
> within PHP, it is not obvious from the child template what inheritance
> took place. If you have a choice, it is normally more flexible and
> intuitive to handle inheritance chains from within the templates.
diff --git a/docs/programmers/resources/resources-file.md b/docs/programmers/resources/resources-file.md
index 986cfffc..e49f4737 100644
--- a/docs/programmers/resources/resources-file.md
+++ b/docs/programmers/resources/resources-file.md
@@ -47,7 +47,7 @@ Templates from a specific \$template\_dir {#templates.from.specified.template.di
Smarty 3.1 introduced the bracket-syntax for specifying an element from
[`$template_dir`](#variable.template.dir). This allows websites
employing multiple sets of templates better control over which template
-to acces.
+to access.
The bracket-syntax can be used from anywhere you can specify the `file:`
resource type.
diff --git a/docs/programmers/smarty-constants.md b/docs/programmers/smarty-constants.md
index 042ea5e3..de04e1b5 100644
--- a/docs/programmers/smarty-constants.md
+++ b/docs/programmers/smarty-constants.md
@@ -23,5 +23,4 @@ to determine the appropriate value automatically. If defined, the path
-See also [`$smarty.const`](../designers/language-variables/language-variables-smarty.md) and
-[`$php_handling constants`](./api-variables/variable-php-handling.md)
+See also [`$smarty.const`](../designers/language-variables/language-variables-smarty.md).
diff --git a/lexer/smarty_internal_templatelexer.plex b/lexer/smarty_internal_templatelexer.plex
index 67c840d7..2cd46df9 100644
--- a/lexer/smarty_internal_templatelexer.plex
+++ b/lexer/smarty_internal_templatelexer.plex
@@ -161,7 +161,6 @@ class Smarty_Internal_Templatelexer
'COMMENT' => 'comment',
'AS' => 'as',
'TO' => 'to',
- 'PHP' => '" '"<", "==" ... logical operator',
'TLOGOP' => '"lt", "eq" ... logical operator; "is div by" ... if condition',
'SCOND' => '"is even" ... if condition',
diff --git a/libs/Autoloader.php b/libs/Autoloader.php
index 1673ce2f..da7e32ab 100644
--- a/libs/Autoloader.php
+++ b/libs/Autoloader.php
@@ -5,6 +5,11 @@
* @package Smarty
*/
+
+if (!defined('SMARTY_HELPER_FUNCTIONS_LOADED')) {
+ include __DIR__ . '/functions.php';
+}
+
/**
* Smarty Autoloader
*
@@ -73,7 +78,7 @@ class Smarty_Autoloader
*/
public static function register($prepend = false)
{
- self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR;
+ self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : __DIR__ . DIRECTORY_SEPARATOR;
self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR :
self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR;
spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
@@ -89,7 +94,7 @@ class Smarty_Autoloader
if ($class[ 0 ] !== 'S' || strpos($class, 'Smarty') !== 0) {
return;
}
- $_class = strtolower($class);
+ $_class = smarty_strtolower_ascii($class);
if (isset(self::$rootClasses[ $_class ])) {
$file = self::$SMARTY_DIR . self::$rootClasses[ $_class ];
if (is_file($file)) {
diff --git a/libs/Smarty.class.php b/libs/Smarty.class.php
index 0abbe6a7..5351b579 100644
--- a/libs/Smarty.class.php
+++ b/libs/Smarty.class.php
@@ -36,7 +36,7 @@ if (!defined('SMARTY_DIR')) {
/**
*
*/
- define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
+ define('SMARTY_DIR', __DIR__ . DIRECTORY_SEPARATOR);
}
/**
* set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins.
@@ -60,12 +60,21 @@ if (!defined('SMARTY_MBSTRING')) {
*/
define('SMARTY_MBSTRING', function_exists('mb_get_info'));
}
+
+/**
+ * Load helper functions
+ */
+if (!defined('SMARTY_HELPER_FUNCTIONS_LOADED')) {
+ include __DIR__ . '/functions.php';
+}
+
/**
* Load Smarty_Autoloader
*/
if (!class_exists('Smarty_Autoloader')) {
- include dirname(__FILE__) . '/bootstrap.php';
+ include __DIR__ . '/bootstrap.php';
}
+
/**
* Load always needed external class files
*/
@@ -98,7 +107,7 @@ class Smarty extends Smarty_Internal_TemplateBase
/**
* smarty version
*/
- const SMARTY_VERSION = '4.1.0';
+ const SMARTY_VERSION = '4.3.0';
/**
* define variable scopes
*/
@@ -867,7 +876,7 @@ class Smarty extends Smarty_Internal_TemplateBase
$this->plugins_dir = (array)$this->plugins_dir;
}
foreach ($this->plugins_dir as $k => $v) {
- $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v, '/\\') . DIRECTORY_SEPARATOR, true);
+ $this->plugins_dir[ $k ] = $this->_realpath(rtrim($v ?? '', '/\\') . DIRECTORY_SEPARATOR, true);
}
$this->_cache[ 'plugin_files' ] = array();
$this->_pluginsDirNormalized = true;
@@ -1345,7 +1354,7 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
private function _normalizeDir($dirName, $dir)
{
- $this->{$dirName} = $this->_realpath(rtrim($dir, "/\\") . DIRECTORY_SEPARATOR, true);
+ $this->{$dirName} = $this->_realpath(rtrim($dir ?? '', "/\\") . DIRECTORY_SEPARATOR, true);
}
/**
@@ -1367,7 +1376,7 @@ class Smarty extends Smarty_Internal_TemplateBase
}
foreach ($dir as $k => $v) {
if (!isset($processed[ $k ])) {
- $dir[ $k ] = $v = $this->_realpath(rtrim($v, "/\\") . DIRECTORY_SEPARATOR, true);
+ $dir[ $k ] = $v = $this->_realpath(rtrim($v ?? '', "/\\") . DIRECTORY_SEPARATOR, true);
$processed[ $k ] = true;
}
}
@@ -1377,8 +1386,7 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
- * Activates PHP7 compatibility mode:
- * - converts E_WARNINGS for "undefined array key" and "trying to read property of null" errors to E_NOTICE
+ * Mutes errors for "undefined index", "undefined array key" and "trying to read property of null".
*
* @void
*/
@@ -1387,7 +1395,7 @@ class Smarty extends Smarty_Internal_TemplateBase
}
/**
- * Indicates if PHP7 compatibility mode is set.
+ * Indicates if Smarty will mute errors for "undefined index", "undefined array key" and "trying to read property of null".
* @bool
*/
public function isMutingUndefinedOrNullWarnings(): bool {
diff --git a/libs/bootstrap.php b/libs/bootstrap.php
index 2c830468..a226ac04 100644
--- a/libs/bootstrap.php
+++ b/libs/bootstrap.php
@@ -11,6 +11,6 @@
* Load and register Smarty Autoloader
*/
if (!class_exists('Smarty_Autoloader')) {
- include dirname(__FILE__) . '/Autoloader.php';
+ include __DIR__ . '/Autoloader.php';
}
Smarty_Autoloader::register(true);
diff --git a/libs/debug.tpl b/libs/debug.tpl
index edc7bef9..4f82a582 100644
--- a/libs/debug.tpl
+++ b/libs/debug.tpl
@@ -1,9 +1,9 @@
{capture name='_smarty_debug' assign=debug_output}
-
-
+
+
${$vars@key}- {if isset($vars['nocache'])}Nocache{/if} - {if isset($vars['scope'])}Origin: {$vars['scope']|debug_print_var nofilter}{/if} + | ||||
+ ${$vars@key}+ {if isset($vars['nocache'])}Nocache{/if} + {if isset($vars['scope'])}Origin: {$vars['scope']|debug_print_var nofilter}{/if} + |
+
+ Value+ {$vars['value']|debug_print_var:10:80 nofilter} + |
+
+ {if isset($vars['attributes'])}
+ Attributes+ {$vars['attributes']|debug_print_var nofilter} + {/if} |
- Value{$vars['value']|debug_print_var:10:80 nofilter} |
- {if isset($vars['attributes'])}Attributes{$vars['attributes']|debug_print_var nofilter} {/if} |
{/foreach}
#{$vars@key}#- {if isset($vars['scope'])}Origin: {$vars['scope']|debug_print_var nofilter}{/if} + | ||
+ #{$vars@key}#+ {if isset($vars['scope'])}Origin: {$vars['scope']|debug_print_var nofilter}{/if} + |
+ + {$vars['value']|debug_print_var:10:80 nofilter} | -{$vars['value']|debug_print_var:10:80 nofilter} |