mirror of
https://github.com/smarty-php/smarty.git
synced 2026-08-04 12:34:33 +02:00
Compare commits
39 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ccc9543632 | |||
| 43a3bc942a | |||
| e161babbd4 | |||
| f8e63fc480 | |||
| 82397ec7f0 | |||
| 17da1f585e | |||
| 293bc20db0 | |||
| 818b96ffbd | |||
| 7b5ec8a065 | |||
| 4af5cc760d | |||
| 41d80b99ac | |||
| 2b0ba0eabc | |||
| 66edb56911 | |||
| 15e48b6af3 | |||
| d5adea5863 | |||
| 8041d0a4e8 | |||
| 94d9861d29 | |||
| 63ff7d81e0 | |||
| e6b6a0cbb2 | |||
| 0912124c33 | |||
| c0306d9942 | |||
| 3fff0813e8 | |||
| 3714d9ad8d | |||
| 1820e875dc | |||
| a112c7446c | |||
| aab7f3db71 | |||
| 08c90664f0 | |||
| f2a66365de | |||
| c338585791 | |||
| c011891247 | |||
| 6ca6f72750 | |||
| 39c150ae58 | |||
| 58991f3f63 | |||
| 4038fa615b | |||
| 198338e2a2 | |||
| bc4e70f2c0 | |||
| b28b85dbf4 | |||
| ad73f4943b | |||
| 4d22803c32 |
@@ -31,6 +31,7 @@ jobs:
|
||||
- "8.0"
|
||||
- "8.1"
|
||||
- "8.2"
|
||||
- "8.3"
|
||||
|
||||
compiler:
|
||||
- default
|
||||
@@ -45,6 +46,9 @@ jobs:
|
||||
- os: ubuntu-latest
|
||||
php-version: "8.2"
|
||||
compiler: jit
|
||||
- os: ubuntu-latest
|
||||
php-version: "8.3"
|
||||
compiler: jit
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
|
||||
+32
-1
@@ -6,9 +6,39 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [5.0.0] - 2024-03-25
|
||||
- Fixed that scoped variables would overwrite parent scope [#952](https://github.com/smarty-php/smarty/issues/952)
|
||||
- Removed publicly accessible `$tpl->_var_stack` variable
|
||||
|
||||
|
||||
### Fixed
|
||||
- Too many shorthand attributes error when using a modifier as a function with more than 3 parameters in an expression [#949](https://github.com/smarty-php/smarty/issues/949)
|
||||
|
||||
### Removed
|
||||
- Dropped support for undocumented `{time()}` added in v5.0.0 since we already have the documented `{$smarty.now}`
|
||||
|
||||
## [5.0.0-rc3] - 2024-02-26
|
||||
|
||||
### Added
|
||||
- PHP8.3 support [#925](https://github.com/smarty-php/smarty/issues/925)
|
||||
- Backlink to GitHub in docs
|
||||
- Explain how to do escaping and set-up auto-escaping in docs [#865](https://github.com/smarty-php/smarty/issues/865)
|
||||
- Link to variable scope page in the documentation for the assign tag [#878](https://github.com/smarty-php/smarty/issues/878)
|
||||
- Add support for implode, substr and json_encode as modifiers/functions in templates [#939](https://github.com/smarty-php/smarty/issues/939)
|
||||
- Add template path to CompilerException to enable rich debug features [#935](https://github.com/smarty-php/smarty/issues/935)
|
||||
|
||||
### Fixed
|
||||
- The {debug} tag was broken in v5 [#922](https://github.com/smarty-php/smarty/issues/922)
|
||||
- Documentation on `{if $x is even by $y}` syntax
|
||||
- Fix incorrect compilation of expressions when escape_html=true [#930](https://github.com/smarty-php/smarty/pull/930)
|
||||
|
||||
## [5.0.0-rc2] - 2023-11-11
|
||||
|
||||
### Fixed
|
||||
- Registered output filters wouldn't run [#899](https://github.com/smarty-php/smarty/issues/899)
|
||||
- Use of negative numbers in {math} equations [#895](https://github.com/smarty-php/smarty/issues/895)
|
||||
- Do not auto-html-escape custom function results [#906](https://github.com/smarty-php/smarty/issues/906)
|
||||
- Fix case-sensitive tag names [#907](https://github.com/smarty-php/smarty/issues/907)
|
||||
|
||||
### Removed
|
||||
- Removed `$smarty->registered_filters` array
|
||||
@@ -35,7 +65,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
multibyte extension for optimal performance.
|
||||
- Smarty no longer calls `mb_internal_encoding()` and doesn't check for deprecated `mbstring.func_overload` ini directive [#480](https://github.com/smarty-php/smarty/issues/480)
|
||||
- Generated `<script>` tags lo longer have deprecated `type="text/javascript"` or `language="Javascript"` attributes [#815](https://github.com/smarty-php/smarty/issues/815)
|
||||
- Smarty will throw a compiler exception insteadd of silently ignoring a modifier on a function call, like this: `{include|dot:"x-template-id" file="included.dot.tpl"}` [#526](https://github.com/smarty-php/smarty/issues/526)
|
||||
- Smarty will throw a compiler exception instead of silently ignoring a modifier on a function call, like this: `{include|dot:"x-template-id" file="included.dot.tpl"}` [#526](https://github.com/smarty-php/smarty/issues/526)
|
||||
- The documentation was largely rewritten
|
||||
|
||||
### Deprecated
|
||||
@@ -67,6 +97,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Removed constants such as SMARTY_DIR to prevent global side effects.
|
||||
- Removed direct access to `$smarty->template_dir`. Use `$smarty->setTemplateDir()`.
|
||||
- Removed direct access to `$smarty->cache_dir`. Use `$smarty->setCacheDir()`.
|
||||
- Removed direct access to `$smarty->compile_dir`. Use `$smarty->setCompileDir()`.
|
||||
- Removed `$smarty->loadPlugin()`, use `$smarty->registerPlugin()` instead.
|
||||
- Removed `$smarty->appendByRef()` and `$smarty->assignByRef()`.
|
||||
- Removed `$smarty->_current_file`
|
||||
|
||||
@@ -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 v5 can be run with PHP 7.2 to PHP 8.2.
|
||||
Smarty v5 can be run with PHP 7.2 to PHP 8.3.
|
||||
|
||||
## Installation
|
||||
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
|
||||
|
||||
@@ -29,5 +29,4 @@
|
||||
|
||||
## Unrelated / other
|
||||
- review (and avoid) use of 'clone' keyword
|
||||
- compiler->has_code seems silly. Why not have proper return values?
|
||||
- what is 'user literal support', why are unit tests skipped?
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
- Internal compiler classes always return a string (the internal has_code flag has been removed for simplicity) [#918](https://github.com/smarty-php/smarty/pull/918)
|
||||
+37
-1
@@ -5,7 +5,7 @@ services:
|
||||
context: .
|
||||
dockerfile: ./utilities/testrunners/php72/Dockerfile
|
||||
volumes:
|
||||
- .:/app
|
||||
- smarty-code:/app
|
||||
working_dir: /app
|
||||
php72:
|
||||
extends:
|
||||
@@ -37,3 +37,39 @@ services:
|
||||
service: base
|
||||
build:
|
||||
dockerfile: ./utilities/testrunners/php82/Dockerfile
|
||||
php83:
|
||||
extends:
|
||||
service: base
|
||||
build:
|
||||
dockerfile: ./utilities/testrunners/php83/Dockerfile
|
||||
volumes:
|
||||
smarty-code:
|
||||
|
||||
x-mutagen:
|
||||
sync:
|
||||
defaults:
|
||||
symlink:
|
||||
mode: "posix-raw"
|
||||
ignore:
|
||||
vcs: true
|
||||
paths:
|
||||
- ".docker"
|
||||
- ".env.docker"
|
||||
- ".bundles"
|
||||
- "docker-compose.yml"
|
||||
- ".idea"
|
||||
- ".DS_Store"
|
||||
mode: "two-way-resolved"
|
||||
configurationBeta:
|
||||
permissions:
|
||||
defaultOwner: "id:${APP_USER_ID}"
|
||||
defaultGroup: "id:${APP_GROUP_ID}"
|
||||
defaultFileMode: 0666
|
||||
defaultDirectoryMode: 0755
|
||||
permissions:
|
||||
defaultOwner: "id:${APP_USER_ID}"
|
||||
defaultGroup: "id:${APP_GROUP_ID}"
|
||||
smarty-code:
|
||||
alpha: "."
|
||||
beta: "volume://smarty-code"
|
||||
|
||||
|
||||
+2
-1
@@ -89,4 +89,5 @@ Run this, and you will see:
|
||||
```
|
||||
|
||||
Note how the [escape modifier](../designers/language-modifiers/language-modifier-escape.md)
|
||||
translated the `&` character into the proper HTML syntax `&`.
|
||||
translated the `&` character into the proper HTML syntax `&`.
|
||||
Read more about auto-escaping in the [next section](./configuring.md).
|
||||
@@ -122,6 +122,24 @@ $smarty->setCacheDir('/data/caches');
|
||||
$cacheDir = $smarty->getCacheDir();
|
||||
```
|
||||
|
||||
## Enabling auto-escaping
|
||||
By default, Smarty does not escape anything you render in your templates. If you use
|
||||
Smarty to render a HTML-page, this means that you will have to make sure that you do
|
||||
not render any characters that have a special meaning in HTML, such as `&`, `<` and `>`,
|
||||
or apply the [escape modifier](../designers/language-modifiers/language-modifier-escape.md)
|
||||
to anything you want to render.
|
||||
|
||||
If you forget to do so, you may break your HTML page, or even create a vulnerability for
|
||||
attacks known as [XSS or Cross Site Scripting](https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html).
|
||||
|
||||
Luckily, you can tell Smarty to automatically apply the escape modifier to any dynamic part of your template.
|
||||
It's like Smarty magically adds `|escape` to every variable you use on a web page.
|
||||
|
||||
Enable auto-escaping for HTML as follows:
|
||||
```php
|
||||
$smarty->setEscapeHtml(true);
|
||||
```
|
||||
|
||||
## Disabling compile check
|
||||
By default, Smarty tests to see if the
|
||||
current template has changed since the last time
|
||||
|
||||
@@ -88,9 +88,6 @@ Object chaining:
|
||||
|
||||
{$object->method1($x)->method2($y)}
|
||||
|
||||
Direct PHP function access:
|
||||
|
||||
{time()}
|
||||
```
|
||||
|
||||
> **Note**
|
||||
|
||||
@@ -8,12 +8,12 @@ execution of a template**.
|
||||
|----------------|------------|-----------------------------------------------------------------------|
|
||||
| var | | The name of the variable being assigned |
|
||||
| value | | The value being assigned |
|
||||
| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
|
||||
| scope | (optional) | The scope of the assigned variable: 'parent','root' or 'global' |
|
||||
|
||||
## Attributes of the {$var=...} syntax
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|------------|-----------------------------------------------------------------------|
|
||||
| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
|
||||
| scope | (optional) | The scope of the assigned variable: 'parent','root' or 'global' |
|
||||
|
||||
## Option Flags
|
||||
| Name | Description |
|
||||
@@ -102,6 +102,8 @@ A global variable is seen by all templates.
|
||||
{$foo="bar" scope="global"}
|
||||
```
|
||||
|
||||
For more information on variable scope, please read the page on [variable scopes](../language-variables/language-variable-scopes.md).
|
||||
|
||||
To access `{assign}` variables from a php script use
|
||||
[`getTemplateVars()`](../../programmers/api-functions/api-get-template-vars.md).
|
||||
Here's the template that creates the variable `$foo`.
|
||||
|
||||
@@ -252,7 +252,7 @@ iteration.
|
||||
|
||||
```smarty
|
||||
{foreach $myNames as $name}
|
||||
{if $name@iteration is even by 3}
|
||||
{if $name@index is even by 3}
|
||||
<span style="color: #000">{$name}</span>
|
||||
{else}
|
||||
<span style="color: #eee">{$name}</span>
|
||||
|
||||
@@ -85,11 +85,11 @@ The template above includes the example `links.tpl` below
|
||||
|
||||
```smarty
|
||||
<div id="box">
|
||||
<h3>{$title}{/h3>
|
||||
<h3>{$title}</h3>
|
||||
<ul>
|
||||
{foreach from=$links item=l}
|
||||
.. do stuff ...
|
||||
</foreach}
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
```
|
||||
|
||||
@@ -326,10 +326,10 @@ The template to output the database result in a HTML table
|
||||
|
||||
```smarty
|
||||
<table>
|
||||
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
<tr><th> </th><th>Name</th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
{section name=co loop=$contacts}
|
||||
<tr>
|
||||
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
|
||||
<td><a href="view.php?id={$contacts[co].id}">view</a></td>
|
||||
<td>{$contacts[co].name}</td>
|
||||
<td>{$contacts[co].home}</td>
|
||||
<td>{$contacts[co].cell}</td>
|
||||
@@ -465,7 +465,7 @@ header block every five rows.
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is div by 5}
|
||||
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
<tr><th> </th><th>Name</th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
{/if}
|
||||
<tr>
|
||||
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
|
||||
@@ -478,13 +478,13 @@ header block every five rows.
|
||||
</table>
|
||||
```
|
||||
|
||||
An example that uses the `iteration` property to alternate a text color every
|
||||
An example that uses the `index` property to alternate a text color every
|
||||
third row.
|
||||
|
||||
```smarty
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is even by 3}
|
||||
{if $smarty.section.co.index is even by 3}
|
||||
<span style="color: #ffffff">{$contacts[co].name}</span>
|
||||
{else}
|
||||
<span style="color: #dddddd">{$contacts[co].name}</span>
|
||||
|
||||
@@ -6,34 +6,10 @@ or strings. To apply a modifier,
|
||||
specify the value followed by a `|` (pipe) and the modifier name. A
|
||||
modifier may accept additional parameters that affect its behavior.
|
||||
These parameters follow the modifier name and are separated by a `:`
|
||||
(colon). Also, *all php-functions can be used as modifiers implicitly*
|
||||
(more below) and modifiers can be
|
||||
[combined](../language-combining-modifiers.md).
|
||||
(colon).
|
||||
|
||||
- [capitalize](language-modifier-capitalize.md)
|
||||
- [cat](language-modifier-cat.md)
|
||||
- [count_characters](language-modifier-count-characters.md)
|
||||
- [count_paragraphs](language-modifier-count-paragraphs.md)
|
||||
- [count_sentences](language-modifier-count-sentences.md)
|
||||
- [count_words](language-modifier-count-words.md)
|
||||
- [date_format](language-modifier-date-format.md)
|
||||
- [default](language-modifier-default.md)
|
||||
- [escape](language-modifier-escape.md)
|
||||
- [from_charset](language-modifier-from-charset.md)
|
||||
- [indent](language-modifier-indent.md)
|
||||
- [lower](language-modifier-lower.md)
|
||||
- [nl2br](language-modifier-nl2br.md)
|
||||
- [regex_replace](language-modifier-regex-replace.md)
|
||||
- [replace](language-modifier-replace.md)
|
||||
- [spacify](language-modifier-spacify.md)
|
||||
- [string_format](language-modifier-string-format.md)
|
||||
- [strip](language-modifier-strip.md)
|
||||
- [strip_tags](language-modifier-strip-tags.md)
|
||||
- [to_charset](language-modifier-to-charset.md)
|
||||
- [truncate](language-modifier-truncate.md)
|
||||
- [unescape](language-modifier-unescape.md)
|
||||
- [upper](language-modifier-upper.md)
|
||||
- [wordwrap](language-modifier-wordwrap.md)
|
||||
Modifiers can be applied to any type of variables, including arrays
|
||||
and objects.
|
||||
|
||||
## Examples
|
||||
|
||||
@@ -65,40 +41,63 @@ These parameters follow the modifier name and are separated by a `:`
|
||||
{* php's count *}
|
||||
{$myArray|@count}
|
||||
|
||||
{* this will uppercase and truncate the whole array *}
|
||||
{* this will uppercase the whole array *}
|
||||
<select name="name_id">
|
||||
{html_options output=$my_array|upper|truncate:20}
|
||||
{html_options output=$my_array|upper}
|
||||
</select>
|
||||
```
|
||||
|
||||
- Modifiers can be applied to any type of variables, including arrays
|
||||
and objects.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The default behavior was changed with Smarty 3. In Smarty 2.x, you
|
||||
> had to use an "`@`" symbol to apply a modifier to an array, such
|
||||
> as `{$articleTitle|@count}`. With Smarty 3, the "`@`" is no
|
||||
> longer necessary, and is ignored.
|
||||
>
|
||||
> If you want a modifier to apply to each individual item of an
|
||||
> array, you will either need to loop the array in the template, or
|
||||
> provide for this functionality inside your modifier function.
|
||||
## Combining Modifiers
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Second, in Smarty 2.x, modifiers were applied to the result of
|
||||
> math expressions like `{8+2}`, meaning that
|
||||
> `{8+2|count_characters}` would give `2`, as 8+2=10 and 10 is two
|
||||
> characters long. With Smarty 3, modifiers are applied to the
|
||||
> variables or atomic expressions before executing the calculations,
|
||||
> so since 2 is one character long, `{8+2|count_characters}`
|
||||
> gives 9. To get the old result use parentheses like
|
||||
> `{(8+2)|count_characters}`.
|
||||
You can apply any number of modifiers to a variable. They will be
|
||||
applied in the order they are combined, from left to right. They must be
|
||||
separated with a `|` (pipe) character.
|
||||
|
||||
- Custom modifiers can be registered
|
||||
with the [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md)
|
||||
function.
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
|
||||
```
|
||||
|
||||
where template is:
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|upper|spacify}
|
||||
{$articleTitle|lower|spacify|truncate}
|
||||
{$articleTitle|lower|truncate:30|spacify}
|
||||
{$articleTitle|lower|spacify|truncate:30:". . ."}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
```
|
||||
Smokers are Productive, but Death Cuts Efficiency.
|
||||
S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
|
||||
s m o k e r s a r ....snip.... b u t d e a t h c u t s...
|
||||
s m o k e r s a r e p r o d u c t i v e , b u t . . .
|
||||
s m o k e r s a r e p. . .
|
||||
```
|
||||
|
||||
## Using modifiers in expressions
|
||||
|
||||
Modifiers can also be used in expressions. For example, you can use the [isset modifier](./language-modifier-isset.md)
|
||||
to test if a variable holds a value different from null.
|
||||
|
||||
```smarty
|
||||
{if $varA|isset}
|
||||
<b>variable A is set</b>
|
||||
{/if}
|
||||
```
|
||||
|
||||
You can also use modifiers in expressions in a PHP-style syntax:
|
||||
|
||||
```smarty
|
||||
{if isset($varA)}
|
||||
<b>variable A is set</b>
|
||||
{/if}
|
||||
```
|
||||
|
||||
See also [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md), [combining
|
||||
modifiers](../language-combining-modifiers.md). and [extending smarty with
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# count
|
||||
|
||||
Returns the number of elements in an array (or Countable object). Will return 0 for null.
|
||||
Returns 1 for any other type (such as a string).
|
||||
|
||||
If the optional mode parameter is set to 1, count() will recursively count the array.
|
||||
This is particularly useful for counting all the elements of a multidimensional array.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{if $myVar|count > 3}4 or more{/if}
|
||||
{if count($myVar) > 3}4 or more{/if}
|
||||
```
|
||||
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|--------------------------------------------------------|
|
||||
| 1 | int | No | If set to 1, count() will recursively count the array. |
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
# debug_print_var
|
||||
|
||||
|
||||
|
||||
Returns the value of the given variable in a human-readable format in HTML.
|
||||
Used in the [debug console](../chapter-debugging-console.md), but you can also use it in your template
|
||||
while developing to see what is going on under the hood.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Use for debugging only! Since you may accidentally reveal sensitive information or introduce vulnerabilities such as XSS using this
|
||||
method never use it in production.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|debug_print_var}
|
||||
```
|
||||
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|------------------------------------------------------------------------|
|
||||
| 1 | int | No | maximum recursion depth if $var is an array or object (defaults to 10) |
|
||||
| 2 | int | No | maximum string length if $var is a string (defaults to 40) |
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
# isset
|
||||
|
||||
Returns true if the variable(s) passed to it are different from null.
|
||||
|
||||
If multiple parameters are supplied then isset() will return true only if all of the parameters are
|
||||
not null.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{if $myVar|isset}all set!{/if}
|
||||
```
|
||||
@@ -0,0 +1,26 @@
|
||||
# join
|
||||
|
||||
Returns a string containing all the element of the given array
|
||||
with the separator string between each.
|
||||
|
||||
## Basic usage
|
||||
|
||||
For `$myArray` populated with `['a','b','c']`, the following will return the string `abc`.
|
||||
```smarty
|
||||
{$myArray|join}
|
||||
```
|
||||
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|--------|----------|-------------------------------------------------------------|
|
||||
| 1 | string | No | glue used between array elements. Defaults to empty string. |
|
||||
|
||||
## Examples
|
||||
|
||||
|
||||
For `$myArray` populated with `[1,2,3]`, the following will return the string `1-2-3`.
|
||||
```smarty
|
||||
{$myArray|join:"-"}
|
||||
```
|
||||
@@ -0,0 +1,27 @@
|
||||
# json_encode
|
||||
|
||||
Transforms a value into a valid JSON string.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$user|json_encode}
|
||||
```
|
||||
Depending on the value of `$user` this would return a string in JSON-format, e.g. `{"username":"my_username","email":"my_username@smarty.net"}`.
|
||||
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-------------------------------------------------------------------------------------------|
|
||||
| 1 | int | No | bitmask of flags, directly passed to [PHP's json_encode](https://www.php.net/json_encode) |
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
By passing `16` as the second parameter, you can force json_encode to always format the JSON-string as an object.
|
||||
Without it, an array `$myArray = ["a","b"]` would be formatted as a javascript array:
|
||||
|
||||
```smarty
|
||||
{$myArray|json_encode} # renders: ["a","b"]
|
||||
{$myArray|json_encode:16} # renders: {"0":"a","1":"b"}
|
||||
```
|
||||
@@ -0,0 +1,9 @@
|
||||
# noprint
|
||||
|
||||
Always returns an empty string. This can be used to call a function or a method on an object that
|
||||
returns output, and suppress the output.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$controller->sendEmail()|noprint}
|
||||
```
|
||||
@@ -0,0 +1,32 @@
|
||||
# number_format
|
||||
|
||||
Allows you to format a number using decimals and a thousands-separator. By default, the number of decimals is 0
|
||||
and the number is rounded.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$num = 2000.151}
|
||||
{$num|number_format} # renders: 2,000
|
||||
```
|
||||
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|--------|----------|---------------------------------------|
|
||||
| 1 | int | No | number of decimals (defaults to 0) |
|
||||
| 2 | string | No | decimal separator (defaults to ".") |
|
||||
| 3 | string | No | thousands-separator (defaults to ",") |
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{$num = 2000.151}
|
||||
{$num|number_format:2} # renders: 2,000.15
|
||||
```
|
||||
|
||||
```smarty
|
||||
{$num = 2000.151}
|
||||
{$num|number_format:2:".":""} # renders: 2000.15
|
||||
```
|
||||
@@ -0,0 +1,35 @@
|
||||
# round
|
||||
|
||||
Rounds a number to the specified precision.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{3.14|round} # renders: 3
|
||||
```
|
||||
|
||||
```smarty
|
||||
{3.141592|round:2} # renders: 3.14
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|---------------------------|
|
||||
| 1 | int | No | precision (defaults to 0) |
|
||||
| 2 | int | No | mode (defaults to 1) |
|
||||
|
||||
If 'precision' is negative, the number is rounded to the nearest power of 10. See examples below.
|
||||
|
||||
The parameter 'mode' defines how the rounding is done. By default, 2.5 is rounded to 3, whereas 2.45 is rounded to 2.
|
||||
You usually don't need to change this. For more details on rounding modes,
|
||||
see [PHP's documentation on round](https://www.php.net/manual/en/function.round).
|
||||
|
||||
## Examples
|
||||
|
||||
By passing `16` as the second parameter, you can force json_encode to always format the JSON-string as an object.
|
||||
Without it, an array `$myArray = ["a","b"]` would be formatted as a javascript array:
|
||||
|
||||
```smarty
|
||||
{$myArray|json_encode} # renders: ["a","b"]
|
||||
{$myArray|json_encode:16} # renders: {"0":"a","1":"b"}
|
||||
```
|
||||
@@ -0,0 +1,32 @@
|
||||
# split
|
||||
|
||||
Splits a string into an array, using the optional second parameter as the separator.
|
||||
|
||||
## Basic usage
|
||||
|
||||
For `$chars` populated with `'abc'`, the following will produce a html list with 3 elements (a, b and c).
|
||||
```smarty
|
||||
<ol>
|
||||
{foreach $chars|split as $char}
|
||||
<li>{$char|escape}</li>
|
||||
{/foreach}
|
||||
</ol>
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|--------|----------|------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 1 | string | No | separator used to split the string on. Defaults to empty string, causing each character in the source string to be separate. |
|
||||
|
||||
## Examples
|
||||
|
||||
|
||||
For `$ids` populated with `'1,2,3'`, the following will produce a html list with 3 elements (1, 2 and 3).
|
||||
```smarty
|
||||
<ol>
|
||||
{foreach $ids|split:',' as $id}
|
||||
<li>{$id|escape}</li>
|
||||
{/foreach}
|
||||
</ol>
|
||||
```
|
||||
@@ -0,0 +1,14 @@
|
||||
# str_repeat
|
||||
|
||||
Repeats the given value n times.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{"hi"|str_repeat:2} # renders: hihi
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-----------------------|
|
||||
| 1 | int | yes | number of repetitions |
|
||||
@@ -0,0 +1,9 @@
|
||||
# strlen
|
||||
|
||||
Returns the length (number of characters) in the given string, including spaces.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{"Smarty"|strlen} # renders: 6
|
||||
{156|strlen} # renders: 3
|
||||
```
|
||||
@@ -0,0 +1,25 @@
|
||||
# substr
|
||||
|
||||
Returns a part (substring) of the given string starting at a given offset.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{"Smarty"|substr:2} # renders: arty
|
||||
{"Smarty"|substr:2:3} # renders: art
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|------|----------|-----------------------------------------------------|
|
||||
| 1 | int | yes | offset (zero based, can be negative) |
|
||||
| 2 | int | no | length of substring returned (unlimited of omitted) |
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
When used with a negative offset, the substring starts n characters from the end of the string counting backwards.
|
||||
```smarty
|
||||
{"Smarty"|substr:-2} # renders: ty
|
||||
{"Smarty"|substr:-2:1} # renders: t
|
||||
```
|
||||
@@ -29,5 +29,5 @@ If Strike isn't Settled Quickly it may Last a While.
|
||||
IF STRIKE ISN'T SETTLED QUICKLY IT MAY LAST A WHILE.
|
||||
```
|
||||
|
||||
See also [`lower`](lower) and
|
||||
See also [`lower`](./language-modifier-lower.md) and
|
||||
[`capitalize`](language-modifier-capitalize.md).
|
||||
|
||||
+2
-2
@@ -134,8 +134,8 @@ that would be needed otherwise? Does the codebase or framework you plan
|
||||
on using have the features you need for the presentation component?
|
||||
|
||||
## Sites using Smarty
|
||||
Many well-known PHP projects make use of Smarty such as XOOPS CMS, CMS Made Simple, Tiki
|
||||
CMS/Groupware and X-Cart to name a few.
|
||||
Many well-known PHP projects make use of Smarty such as XOOPS CMS, CMS Made Simple,
|
||||
Tiki Wiki CMS Groupware and X-Cart to name a few.
|
||||
|
||||
## Summary
|
||||
Whether you are using Smarty for a small website or massive enterprise
|
||||
|
||||
+20
-4
@@ -1,7 +1,7 @@
|
||||
# Getting started
|
||||
|
||||
## Requirements
|
||||
Smarty can be run with PHP 7.2 to PHP 8.2.
|
||||
Smarty can be run with PHP 7.2 to PHP 8.3.
|
||||
|
||||
## Installation
|
||||
Smarty can be installed with [Composer](https://getcomposer.org/).
|
||||
@@ -16,9 +16,9 @@ To get the latest, unreleased version, use:
|
||||
composer require smarty/smarty:dev-master
|
||||
```
|
||||
|
||||
To get the previous stable version of Smarty, Smarty 3, use:
|
||||
To get the previous stable version of Smarty, Smarty 4, use:
|
||||
```shell
|
||||
composer require smarty/smarty:^3
|
||||
composer require smarty/smarty:^4
|
||||
```
|
||||
|
||||
Here's how you create an instance of Smarty in your PHP scripts:
|
||||
@@ -86,7 +86,7 @@ needs to be located in the [`$template_dir`](./programmers/api-variables/variabl
|
||||
|
||||
```smarty
|
||||
{* Smarty *}
|
||||
Hello {$name}, welcome to Smarty!
|
||||
<h1>Hello {$name|escape}, welcome to Smarty!</h1>
|
||||
```
|
||||
|
||||
> **Note**
|
||||
@@ -132,6 +132,20 @@ Now, run your PHP file. You should see *"Hello Ned, welcome to Smarty!"*
|
||||
|
||||
You have completed the basic setup for Smarty!
|
||||
|
||||
## Escaping
|
||||
You may have noticed that the example template above renders the `$name` variable using
|
||||
the [escape modifier](./designers/language-modifiers/language-modifier-escape.md). This
|
||||
modifier makes string 'safe' to use in the context of an HTML page.
|
||||
|
||||
If you are primarily using Smarty for HTML-pages, it is recommended to enable automatic
|
||||
escaping. This way, you don't have to add `|escape` to every variable you use on a web page.
|
||||
Smarty will handle it automatically for you!
|
||||
|
||||
Enable auto-escaping for HTML as follows:
|
||||
```php
|
||||
$smarty->setEscapeHtml(true);
|
||||
```
|
||||
|
||||
## Extended Setup
|
||||
|
||||
This is a continuation of the [basic installation](#installation), please read that first!
|
||||
@@ -156,6 +170,8 @@ class My_GuestBook extends Smarty {
|
||||
$this->setCompileDir('/web/www.example.com/guestbook/templates_c/');
|
||||
$this->setConfigDir('/web/www.example.com/guestbook/configs/');
|
||||
$this->setCacheDir('/web/www.example.com/guestbook/cache/');
|
||||
|
||||
$this->setEscapeHtml(true);
|
||||
|
||||
$this->caching = Smarty::CACHING_LIFETIME_CURRENT;
|
||||
$this->assign('app_name', 'Guest Book');
|
||||
|
||||
@@ -26,5 +26,10 @@ and 480 for $height, the result is:
|
||||
- [Features](./features.md) - or "Why do I want Smarty?"
|
||||
|
||||
## Help
|
||||
- [Search or create an issue](https://github.com/smarty-php/smarty/issues)
|
||||
- [Upgrading from an older version](upgrading.md)
|
||||
- [Some random tips & tricks](./appendixes/tips.md)
|
||||
- [Troubleshooting](./appendixes/troubleshooting.md)
|
||||
|
||||
## Source code
|
||||
- [Smarty repository at GitHub](https://github.com/smarty-php/smarty)
|
||||
@@ -0,0 +1,157 @@
|
||||
# Upgrading from an older version
|
||||
|
||||
## Upgrading from v4 to v5
|
||||
|
||||
Smarty 5 adds support for PHP8.2 and drops support for PHP7.1. Smarty also adds support for new features
|
||||
such as the ternary operator (`{$test ? $a : $b}` and `{$var ?: $value_if_falsy}`), the null coalescing operator (`{$var ?? $value_if_null}`)
|
||||
and positional parameters for custom tags.
|
||||
Smarty 5 also has a brand-new extension architecture that allows you to write neat extension packs.
|
||||
|
||||
### Namespaces
|
||||
All Smarty code has been moved into the `\Smarty` namespace. This reduces
|
||||
the chance of conflicts with other (your) code.
|
||||
|
||||
For simple use-cases, you only need to add `use Smarty\Smarty;` to your script and everything will work.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->display('homepage.tpl');
|
||||
```
|
||||
For more information, see [getting started](getting-started.md).
|
||||
|
||||
If you extend Smarty or use Smarty plug-ins, please review your code to see if they assume specific class or method names.
|
||||
E.g.: `Smarty_Internal_Template` is now `\Smarty\Template\`, `SmartyException` is now `\Smarty\Exception`.
|
||||
|
||||
### Variable scope bubbling
|
||||
Template variable scope bubbling has been simplified and made more consistent. The global scope now equals the Smarty
|
||||
scope in order to avoid global state side effects. Please read the [documentation on language variable scope](designers/language-variables/language-variable-scopes.md)
|
||||
for more details.
|
||||
|
||||
Also, `{config_load}` no longer has a `scope` parameter, which means you can no longer load config
|
||||
from inside your template into the global scope (again, to avoid global state side effects). If you
|
||||
need to set global config, use the [configLoad API method](api/variables/config-files.md) from your PHP code.
|
||||
|
||||
### Using native PHP-functions or userland functions in your templates
|
||||
You can no longer use native PHP-functions or userland functions in your templates without registering them.
|
||||
If you need a function in your templates, register it first.
|
||||
|
||||
The easiest way to do so is as follows:
|
||||
```php
|
||||
// native PHP functions used as modifiers need to be registered
|
||||
$smarty->registerPlugin('modifier', 'substr', 'substr');
|
||||
|
||||
// userland PHP functions used as modifiers need to be registered
|
||||
$smarty->registerPlugin('modifier', 'my_special_func', 'my_special_func');
|
||||
```
|
||||
|
||||
But you may want to consider writing a proper [extension](api/extending/extensions.md).
|
||||
|
||||
### Removed undocumented tags
|
||||
|
||||
Smarty 4 still supported some tags that have been carried over from previous version, but have never been documented.
|
||||
|
||||
- `{block_parent}` should be replaced with `{$smarty.block.parent}`
|
||||
- `{parent}` should be replaced with `{$smarty.block.parent}`
|
||||
- `{block_child}` should be replaced with `{$smarty.block.child}`
|
||||
- `{child}` should be replaced with `{$smarty.block.child}`
|
||||
|
||||
- `{make_nocache}` is no longer supported
|
||||
- `{insert}` is no longer supported
|
||||
|
||||
### Removed Smarty API properties
|
||||
|
||||
In Smarty 4, you could make many configuration changes by directly accessing public properties on the Smarty object in PHP.
|
||||
In many cases, these properties have been made private, and you should now use the appropriate setter method:
|
||||
|
||||
- `$smarty->left_delimiter` should be replaced with `$smarty->getLeftDelimiter()`/`$smarty->setLeftDelimiter()`
|
||||
- `$smarty->right_delimiter` should be replaced with `$smarty->getRightDelimiter()`/`$smarty->setRightDelimiter()`
|
||||
- `$smarty->autoload_filters` should be replaced with `$smarty->registerFilter()`
|
||||
- `$smarty->template_dir` should be replaced with `$smarty->setTemplateDir()`
|
||||
- `$smarty->cache_dir` should be replaced with `$smarty->setCacheDir()`
|
||||
- `$smarty->compile_dir` should be replaced with `$smarty->setCompileDir()`
|
||||
|
||||
Other public properties have been removed altogether, and you should no longer access them:
|
||||
|
||||
- `$smarty->_current_file`
|
||||
- `$smarty->allow_ambiguous_resources` (ambiguous resources handlers should still work)
|
||||
- `$smarty->registered_filters`
|
||||
- `$smarty->direct_access_security`
|
||||
- `$smarty->trusted_dir`
|
||||
- `$smarty->allow_php_templates`
|
||||
- `$smarty->php_functions`
|
||||
- `$smarty->php_modifiers`
|
||||
|
||||
### Backwards incompatible changes to custom plugins
|
||||
|
||||
We have dropped support for `$smarty->plugins_dir` and `$smarty->use_include_path`.
|
||||
Use `$smarty->addPluginsDir()` or consider writing a proper [extension](api/extending/extensions.md).
|
||||
|
||||
The 'insert' plugin type is no longer supported.
|
||||
|
||||
The `$cache_attrs` parameter for registered plugins is no longer supported.
|
||||
|
||||
### Removed Smarty API methods
|
||||
|
||||
Search your code for the following changes:
|
||||
|
||||
- `$smarty->getTags()` is no longer supported
|
||||
- `$smarty->appendByRef()` should be replaced with `$smarty->append()`
|
||||
- `$smarty->assignByRef()` should be replaced with `$smarty->assign()`
|
||||
- `$smarty->loadPlugin()` should be replaced with `$smarty->registerPlugin()`
|
||||
|
||||
### Removed PHP constants
|
||||
|
||||
The following constants have been removed to prevent global side effects.
|
||||
|
||||
- `SMARTY_DIR`
|
||||
- `SMARTY_SYSPLUGINS_DIR`
|
||||
- `SMARTY_PLUGINS_DIR`
|
||||
- `SMARTY_MBSTRING`
|
||||
- `SMARTY_HELPER_FUNCTIONS_LOADED`
|
||||
|
||||
### Other changes
|
||||
|
||||
- Smarty now always runs in multibyte mode. Make sure you use the [PHP multibyte extension](https://www.php.net/manual/en/book.mbstring.php) in production for optimal performance.
|
||||
- Generated `<script>` tags lo longer have deprecated `type="text/javascript"` or `language="Javascript"` attributes
|
||||
- Smarty will throw a compiler exception instead of silently ignoring a modifier on a function call, like this: `{include|dot:"x-template-id" file="included.dot.tpl"}`
|
||||
- The ::getFile() method of a CompilerException will now return the full path of the template being compiled, if possible. This used to be 'file:relative_dir/filename.tpl'.
|
||||
|
||||
## Upgrading from v3 to v4
|
||||
|
||||
Smarty 4 is mostly identical to Smarty 3. Most notably, it adds support for PHP8 and drops support for PHP7.0 and below.
|
||||
Additionally, some deprecated features that have long been discouraged have been dropped from the language.
|
||||
|
||||
### Muting PHP8 warnings
|
||||
If you simultaneously upgrade Smarty to v4 van PHP to v8, you may notice your error logs filling up with warnings about undefined or null template vars
|
||||
due to a change in how PHP handles these. This may be helpful to spot errors, but if you find this annoying, you can use
|
||||
`$smarty->muteUndefinedOrNullWarnings()` to make Smarty convert these warnings into notices.
|
||||
|
||||
### ASP tags
|
||||
You can no longer user ASP-style tags like `<% %>` and `<%= %>` in your templates.
|
||||
Replace them with `{...}` tags.
|
||||
|
||||
### SmartyBC
|
||||
Check your codebase for `SmartyBC`.
|
||||
We have dropped deprecated API calls that where only accessible through the SmartyBC class.
|
||||
|
||||
### No more embedded PHP
|
||||
We have completely dropped support for `{php}` and `{include_php}` tags and embedded PHP in templates.
|
||||
Check your templates for this, and rewrite any embedded PHP blocks, by moving logic to your PHP files or by
|
||||
creating a [custom tag](./api/extending/tags.md).
|
||||
|
||||
### Other changes
|
||||
|
||||
Search your code for the following changes:
|
||||
|
||||
- `SMARTY_RESOURCE_CHAR_SET` and `SMARTY_RESOURCE_DATE_FORMAT` constants have been removed
|
||||
- `Smarty::muteExpectedErrors` and `Smarty::unmuteExpectedErrors` API methods have been removed
|
||||
- `Smarty::getVariable` method has been removed. Use [Smarty::getTemplateVars](designers/language-builtin-functions/language-function-assign.md) instead.
|
||||
- [Smarty::registerResource](api/resources.md) no longer accepts an array of callback functions
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+4
-3
@@ -8,10 +8,11 @@ else
|
||||
fi
|
||||
|
||||
git checkout -b "release/$1"
|
||||
sed -i "s/## \\[Unreleased\\]/## \\[Unreleased\\]\\n\\n## \\[$1\\] - $(date +%Y-%m-%d)/" CHANGELOG.md
|
||||
sed -i "s/const SMARTY_VERSION = '[^']\+';/const SMARTY_VERSION = '$1';/" src/Smarty.php
|
||||
|
||||
git add CHANGELOG.md src/Smarty.php
|
||||
php utilities/update-changelog.php $1
|
||||
php utilities/update-smarty-version-number.php $1
|
||||
|
||||
git add changelog CHANGELOG.md src/Smarty.php
|
||||
git commit -m "version bump"
|
||||
|
||||
git checkout master
|
||||
|
||||
+15
-2
@@ -26,7 +26,9 @@ markdown_extensions:
|
||||
|
||||
nav:
|
||||
- Home: 'index.md'
|
||||
- 'Getting started': 'getting-started.md'
|
||||
- 'Getting started':
|
||||
- Introduction: 'getting-started.md'
|
||||
- 'Upgrading from an older version': 'upgrading.md'
|
||||
- 'Language reference':
|
||||
- 'Basic Syntax':
|
||||
- Introduction: 'designers/language-basic-syntax/index.md'
|
||||
@@ -47,29 +49,40 @@ nav:
|
||||
- 'Introduction': 'designers/language-modifiers/index.md'
|
||||
- 'capitalize': 'designers/language-modifiers/language-modifier-capitalize.md'
|
||||
- 'cat': 'designers/language-modifiers/language-modifier-cat.md'
|
||||
- 'count': 'designers/language-modifiers/language-modifier-count.md'
|
||||
- 'count_characters': 'designers/language-modifiers/language-modifier-count-characters.md'
|
||||
- 'count_paragraphs': 'designers/language-modifiers/language-modifier-count-paragraphs.md'
|
||||
- 'count_sentences': 'designers/language-modifiers/language-modifier-count-sentences.md'
|
||||
- 'count_words': 'designers/language-modifiers/language-modifier-count-words.md'
|
||||
- 'date_format': 'designers/language-modifiers/language-modifier-date-format.md'
|
||||
- 'debug_print_var': 'designers/language-modifiers/language-modifier-debug-print-var.md'
|
||||
- 'default': 'designers/language-modifiers/language-modifier-default.md'
|
||||
- 'escape': 'designers/language-modifiers/language-modifier-escape.md'
|
||||
- 'from_charset': 'designers/language-modifiers/language-modifier-from-charset.md'
|
||||
- 'indent': 'designers/language-modifiers/language-modifier-indent.md'
|
||||
- 'isset': 'designers/language-modifiers/language-modifier-isset.md'
|
||||
- 'join': 'designers/language-modifiers/language-modifier-join.md'
|
||||
- 'json_encode': 'designers/language-modifiers/language-modifier-json-encode.md'
|
||||
- 'lower': 'designers/language-modifiers/language-modifier-lower.md'
|
||||
- 'noprint': 'designers/language-modifiers/language-modifier-noprint.md'
|
||||
- 'number_format': 'designers/language-modifiers/language-modifier-number-format.md'
|
||||
- 'nl2br': 'designers/language-modifiers/language-modifier-nl2br.md'
|
||||
- 'regex_replace': 'designers/language-modifiers/language-modifier-regex-replace.md'
|
||||
- 'replace': 'designers/language-modifiers/language-modifier-replace.md'
|
||||
- 'round': 'designers/language-modifiers/language-modifier-round.md'
|
||||
- 'spacify': 'designers/language-modifiers/language-modifier-spacify.md'
|
||||
- 'split': 'designers/language-modifiers/language-modifier-split.md'
|
||||
- 'str_repeat': 'designers/language-modifiers/language-modifier-str-repeat.md'
|
||||
- 'string_format': 'designers/language-modifiers/language-modifier-string-format.md'
|
||||
- 'strip': 'designers/language-modifiers/language-modifier-strip.md'
|
||||
- 'strip_tags': 'designers/language-modifiers/language-modifier-strip-tags.md'
|
||||
- 'strlen': 'designers/language-modifiers/language-modifier-strlen.md'
|
||||
- 'substr': 'designers/language-modifiers/language-modifier-substr.md'
|
||||
- 'to_charset': 'designers/language-modifiers/language-modifier-to-charset.md'
|
||||
- 'truncate': 'designers/language-modifiers/language-modifier-truncate.md'
|
||||
- 'unescape': 'designers/language-modifiers/language-modifier-unescape.md'
|
||||
- 'upper': 'designers/language-modifiers/language-modifier-upper.md'
|
||||
- 'wordwrap': 'designers/language-modifiers/language-modifier-wordwrap.md'
|
||||
- 'Combining Modifiers': 'designers/language-combining-modifiers.md'
|
||||
- 'Builtin Tags':
|
||||
- 'Introduction': 'designers/language-builtin-functions/index.md'
|
||||
- '{append}': 'designers/language-builtin-functions/language-function-append.md'
|
||||
|
||||
@@ -5,9 +5,12 @@
|
||||
# - ./run-tests-for-all-php-versions.sh --group 20221124
|
||||
# - ./run-tests-for-all-php-versions.sh --exclude-group slow
|
||||
|
||||
docker-compose run php72 ./run-tests.sh $@ && \
|
||||
docker-compose run php73 ./run-tests.sh $@ && \
|
||||
docker-compose run php74 ./run-tests.sh $@ && \
|
||||
docker-compose run php80 ./run-tests.sh $@ && \
|
||||
docker-compose run php81 ./run-tests.sh $@ && \
|
||||
docker-compose run php82 ./run-tests.sh $@
|
||||
COMPOSE_CMD="mutagen-compose"
|
||||
|
||||
$COMPOSE_CMD run --rm php72 ./run-tests.sh $@ && \
|
||||
$COMPOSE_CMD run --rm php73 ./run-tests.sh $@ && \
|
||||
$COMPOSE_CMD run --rm php74 ./run-tests.sh $@ && \
|
||||
$COMPOSE_CMD run --rm php80 ./run-tests.sh $@ && \
|
||||
$COMPOSE_CMD run --rm php81 ./run-tests.sh $@ && \
|
||||
$COMPOSE_CMD run --rm php82 ./run-tests.sh $@
|
||||
$COMPOSE_CMD run --rm php83 ./run-tests.sh $@
|
||||
|
||||
@@ -226,8 +226,8 @@ abstract class Base implements CompilerInterface {
|
||||
* @param Template $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return bool|string compiled code or true if no code has been compiled
|
||||
* @return string compiled code as a string
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
abstract public function compile($args, Template $compiler, $parameter = array(), $tag = null, $function = null);
|
||||
abstract public function compile($args, Template $compiler, $parameter = array(), $tag = null, $function = null): string;
|
||||
}
|
||||
|
||||
@@ -50,7 +50,8 @@ class BlockCompiler extends Base {
|
||||
* @throws CompilerException
|
||||
* @throws Exception
|
||||
*/
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
if (!isset($tag[5]) || substr($tag, -5) !== 'close') {
|
||||
$output = $this->compileOpeningTag($compiler, $args, $tag, $function);
|
||||
@@ -77,7 +78,6 @@ class BlockCompiler extends Base {
|
||||
);
|
||||
}
|
||||
$compiler->_cache['blockParams'][$compiler->_cache['blockNesting']]['callsChild'] = true;
|
||||
$compiler->has_code = true;
|
||||
$compiler->suppressNocacheProcessing = true;
|
||||
|
||||
$output = "<?php \n";
|
||||
@@ -102,7 +102,6 @@ class BlockCompiler extends Base {
|
||||
$compiler->getParser()->lex->taglineno
|
||||
);
|
||||
}
|
||||
$compiler->has_code = true;
|
||||
$compiler->suppressNocacheProcessing = true;
|
||||
|
||||
$output = "<?php \n";
|
||||
|
||||
@@ -17,10 +17,10 @@ interface CompilerInterface {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
*
|
||||
* @return bool|string compiled code or true if no code has been compiled
|
||||
* @return string compiled code as a string
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null);
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string;
|
||||
|
||||
public function isCacheable(): bool;
|
||||
}
|
||||
@@ -27,7 +27,8 @@ class DefaultHandlerFunctionCallCompiler extends Base {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
unset($_attr['nocache']);
|
||||
|
||||
@@ -34,7 +34,7 @@ class FunctionCallCompiler extends Base {
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $shorttag_order = ['var1', 'var2', 'var3'];
|
||||
protected $shorttag_order = [];
|
||||
|
||||
/**
|
||||
* Compiles code for the execution of a registered function
|
||||
@@ -49,7 +49,8 @@ class FunctionCallCompiler extends Base {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
@@ -58,19 +59,15 @@ class FunctionCallCompiler extends Base {
|
||||
$_paramsArray = $this->formatParamsArray($_attr);
|
||||
$_params = 'array(' . implode(',', $_paramsArray) . ')';
|
||||
|
||||
try {
|
||||
$value = array_shift($_attr);
|
||||
$output = $compiler->compileModifier([array_merge([$function], $_attr)], $value);
|
||||
} catch (\Smarty\CompilerException $e) {
|
||||
if ($functionHandler = $compiler->getSmarty()->getFunctionHandler($function)) {
|
||||
|
||||
// not cacheable?
|
||||
$compiler->tag_nocache = $compiler->tag_nocache || !$functionHandler->isCacheable();
|
||||
$output = "\$_smarty_tpl->getSmarty()->getFunctionHandler(" . var_export($function, true) . ")";
|
||||
$output .= "->handle($_params, \$_smarty_tpl)";
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
if ($functionHandler = $compiler->getSmarty()->getFunctionHandler($function)) {
|
||||
|
||||
// not cacheable?
|
||||
$compiler->tag_nocache = $compiler->tag_nocache || !$functionHandler->isCacheable();
|
||||
$output = "\$_smarty_tpl->getSmarty()->getFunctionHandler(" . var_export($function, true) . ")";
|
||||
$output .= "->handle($_params, \$_smarty_tpl)";
|
||||
} else {
|
||||
$compiler->trigger_template_error("unknown function '{$function}'", null, true);
|
||||
}
|
||||
|
||||
if (!empty($parameter['modifierlist'])) {
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
namespace Smarty\Compile\Modifier;
|
||||
use Smarty\CompilerException;
|
||||
|
||||
/**
|
||||
* Smarty is_array modifier plugin
|
||||
*/
|
||||
class IsArrayModifierCompiler extends Base {
|
||||
|
||||
public function compile($params, \Smarty\Compiler\Template $compiler) {
|
||||
|
||||
if (count($params) !== 1) {
|
||||
throw new CompilerException("Invalid number of arguments for is_array. is_array expects exactly 1 parameter.");
|
||||
}
|
||||
|
||||
return 'is_array(' . $params[0] . ')';
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty\Compile\Modifier;
|
||||
|
||||
/**
|
||||
* Smarty json_encode modifier plugin
|
||||
*/
|
||||
class JsonEncodeModifierCompiler extends Base {
|
||||
|
||||
public function compile($params, \Smarty\Compiler\Template $compiler) {
|
||||
return 'json_encode(' . $params[0] . (isset($params[1]) ? ', (int) ' . $params[1] : '') . ')';
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty\Compile\Modifier;
|
||||
|
||||
/**
|
||||
* Smarty substr modifier plugin
|
||||
*/
|
||||
class SubstrModifierCompiler extends Base {
|
||||
|
||||
public function compile($params, \Smarty\Compiler\Template $compiler) {
|
||||
return 'substr((string) ' . $params[0] . ', (int) ' . $params[1] .
|
||||
(isset($params[2]) ? ', (int) ' . $params[2] : '') . ')';
|
||||
}
|
||||
|
||||
}
|
||||
@@ -33,9 +33,8 @@ class ModifierCompiler extends Base {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
|
||||
$compiler->has_code = true;
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
$output = $parameter['value'];
|
||||
|
||||
@@ -43,16 +42,19 @@ class ModifierCompiler extends Base {
|
||||
foreach ($parameter['modifierlist'] as $single_modifier) {
|
||||
/* @var string $modifier */
|
||||
$modifier = $single_modifier[0];
|
||||
$single_modifier[0] = $output;
|
||||
$params = implode(',', $single_modifier);
|
||||
|
||||
|
||||
$modifier_params = array_values($single_modifier);
|
||||
|
||||
$modifier_params[0] = $output;
|
||||
$params = implode(',', $modifier_params);
|
||||
|
||||
if (!is_object($compiler->getSmarty()->security_policy)
|
||||
|| $compiler->getSmarty()->security_policy->isTrustedModifier($modifier, $compiler)
|
||||
) {
|
||||
|
||||
if ($handler = $compiler->getModifierCompiler($modifier)) {
|
||||
$output = $handler->compile($single_modifier, $compiler);
|
||||
|
||||
$output = $handler->compile($modifier_params, $compiler);
|
||||
} elseif ($compiler->getSmarty()->getModifierCallback($modifier)) {
|
||||
$output = sprintf(
|
||||
'$_smarty_tpl->getSmarty()->getModifierCallback(%s)(%s)',
|
||||
@@ -60,7 +62,7 @@ class ModifierCompiler extends Base {
|
||||
$params
|
||||
);
|
||||
} elseif ($callback = $compiler->getPluginFromDefaultHandler($modifier, \Smarty\Smarty::PLUGIN_MODIFIERCOMPILER)) {
|
||||
$output = (new \Smarty\Compile\Modifier\BCPluginWrapper($callback))->compile($single_modifier, $compiler);
|
||||
$output = (new \Smarty\Compile\Modifier\BCPluginWrapper($callback))->compile($modifier_params, $compiler);
|
||||
} elseif ($function = $compiler->getPluginFromDefaultHandler($modifier, \Smarty\Smarty::PLUGIN_MODIFIER)) {
|
||||
if (!is_array($function)) {
|
||||
$output = "{$function}({$params})";
|
||||
|
||||
@@ -39,7 +39,8 @@ class ObjectMethodCallCompiler extends Base {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
unset($_attr['nocache']);
|
||||
|
||||
@@ -47,9 +47,8 @@ class PrintExpressionCompiler extends Base {
|
||||
* @return string
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
|
||||
$compiler->has_code = true;
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
@@ -84,7 +83,7 @@ class PrintExpressionCompiler extends Base {
|
||||
}
|
||||
|
||||
if ($compiler->getTemplate()->getSmarty()->escape_html) {
|
||||
$output = "htmlspecialchars((string) {$output}, ENT_QUOTES, '" . addslashes(\Smarty\Smarty::$_CHARSET) . "')";
|
||||
$output = "htmlspecialchars((string) ({$output}), ENT_QUOTES, '" . addslashes(\Smarty\Smarty::$_CHARSET) . "')";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -37,9 +37,8 @@ class SpecialVariableCompiler extends Base {
|
||||
* @return string compiled code
|
||||
* @throws CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
|
||||
$compiler->has_code = true;
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
$_index = preg_split("/\]\[/", substr($parameter, 1, strlen($parameter) - 2));
|
||||
$variable = smarty_strtolower_ascii($compiler->getId($_index[0]));
|
||||
@@ -129,5 +128,7 @@ class SpecialVariableCompiler extends Base {
|
||||
}
|
||||
return $compiled_ref;
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,8 +35,8 @@ class Append extends Assign
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
{
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
||||
@@ -55,8 +55,8 @@ class Assign extends Base
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
{
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
$_nocache = false;
|
||||
// check and get attributes
|
||||
|
||||
@@ -24,7 +24,8 @@ class BCPluginWrapper extends Base {
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
return call_user_func($this->callback, $this->getAttributes($compiler, $args), $compiler->getSmarty());
|
||||
}
|
||||
}
|
||||
@@ -58,7 +58,7 @@ class Block extends Inheritance {
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
* @param array $parameter array with compilation parameter
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null): string
|
||||
{
|
||||
if (!isset($compiler->_cache['blockNesting'])) {
|
||||
$compiler->_cache['blockNesting'] = 0;
|
||||
@@ -87,5 +87,6 @@ class Block extends Inheritance {
|
||||
$compiler->getParser()->current_buffer = new Template();
|
||||
$compiler->getTemplate()->getCompiled()->setNocacheCode(false);
|
||||
$compiler->suppressNocacheProcessing = true;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ class BlockClose extends Inheritance {
|
||||
*
|
||||
* @return bool true
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null): string
|
||||
{
|
||||
[$_attr, $_nocache, $_buffer, $_has_nocache_code, $_className] = $this->closeTag($compiler, ['block']);
|
||||
|
||||
@@ -103,7 +103,6 @@ class BlockClose extends Inheritance {
|
||||
if ($compiler->_cache['blockNesting'] === 0) {
|
||||
unset($compiler->_cache['blockNesting']);
|
||||
}
|
||||
$compiler->has_code = true;
|
||||
$compiler->suppressNocacheProcessing = true;
|
||||
return $output;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ class BreakTag extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null)
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = array(), $tag = null, $function = null): string
|
||||
{
|
||||
[$levels, $foreachLevels] = $this->checkLevels($args, $compiler);
|
||||
$output = "<?php ";
|
||||
|
||||
@@ -47,7 +47,8 @@ class Call extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
// save possible attributes
|
||||
|
||||
@@ -53,7 +53,8 @@ class Capture extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
$buffer = $_attr['name'] ?? "'default'";
|
||||
@@ -66,7 +67,6 @@ class Capture extends Base {
|
||||
$compiler->openTag('nocache');
|
||||
}
|
||||
|
||||
$_output = "<?php \$_smarty_tpl->getSmarty()->getRuntime('Capture')->open(\$_smarty_tpl, $buffer, $assign, $append);?>";
|
||||
return $_output;
|
||||
return "<?php \$_smarty_tpl->getSmarty()->getRuntime('Capture')->open(\$_smarty_tpl, $buffer, $assign, $append);?>";
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,8 @@ class CaptureClose extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
if (array_pop($compiler->_cache['capture_stack'])) {
|
||||
// pop the virtual {nocache} tag from the stack.
|
||||
|
||||
@@ -62,7 +62,8 @@ class ConfigLoad extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
if ($_attr['nocache'] === true) {
|
||||
|
||||
@@ -29,7 +29,8 @@ class Debug extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes, may trigger errors
|
||||
$this->getAttributes($compiler, $args);
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ class ElseIfTag extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
[$nesting, $nocache_pushed] = $this->closeTag($compiler, ['if', 'elseif']);
|
||||
|
||||
|
||||
@@ -20,7 +20,8 @@ class ElseTag extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
[$nesting, $compiler->tag_nocache] = $this->closeTag($compiler, ['if', 'elseif']);
|
||||
$this->openTag($compiler, 'else', [$nesting, $compiler->tag_nocache]);
|
||||
return '<?php } else { ?>';
|
||||
|
||||
@@ -52,7 +52,8 @@ class EvalTag extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
if (isset($_attr['assign'])) {
|
||||
|
||||
@@ -52,7 +52,8 @@ class ExtendsTag extends Inheritance {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
if ($_attr['nocache'] === true) {
|
||||
@@ -86,7 +87,6 @@ class ExtendsTag extends Inheritance {
|
||||
} else {
|
||||
$this->compileEndChild($compiler, $_attr['file']);
|
||||
}
|
||||
$compiler->has_code = false;
|
||||
return '';
|
||||
}
|
||||
|
||||
|
||||
@@ -29,7 +29,8 @@ class ForClose extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting--;
|
||||
|
||||
[$openTag, $nocache_pushed] = $this->closeTag($compiler, ['for', 'forelse']);
|
||||
|
||||
@@ -21,7 +21,8 @@ class ForElse extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
[$tagName, $nocache_pushed] = $this->closeTag($compiler, ['for']);
|
||||
$this->openTag($compiler, 'forelse', ['forelse', $nocache_pushed]);
|
||||
return "<?php }} else { ?>";
|
||||
|
||||
@@ -28,7 +28,8 @@ class ForTag extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting++;
|
||||
if ($parameter === 0) {
|
||||
$this->required_attributes = ['start', 'to'];
|
||||
|
||||
@@ -29,7 +29,8 @@ class ForeachClose extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting--;
|
||||
|
||||
[$openTag, $nocache_pushed, $localVariablePrefix, $item, $restore] = $this->closeTag($compiler, ['foreach', 'foreachelse']);
|
||||
|
||||
@@ -20,7 +20,8 @@ class ForeachElse extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
[$openTag, $nocache_pushed, $localVariablePrefix, $item, $restore] = $this->closeTag($compiler, ['foreach']);
|
||||
$this->openTag($compiler, 'foreachelse', ['foreachelse', $nocache_pushed, $localVariablePrefix, $item, false]);
|
||||
|
||||
@@ -79,7 +79,8 @@ class ForeachTag extends ForeachSection {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting++;
|
||||
// init
|
||||
$this->isNamed = false;
|
||||
|
||||
@@ -33,9 +33,10 @@ class FunctionClose extends Base {
|
||||
* @param array $args array with attributes from parser
|
||||
* @param object|\Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return bool true
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$this->compiler = $compiler;
|
||||
$saved_data = $this->closeTag($compiler, ['function']);
|
||||
$_attr = $saved_data[0];
|
||||
@@ -75,7 +76,7 @@ class FunctionClose extends Base {
|
||||
$output .= "foreach (\$params as \$key => \$value) {\n\$_smarty_tpl->assign(\$key, \$value);\n}\n";
|
||||
$output .= "\$params = var_export(\$params, true);\n";
|
||||
$output .= "echo \"/*%%SmartyNocache:{$compiler->getTemplate()->getCompiled()->nocache_hash}%%*/<?php ";
|
||||
$output .= "\\\$_smarty_tpl->getSmarty()->getRuntime('TplFunction')->saveTemplateVariables(\\\$_smarty_tpl, '{$_name}');\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->assign(\\\$key, \\\$value);\n}\n?>";
|
||||
$output .= "\\\$_smarty_tpl->pushStack();\nforeach (\$params as \\\$key => \\\$value) {\n\\\$_smarty_tpl->assign(\\\$key, \\\$value);\n}\n?>";
|
||||
$output .= "/*/%%SmartyNocache:{$compiler->getTemplate()->getCompiled()->nocache_hash}%%*/\";?>";
|
||||
$compiler->getParser()->current_buffer->append_subtree(
|
||||
$compiler->getParser(),
|
||||
@@ -86,7 +87,7 @@ class FunctionClose extends Base {
|
||||
);
|
||||
$compiler->getParser()->current_buffer->append_subtree($compiler->getParser(), $_functionCode);
|
||||
$output = "<?php echo \"/*%%SmartyNocache:{$compiler->getTemplate()->getCompiled()->nocache_hash}%%*/<?php ";
|
||||
$output .= "\\\$_smarty_tpl->getSmarty()->getRuntime('TplFunction')->restoreTemplateVariables(\\\$_smarty_tpl, '{$_name}');?>\n";
|
||||
$output .= "\\\$_smarty_tpl->popStack();?>\n";
|
||||
$output .= "/*/%%SmartyNocache:{$compiler->getTemplate()->getCompiled()->nocache_hash}%%*/\";\n?>";
|
||||
$output .= "<?php echo str_replace('{$compiler->getTemplate()->getCompiled()->nocache_hash}', \$_smarty_tpl->getCompiled()->nocache_hash ?? '', ob_get_clean());\n";
|
||||
$output .= "}\n}\n";
|
||||
@@ -140,7 +141,7 @@ class FunctionClose extends Base {
|
||||
// restore old status
|
||||
$compiler->getTemplate()->getCompiled()->setNocacheCode($saved_data[2]);
|
||||
$compiler->getTemplate()->caching = $saved_data[3];
|
||||
return true;
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,10 +42,11 @@ class FunctionTag extends Base {
|
||||
* @param array $args array with attributes from parser
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return bool true
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
if ($_attr['nocache'] === true) {
|
||||
@@ -67,6 +68,6 @@ class FunctionTag extends Base {
|
||||
// Init temporary context
|
||||
$compiler->getParser()->current_buffer = new \Smarty\ParseTree\Template();
|
||||
$compiler->getTemplate()->getCompiled()->setNocacheCode(false);
|
||||
return true;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -28,7 +28,8 @@ class IfClose extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
[$nesting, $nocache_pushed] = $this->closeTag($compiler, ['if', 'else', 'elseif']);
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@ class IfTag extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
|
||||
if ($compiler->tag_nocache) {
|
||||
// push a {nocache} tag onto the stack to prevent caching of this block
|
||||
|
||||
@@ -67,7 +67,8 @@ class IncludeTag extends Base {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$uid = $t_hash = null;
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
||||
@@ -30,7 +30,8 @@ class Ldelim extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
if ($_attr['nocache'] === true) {
|
||||
$compiler->trigger_template_error('nocache option not allowed', null, true);
|
||||
|
||||
@@ -26,12 +26,11 @@ class Nocache extends Base {
|
||||
* @param array $args array with attributes from parser
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return bool
|
||||
* @return string
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$this->openTag($compiler, 'nocache');
|
||||
// this tag does not return compiled code
|
||||
$compiler->has_code = false;
|
||||
return true;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -27,12 +27,11 @@ class NocacheClose extends Base {
|
||||
* @param array $args array with attributes from parser
|
||||
* @param \Smarty\Compiler\Template $compiler compiler object
|
||||
*
|
||||
* @return bool
|
||||
* @return string
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$this->closeTag($compiler, ['nocache']);
|
||||
// this tag does not return compiled code
|
||||
$compiler->has_code = false;
|
||||
return true;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@ class Rdelim extends Ldelim {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
parent::compile($args, $compiler);
|
||||
return $compiler->getTemplate()->getRightDelimiter();
|
||||
}
|
||||
|
||||
@@ -82,7 +82,8 @@ class Section extends ForeachSection {
|
||||
* @throws \Smarty\CompilerException
|
||||
* @throws \Smarty\Exception
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting++;
|
||||
// check and get attributes
|
||||
$_attr = $this->getAttributes($compiler, $args);
|
||||
|
||||
@@ -25,7 +25,8 @@ class SectionClose extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting--;
|
||||
|
||||
[$openTag, $nocache_pushed] = $this->closeTag($compiler, ['section', 'sectionelse']);
|
||||
|
||||
@@ -20,7 +20,8 @@ class SectionElse extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
[$openTag, $nocache_pushed] = $this->closeTag($compiler, ['section']);
|
||||
$this->openTag($compiler, 'sectionelse', ['sectionelse', $nocache_pushed]);
|
||||
return "<?php }} else {\n ?>";
|
||||
|
||||
@@ -21,7 +21,8 @@ class Setfilter extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->variable_filter_stack[] = $compiler->getSmarty()->getDefaultModifiers();
|
||||
|
||||
// The modifier_list is passed as an array of array's. The inner arrays have the modifier at index 0,
|
||||
@@ -34,8 +35,6 @@ class Setfilter extends Base {
|
||||
|
||||
$compiler->getSmarty()->setDefaultModifiers($newList);
|
||||
|
||||
// this tag does not return compiled code
|
||||
$compiler->has_code = false;
|
||||
return true;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,8 @@ class SetfilterClose extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$this->getAttributes($compiler, $args);
|
||||
|
||||
// reset variable filter to previous state
|
||||
@@ -37,8 +38,6 @@ class SetfilterClose extends Base {
|
||||
count($compiler->variable_filter_stack) ? array_pop($compiler->variable_filter_stack) : []
|
||||
);
|
||||
|
||||
// this tag does not return compiled code
|
||||
$compiler->has_code = false;
|
||||
return true;
|
||||
return '';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -28,7 +28,8 @@ class WhileClose extends Base {
|
||||
*
|
||||
* @return string compiled code
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting--;
|
||||
|
||||
$nocache_pushed = $this->closeTag($compiler, ['while']);
|
||||
|
||||
@@ -22,7 +22,8 @@ class WhileTag extends Base {
|
||||
* @return string compiled code
|
||||
* @throws \Smarty\CompilerException
|
||||
*/
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null) {
|
||||
public function compile($args, \Smarty\Compiler\Template $compiler, $parameter = [], $tag = null, $function = null): string
|
||||
{
|
||||
$compiler->loopNesting++;
|
||||
|
||||
if ($compiler->tag_nocache) {
|
||||
|
||||
@@ -121,6 +121,6 @@ class CodeFrame
|
||||
* @return string
|
||||
*/
|
||||
public function insertLocalVariables(): string {
|
||||
return '$_smarty_current_dir = ' . var_export(dirname($this->_template->getSource()->getFilepath()), true) . ";\n";
|
||||
return '$_smarty_current_dir = ' . var_export(dirname($this->_template->getSource()->getFilepath() ?? '.'), true) . ";\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,8 +65,6 @@ class Configfile extends BaseCompiler {
|
||||
* @param Smarty $smarty global instance
|
||||
*/
|
||||
public function __construct(Smarty $smarty) {
|
||||
$this->smarty = $smarty;
|
||||
// get required plugins
|
||||
$this->smarty = $smarty;
|
||||
$this->config_data['sections'] = [];
|
||||
$this->config_data['vars'] = [];
|
||||
@@ -104,7 +102,7 @@ class Configfile extends BaseCompiler {
|
||||
) . "\n",
|
||||
$this
|
||||
);
|
||||
/* @var ConfigfileParser $this->parser */
|
||||
|
||||
$this->parser = new ConfigfileParser($this->lex, $this);
|
||||
if ($this->smarty->_parserdebug) {
|
||||
$this->parser->PrintTrace();
|
||||
|
||||
+11
-22
@@ -184,13 +184,6 @@ class Template extends BaseCompiler {
|
||||
*/
|
||||
public $prefixCodeStack = [];
|
||||
|
||||
/**
|
||||
* Tag has compiled code
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
public $has_code = false;
|
||||
|
||||
/**
|
||||
* A variable string was compiled
|
||||
*
|
||||
@@ -593,8 +586,6 @@ class Template extends BaseCompiler {
|
||||
public function getTagCompiler($tag): ?\Smarty\Compile\CompilerInterface {
|
||||
$tag = strtolower($tag);
|
||||
|
||||
$tag = strtolower($tag);
|
||||
|
||||
if (isset($this->smarty->security_policy) && !$this->smarty->security_policy->isTrustedTag($tag, $this)) {
|
||||
return null;
|
||||
}
|
||||
@@ -850,7 +841,7 @@ class Template extends BaseCompiler {
|
||||
$e = new CompilerException(
|
||||
$error_text,
|
||||
0,
|
||||
$this->template->getSource()->getFullResourceName(),
|
||||
$this->template->getSource()->getFilepath() ?? $this->template->getSource()->getFullResourceName(),
|
||||
$line
|
||||
);
|
||||
$e->source = trim(preg_replace('![\t\r\n]+!', ' ', $match[$line - 1]));
|
||||
@@ -1076,12 +1067,10 @@ class Template extends BaseCompiler {
|
||||
}
|
||||
|
||||
public function compileChildBlock() {
|
||||
$this->has_code = true;
|
||||
return $this->blockCompiler->compileChild($this);
|
||||
}
|
||||
|
||||
public function compileParentBlock() {
|
||||
$this->has_code = true;
|
||||
return $this->blockCompiler->compileParent($this);
|
||||
}
|
||||
|
||||
@@ -1098,8 +1087,6 @@ class Template extends BaseCompiler {
|
||||
*/
|
||||
private function compileTag2($tag, $args, $parameter) {
|
||||
// $args contains the attributes parsed and compiled by the lexer/parser
|
||||
// assume that tag does compile into code, but creates no HTML output
|
||||
$this->has_code = true;
|
||||
|
||||
$this->handleNocacheFlag($args);
|
||||
|
||||
@@ -1108,12 +1095,10 @@ class Template extends BaseCompiler {
|
||||
if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($tag, $this)) {
|
||||
$this->tag_nocache = $this->tag_nocache | !$tagCompiler->isCacheable();
|
||||
$_output = $tagCompiler->compile($args, $this, $parameter);
|
||||
if ($_output !== false) {
|
||||
if (!empty($parameter['modifierlist'])) {
|
||||
throw new CompilerException('No modifiers allowed on ' . $tag);
|
||||
}
|
||||
return $this->has_code && $_output !== true ? $_output : null;
|
||||
if (!empty($parameter['modifierlist'])) {
|
||||
throw new CompilerException('No modifiers allowed on ' . $tag);
|
||||
}
|
||||
return $_output;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1126,8 +1111,7 @@ class Template extends BaseCompiler {
|
||||
|
||||
$args['_attr']['name'] = "'{$tag}'";
|
||||
$tagCompiler = $this->getTagCompiler('call');
|
||||
$_output = $tagCompiler === null ? false : $tagCompiler->compile($args, $this, $parameter);
|
||||
return $this->has_code ? $_output : null;
|
||||
return $tagCompiler === null ? false : $tagCompiler->compile($args, $this, $parameter);
|
||||
}
|
||||
|
||||
// remaining tastes: (object-)function, (object-function-)block, custom-compiler
|
||||
@@ -1143,7 +1127,7 @@ class Template extends BaseCompiler {
|
||||
if ($this->smarty->getFunctionHandler($base_tag)) {
|
||||
if (!isset($this->smarty->security_policy) || $this->smarty->security_policy->isTrustedTag($base_tag, $this)) {
|
||||
return (new \Smarty\Compile\PrintExpressionCompiler())->compile(
|
||||
[],
|
||||
['nofilter'], // functions are never auto-escaped
|
||||
$this,
|
||||
['value' => $this->compileFunctionCall($base_tag, $args, $parameter)]
|
||||
);
|
||||
@@ -1371,6 +1355,11 @@ class Template extends BaseCompiler {
|
||||
return $this->functionCallCompiler->compile($args, $this, $parameter, $base_tag, $base_tag);
|
||||
}
|
||||
|
||||
public function compileModifierInExpression(string $function, array $_attr) {
|
||||
$value = array_shift($_attr);
|
||||
return $this->compileModifier([array_merge([$function], $_attr)], $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return TemplateParser|null
|
||||
*/
|
||||
|
||||
@@ -47,6 +47,20 @@ class Data
|
||||
*/
|
||||
public $config_vars = array();
|
||||
|
||||
/**
|
||||
* This variable will hold a stack of template variables.
|
||||
*
|
||||
* @var null|array
|
||||
*/
|
||||
private $_var_stack = [];
|
||||
|
||||
/**
|
||||
* This variable will hold a stack of config variables.
|
||||
*
|
||||
* @var null|array
|
||||
*/
|
||||
private $_config_stack = [];
|
||||
|
||||
/**
|
||||
* Default scope for new variables
|
||||
* @var int
|
||||
@@ -493,4 +507,20 @@ class Data
|
||||
public function setParent($parent): void {
|
||||
$this->parent = $parent;
|
||||
}
|
||||
|
||||
public function pushStack(): void {
|
||||
$stackList = [];
|
||||
foreach ($this->tpl_vars as $name => $variable) {
|
||||
$stackList[$name] = clone $variable; // variables are stored in Variable objects
|
||||
}
|
||||
$this->_var_stack[] = $this->tpl_vars;
|
||||
$this->tpl_vars = $stackList;
|
||||
|
||||
$this->_config_stack[] = $this->config_vars;
|
||||
}
|
||||
|
||||
public function popStack(): void {
|
||||
$this->tpl_vars = array_pop($this->_var_stack);
|
||||
$this->config_vars = array_pop($this->_config_stack);
|
||||
}
|
||||
}
|
||||
|
||||
+37
-46
@@ -6,16 +6,7 @@ namespace Smarty;
|
||||
* Smarty Internal Plugin Debug
|
||||
* Class to collect data for the Smarty Debugging Console
|
||||
*
|
||||
|
||||
|
||||
* @author Uwe Tews
|
||||
*/
|
||||
|
||||
/**
|
||||
* Smarty Internal Plugin Debug Class
|
||||
*
|
||||
|
||||
|
||||
*/
|
||||
class Debug extends Data
|
||||
{
|
||||
@@ -24,14 +15,14 @@ class Debug extends Data
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $template_data = array();
|
||||
public $template_data = [];
|
||||
|
||||
/**
|
||||
* List of uid's which shall be ignored
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $ignore_uid = array();
|
||||
public $ignore_uid = [];
|
||||
|
||||
/**
|
||||
* Index of display() and fetch() calls
|
||||
@@ -50,10 +41,10 @@ class Debug extends Data
|
||||
/**
|
||||
* Start logging template
|
||||
*
|
||||
* @param \Smarty\Template $template template
|
||||
* @param Template $template template
|
||||
* @param null $mode true: display false: fetch null: subtemplate
|
||||
*/
|
||||
public function start_template(\Smarty\Template $template, $mode = null)
|
||||
public function start_template(Template $template, $mode = null)
|
||||
{
|
||||
if (isset($mode) && !$template->_isSubTpl()) {
|
||||
$this->index++;
|
||||
@@ -67,9 +58,9 @@ class Debug extends Data
|
||||
/**
|
||||
* End logging of cache time
|
||||
*
|
||||
* @param \Smarty\Template $template cached template
|
||||
* @param Template $template cached template
|
||||
*/
|
||||
public function end_template(\Smarty\Template $template)
|
||||
public function end_template(Template $template)
|
||||
{
|
||||
$key = $this->get_key($template);
|
||||
$this->template_data[ $this->index ][ $key ][ 'total_time' ] +=
|
||||
@@ -79,15 +70,15 @@ class Debug extends Data
|
||||
/**
|
||||
* Start logging of compile time
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
* @param Template $template
|
||||
*/
|
||||
public function start_compile(\Smarty\Template $template)
|
||||
public function start_compile(Template $template)
|
||||
{
|
||||
static $_is_stringy = array('string' => true, 'eval' => true);
|
||||
if (!empty($template->getCompiler()->trace_uid)) {
|
||||
$key = $template->getCompiler()->trace_uid;
|
||||
if (!isset($this->template_data[ $this->index ][ $key ])) {
|
||||
$this->saveTemplateData($_is_stringy, $template, $key);
|
||||
$this->saveTemplateData($_is_stringy, $template, $key);
|
||||
}
|
||||
} else {
|
||||
if (isset($this->ignore_uid[ $template->getSource()->uid ])) {
|
||||
@@ -101,9 +92,9 @@ class Debug extends Data
|
||||
/**
|
||||
* End logging of compile time
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
* @param Template $template
|
||||
*/
|
||||
public function end_compile(\Smarty\Template $template)
|
||||
public function end_compile(Template $template)
|
||||
{
|
||||
if (!empty($template->getCompiler()->trace_uid)) {
|
||||
$key = $template->getCompiler()->trace_uid;
|
||||
@@ -120,9 +111,9 @@ class Debug extends Data
|
||||
/**
|
||||
* Start logging of render time
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
* @param Template $template
|
||||
*/
|
||||
public function start_render(\Smarty\Template $template)
|
||||
public function start_render(Template $template)
|
||||
{
|
||||
$key = $this->get_key($template);
|
||||
$this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true);
|
||||
@@ -131,9 +122,9 @@ class Debug extends Data
|
||||
/**
|
||||
* End logging of compile time
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
* @param Template $template
|
||||
*/
|
||||
public function end_render(\Smarty\Template $template)
|
||||
public function end_render(Template $template)
|
||||
{
|
||||
$key = $this->get_key($template);
|
||||
$this->template_data[ $this->index ][ $key ][ 'render_time' ] +=
|
||||
@@ -143,9 +134,9 @@ class Debug extends Data
|
||||
/**
|
||||
* Start logging of cache time
|
||||
*
|
||||
* @param \Smarty\Template $template cached template
|
||||
* @param Template $template cached template
|
||||
*/
|
||||
public function start_cache(\Smarty\Template $template)
|
||||
public function start_cache(Template $template)
|
||||
{
|
||||
$key = $this->get_key($template);
|
||||
$this->template_data[ $this->index ][ $key ][ 'start_time' ] = microtime(true);
|
||||
@@ -154,9 +145,9 @@ class Debug extends Data
|
||||
/**
|
||||
* End logging of cache time
|
||||
*
|
||||
* @param \Smarty\Template $template cached template
|
||||
* @param Template $template cached template
|
||||
*/
|
||||
public function end_cache(\Smarty\Template $template)
|
||||
public function end_cache(Template $template)
|
||||
{
|
||||
$key = $this->get_key($template);
|
||||
$this->template_data[ $this->index ][ $key ][ 'cache_time' ] +=
|
||||
@@ -166,9 +157,9 @@ class Debug extends Data
|
||||
/**
|
||||
* Register template object
|
||||
*
|
||||
* @param \Smarty\Template $template cached template
|
||||
* @param Template $template cached template
|
||||
*/
|
||||
public function register_template(\Smarty\Template $template)
|
||||
public function register_template(Template $template)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -184,13 +175,13 @@ class Debug extends Data
|
||||
/**
|
||||
* Opens a window for the Smarty Debugging Console and display the data
|
||||
*
|
||||
* @param \Smarty\Template|\Smarty $obj object to debug
|
||||
* @param Template|Smarty $obj object to debug
|
||||
* @param bool $full
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \Smarty\Exception
|
||||
* @throws Exception
|
||||
*/
|
||||
public function display_debug($obj, $full = false)
|
||||
public function display_debug($obj, bool $full = false)
|
||||
{
|
||||
if (!$full) {
|
||||
$this->offset++;
|
||||
@@ -200,18 +191,18 @@ class Debug extends Data
|
||||
$smarty = $obj->getSmarty();
|
||||
// create fresh instance of smarty for displaying the debug console
|
||||
// to avoid problems if the application did overload the Smarty class
|
||||
$debObj = new \Smarty\Smarty();
|
||||
$debObj = new Smarty();
|
||||
// copy the working dirs from application
|
||||
$debObj->setCompileDir($smarty->getCompileDir());
|
||||
$debObj->compile_check = \Smarty::COMPILECHECK_ON;
|
||||
$debObj->compile_check = Smarty::COMPILECHECK_ON;
|
||||
$debObj->security_policy = null;
|
||||
$debObj->debugging = false;
|
||||
$debObj->debugging_ctrl = 'NONE';
|
||||
$debObj->error_reporting = E_ALL & ~E_NOTICE;
|
||||
$debObj->debug_tpl = $smarty->debug_tpl ?? 'file:' . __DIR__ . '/../debug.tpl';
|
||||
$debObj->debug_tpl = $smarty->debug_tpl ?? 'file:' . __DIR__ . '/debug.tpl';
|
||||
$debObj->registered_resources = array();
|
||||
$debObj->escape_html = true;
|
||||
$debObj->caching = \Smarty::CACHING_OFF;
|
||||
$debObj->caching = Smarty::CACHING_OFF;
|
||||
// prepare information of assigned variables
|
||||
$ptr = $this->get_debug_vars($obj);
|
||||
$_assigned_vars = $ptr->tpl_vars;
|
||||
@@ -223,7 +214,7 @@ class Debug extends Data
|
||||
$displayMode = $debugging === 2 || !$full;
|
||||
$offset = $this->offset * 50;
|
||||
$_template = $debObj->doCreateTemplate($debObj->debug_tpl);
|
||||
if ($obj instanceof \Smarty\Template) {
|
||||
if ($obj instanceof Template) {
|
||||
$_template->assign('template_name', $templateName);
|
||||
} elseif ($obj instanceof Smarty || $full) {
|
||||
$_template->assign('template_data', $this->template_data[$this->index]);
|
||||
@@ -298,11 +289,11 @@ class Debug extends Data
|
||||
/**
|
||||
* Return key into $template_data for template
|
||||
*
|
||||
* @param \Smarty\Template $template template object
|
||||
* @param Template $template template object
|
||||
*
|
||||
* @return string key into $template_data
|
||||
*/
|
||||
private function get_key(\Smarty\Template $template)
|
||||
private function get_key(Template $template)
|
||||
{
|
||||
static $_is_stringy = array('string' => true, 'eval' => true);
|
||||
|
||||
@@ -319,9 +310,9 @@ class Debug extends Data
|
||||
/**
|
||||
* Ignore template
|
||||
*
|
||||
* @param \Smarty\Template $template
|
||||
* @param Template $template
|
||||
*/
|
||||
public function ignore(\Smarty\Template $template)
|
||||
public function ignore(Template $template)
|
||||
{
|
||||
$this->ignore_uid[$template->getSource()->uid] = true;
|
||||
}
|
||||
@@ -329,9 +320,9 @@ class Debug extends Data
|
||||
/**
|
||||
* handle 'URL' debugging mode
|
||||
*
|
||||
* @param \Smarty $smarty
|
||||
* @param Smarty $smarty
|
||||
*/
|
||||
public function debugUrl(\Smarty $smarty)
|
||||
public function debugUrl(Smarty $smarty)
|
||||
{
|
||||
if (isset($_SERVER[ 'QUERY_STRING' ])) {
|
||||
$_query_string = $_SERVER[ 'QUERY_STRING' ];
|
||||
@@ -360,12 +351,12 @@ class Debug extends Data
|
||||
|
||||
/**
|
||||
* @param array $_is_stringy
|
||||
* @param \Smarty\Template $template
|
||||
* @param Template $template
|
||||
* @param string $key
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function saveTemplateData(array $_is_stringy, \Smarty\Template $template, string $key): void {
|
||||
private function saveTemplateData(array $_is_stringy, Template $template, string $key): void {
|
||||
if (isset($_is_stringy[$template->getSource()->type])) {
|
||||
$this->template_data[$this->index][$key]['name'] =
|
||||
'\'' . substr($template->getSource()->name, 0, 25) . '...\'';
|
||||
|
||||
@@ -77,7 +77,7 @@ class ErrorHandler
|
||||
}
|
||||
|
||||
if ($this->allowUndefinedArrayKeys && preg_match(
|
||||
'/^(Undefined index|Undefined array key|Trying to access array offset on value of type)/',
|
||||
'/^(Undefined index|Undefined array key|Trying to access array offset on)/',
|
||||
$errstr
|
||||
)) {
|
||||
return; // suppresses this error
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
namespace Smarty\Extension;
|
||||
|
||||
use Smarty\Exception;
|
||||
|
||||
class DefaultExtension extends Base {
|
||||
|
||||
private $modifiers = [];
|
||||
@@ -27,7 +29,9 @@ class DefaultExtension extends Base {
|
||||
case 'escape': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\EscapeModifierCompiler(); break;
|
||||
case 'from_charset': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\FromCharsetModifierCompiler(); break;
|
||||
case 'indent': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\IndentModifierCompiler(); break;
|
||||
case 'is_array': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\IsArrayModifierCompiler(); break;
|
||||
case 'isset': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\IssetModifierCompiler(); break;
|
||||
case 'json_encode': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\JsonEncodeModifierCompiler(); break;
|
||||
case 'lower': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\LowerModifierCompiler(); break;
|
||||
case 'nl2br': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\Nl2brModifierCompiler(); break;
|
||||
case 'noprint': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\NoPrintModifierCompiler(); break;
|
||||
@@ -37,6 +41,7 @@ class DefaultExtension extends Base {
|
||||
case 'strip': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\StripModifierCompiler(); break;
|
||||
case 'strip_tags': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\StripTagsModifierCompiler(); break;
|
||||
case 'strlen': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\StrlenModifierCompiler(); break;
|
||||
case 'substr': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\SubstrModifierCompiler(); break;
|
||||
case 'to_charset': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\ToCharsetModifierCompiler(); break;
|
||||
case 'unescape': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\UnescapeModifierCompiler(); break;
|
||||
case 'upper': $this->modifiers[$modifier] = new \Smarty\Compile\Modifier\UpperModifierCompiler(); break;
|
||||
@@ -54,11 +59,15 @@ class DefaultExtension extends Base {
|
||||
case 'debug_print_var': return [$this, 'smarty_modifier_debug_print_var'];
|
||||
case 'escape': return [$this, 'smarty_modifier_escape'];
|
||||
case 'explode': return [$this, 'smarty_modifier_explode'];
|
||||
case 'implode': return [$this, 'smarty_modifier_implode'];
|
||||
case 'in_array': return [$this, 'smarty_modifier_in_array'];
|
||||
case 'join': return [$this, 'smarty_modifier_join'];
|
||||
case 'mb_wordwrap': return [$this, 'smarty_modifier_mb_wordwrap'];
|
||||
case 'number_format': return [$this, 'smarty_modifier_number_format'];
|
||||
case 'regex_replace': return [$this, 'smarty_modifier_regex_replace'];
|
||||
case 'replace': return [$this, 'smarty_modifier_replace'];
|
||||
case 'spacify': return [$this, 'smarty_modifier_spacify'];
|
||||
case 'split': return [$this, 'smarty_modifier_split'];
|
||||
case 'truncate': return [$this, 'smarty_modifier_truncate'];
|
||||
}
|
||||
return null;
|
||||
@@ -82,12 +91,8 @@ class DefaultExtension extends Base {
|
||||
case 'html_select_date': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\HtmlSelectDate(); break;
|
||||
case 'html_select_time': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\HtmlSelectTime(); break;
|
||||
case 'html_table': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\HtmlTable(); break;
|
||||
case 'in_array': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\InArray(); break;
|
||||
case 'is_array': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\IsArray(); break;
|
||||
case 'mailto': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\Mailto(); break;
|
||||
case 'math': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\Math(); break;
|
||||
case 'strlen': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\Strlen(); break;
|
||||
case 'time': $this->functionHandlers[$functionName] = new \Smarty\FunctionHandler\Time(); break;
|
||||
}
|
||||
|
||||
return $this->functionHandlers[$functionName] ?? null;
|
||||
@@ -211,7 +216,7 @@ class DefaultExtension extends Base {
|
||||
* > 1 would be returned, unless value was null, in which case 0 would be returned.
|
||||
*/
|
||||
|
||||
if ($arrayOrObject instanceof Countable || is_array($arrayOrObject)) {
|
||||
if ($arrayOrObject instanceof \Countable || is_array($arrayOrObject)) {
|
||||
return count($arrayOrObject, (int) $mode);
|
||||
} elseif ($arrayOrObject === null) {
|
||||
return 0;
|
||||
@@ -518,10 +523,91 @@ class DefaultExtension extends Base {
|
||||
*/
|
||||
public function smarty_modifier_explode($separator, $string, ?int $limit = null)
|
||||
{
|
||||
trigger_error("Using explode is deprecated. " .
|
||||
"Use split, using the array first, separator second.", E_USER_DEPRECATED);
|
||||
// provide $string default to prevent deprecation errors in PHP >=8.1
|
||||
return explode($separator, $string ?? '', $limit ?? PHP_INT_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty split modifier plugin
|
||||
* Type: modifier
|
||||
* Name: split
|
||||
* Purpose: split a string by a string
|
||||
*
|
||||
* @param string $string
|
||||
* @param string $separator
|
||||
* @param int|null $limit
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function smarty_modifier_split($string, $separator, ?int $limit = null)
|
||||
{
|
||||
// provide $string default to prevent deprecation errors in PHP >=8.1
|
||||
return explode($separator, $string ?? '', $limit ?? PHP_INT_MAX);
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty implode modifier plugin
|
||||
* Type: modifier
|
||||
* Name: implode
|
||||
* Purpose: join an array of values into a single string
|
||||
*
|
||||
* @param array $values
|
||||
* @param string $separator
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function smarty_modifier_implode($values, $separator = '')
|
||||
{
|
||||
|
||||
trigger_error("Using implode is deprecated. " .
|
||||
"Use join using the array first, separator second.", E_USER_DEPRECATED);
|
||||
|
||||
if (is_array($separator)) {
|
||||
return implode((string) ($values ?? ''), (array) $separator);
|
||||
}
|
||||
return implode((string) ($separator ?? ''), (array) $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty in_array modifier plugin
|
||||
* Type: modifier
|
||||
* Name: in_array
|
||||
* Purpose: test if value is contained in an array
|
||||
*
|
||||
* @param mixed $needle
|
||||
* @param array $array
|
||||
* @param bool $strict
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function smarty_modifier_in_array($needle, $array, $strict = false)
|
||||
{
|
||||
return in_array($needle, (array) $array, (bool) $strict);
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty join modifier plugin
|
||||
* Type: modifier
|
||||
* Name: join
|
||||
* Purpose: join an array of values into a single string
|
||||
*
|
||||
* @param array $values
|
||||
* @param string $separator
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function smarty_modifier_join($values, $separator = '')
|
||||
{
|
||||
if (is_array($separator)) {
|
||||
trigger_error("Using join with the separator first is deprecated. " .
|
||||
"Call join using the array first, separator second.", E_USER_DEPRECATED);
|
||||
return implode((string) ($values ?? ''), (array) $separator);
|
||||
}
|
||||
return implode((string) ($separator ?? ''), (array) $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Smarty wordwrap modifier plugin
|
||||
* Type: modifier
|
||||
|
||||
@@ -2,20 +2,82 @@
|
||||
|
||||
namespace Smarty\Extension;
|
||||
|
||||
use Smarty\BlockHandler\BlockHandlerInterface;
|
||||
use Smarty\Compile\CompilerInterface;
|
||||
use Smarty\Compile\Modifier\ModifierCompilerInterface;
|
||||
use Smarty\FunctionHandler\FunctionHandlerInterface;
|
||||
|
||||
interface ExtensionInterface {
|
||||
|
||||
public function getTagCompiler(string $tag): ?\Smarty\Compile\CompilerInterface;
|
||||
/**
|
||||
* Either return \Smarty\Compile\CompilerInterface that will compile the given $tag or
|
||||
* return null to indicate that you do not know how to handle this $tag. (Another Extension might.)
|
||||
*
|
||||
* @param string $tag
|
||||
* @return CompilerInterface|null
|
||||
*/
|
||||
public function getTagCompiler(string $tag): ?CompilerInterface;
|
||||
|
||||
public function getModifierCompiler(string $modifier): ?\Smarty\Compile\Modifier\ModifierCompilerInterface;
|
||||
/**
|
||||
* Either return \Smarty\Compile\Modifier\ModifierCompilerInterface that will compile the given $modifier or
|
||||
* return null to indicate that you do not know how to handle this $modifier. (Another Extension might.)
|
||||
*
|
||||
* @param string $modifier
|
||||
* @return ModifierCompilerInterface|null
|
||||
*/
|
||||
public function getModifierCompiler(string $modifier): ?ModifierCompilerInterface;
|
||||
|
||||
public function getFunctionHandler(string $functionName): ?\Smarty\FunctionHandler\FunctionHandlerInterface;
|
||||
/**
|
||||
* Either return \Smarty\FunctionHandler\FunctionHandlerInterface that will handle the given $functionName or
|
||||
* return null to indicate that you do not know how to handle this $functionName. (Another Extension might.)
|
||||
*
|
||||
* @param string $functionName
|
||||
* @return FunctionHandlerInterface|null
|
||||
*/
|
||||
public function getFunctionHandler(string $functionName): ?FunctionHandlerInterface;
|
||||
|
||||
public function getBlockHandler(string $blockTagName): ?\Smarty\BlockHandler\BlockHandlerInterface;
|
||||
/**
|
||||
* Either return \Smarty\BlockHandler\BlockHandlerInterface that will handle the given $blockTagName or return null
|
||||
* to indicate that you do not know how to handle this $blockTagName. (Another Extension might.)
|
||||
*
|
||||
* @param string $blockTagName
|
||||
* @return BlockHandlerInterface|null
|
||||
*/
|
||||
public function getBlockHandler(string $blockTagName): ?BlockHandlerInterface;
|
||||
|
||||
/**
|
||||
* Either return a callable that takes at least 1 parameter (a string) and returns a modified string or return null
|
||||
* to indicate that you do not know how to handle this $modifierName. (Another Extension might.)
|
||||
*
|
||||
* The callable can accept additional optional parameters.
|
||||
*
|
||||
* @param string $modifierName
|
||||
* @return callable|null
|
||||
*/
|
||||
public function getModifierCallback(string $modifierName);
|
||||
|
||||
/**
|
||||
* Return a list of prefilters that will all be applied, in sequence.
|
||||
* Template prefilters can be used to preprocess templates before they are compiled.
|
||||
*
|
||||
* @return \Smarty\Filter\FilterInterface[]
|
||||
*/
|
||||
public function getPreFilters(): array;
|
||||
|
||||
/**
|
||||
* Return a list of postfilters that will all be applied, in sequence.
|
||||
* Template postfilters can be used to process compiled template code (so, after the compilation).
|
||||
*
|
||||
* @return \Smarty\Filter\FilterInterface[]
|
||||
*/
|
||||
public function getPostFilters(): array;
|
||||
|
||||
/**
|
||||
* Return a list of outputfilters that will all be applied, in sequence.
|
||||
* Template outputfilters can be used to change template output just before it is rendered.
|
||||
*
|
||||
* @return \Smarty\Filter\FilterInterface[]
|
||||
*/
|
||||
public function getOutputFilters(): array;
|
||||
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty\FunctionHandler;
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
* in_array(mixed $needle, array $haystack, bool $strict = false): bool
|
||||
* Returns true if needle is found in the array, false otherwise
|
||||
*/
|
||||
class InArray extends Base {
|
||||
|
||||
public function handle($params, Template $template) {
|
||||
|
||||
$params = array_values($params ?? []);
|
||||
|
||||
if (count($params) < 2 || count($params) > 3) {
|
||||
throw new Exception("Invalid number of arguments for in_array. in_arrays expects 2 or 3 parameters.");
|
||||
}
|
||||
|
||||
// default to false, true if param 3 is set to true
|
||||
$needle = $params[0];
|
||||
$haystack = (array) $params[1];
|
||||
$strict = count($params) == 3 && $params[2];
|
||||
|
||||
return in_array($needle, $haystack, $strict);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty\FunctionHandler;
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
* is_array(mixed $value): bool
|
||||
* Returns true if value is an array, false otherwise.
|
||||
*/
|
||||
class IsArray extends Base {
|
||||
|
||||
public function handle($params, Template $template) {
|
||||
if (count($params) !== 1) {
|
||||
throw new Exception("Invalid number of arguments for is_array. is_array expects exactly 1 parameter.");
|
||||
}
|
||||
return is_array(reset($params));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty\FunctionHandler;
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
* Get string length
|
||||
*
|
||||
* strlen(string $string): int
|
||||
*
|
||||
* Returns length of the string on success, and 0 if the string is empty.
|
||||
*/
|
||||
class Strlen extends Base {
|
||||
|
||||
public function handle($params, Template $template) {
|
||||
|
||||
$params = array_values($params ?? []);
|
||||
|
||||
if (count($params) !== 1) {
|
||||
throw new Exception("Invalid number of arguments for strlen. strlen expects exactly 1 parameter.");
|
||||
}
|
||||
|
||||
return strlen((string) $params[0]);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Smarty\FunctionHandler;
|
||||
|
||||
use Smarty\Exception;
|
||||
use Smarty\Template;
|
||||
|
||||
/**
|
||||
* is_array(mixed $value): bool
|
||||
* Returns true if value is an array, false otherwise.
|
||||
*/
|
||||
class Time extends Base {
|
||||
|
||||
public function handle($params, Template $template) {
|
||||
if (count($params) > 0) {
|
||||
throw new Exception("Invalid number of arguments for time. time expects no parameters.");
|
||||
}
|
||||
return time();
|
||||
}
|
||||
|
||||
}
|
||||
+135
-137
@@ -2134,13 +2134,11 @@ public static $yy_action = array(
|
||||
}
|
||||
// line 292 "src/Parser/TemplateParser.y"
|
||||
public function yy_r9(){
|
||||
if ($this->compiler->has_code) {
|
||||
$this->current_buffer->append_subtree($this, $this->mergePrefixCode($this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
$this->current_buffer->append_subtree($this, $this->mergePrefixCode($this->yystack[$this->yyidx + 0]->minor));
|
||||
$this->compiler->has_variable_string = false;
|
||||
$this->block_nesting_level = $this->compiler->getTagStackCount();
|
||||
}
|
||||
// line 304 "src/Parser/TemplateParser.y"
|
||||
// line 302 "src/Parser/TemplateParser.y"
|
||||
public function yy_r11(){
|
||||
$var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->compiler->getLdelLength(), -$this->compiler->getRdelLength()), ' $');
|
||||
$attributes = [];
|
||||
@@ -2150,7 +2148,7 @@ public static $yy_action = array(
|
||||
}
|
||||
$this->_retvalue = $this->compiler->compilePrintExpression($this->compiler->compileVariable('\''.$var.'\''), $attributes);
|
||||
}
|
||||
// line 315 "src/Parser/TemplateParser.y"
|
||||
// line 313 "src/Parser/TemplateParser.y"
|
||||
public function yy_r12(){
|
||||
$tag = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->compiler->getLdelLength(), -$this->compiler->getRdelLength()));
|
||||
if ($tag == 'strip') {
|
||||
@@ -2171,7 +2169,7 @@ public static $yy_action = array(
|
||||
}
|
||||
}
|
||||
}
|
||||
// line 336 "src/Parser/TemplateParser.y"
|
||||
// line 334 "src/Parser/TemplateParser.y"
|
||||
public function yy_r13(){
|
||||
$j = strrpos($this->yystack[$this->yyidx + 0]->minor,'.');
|
||||
if ($this->yystack[$this->yyidx + 0]->minor[$j+1] == 'c') {
|
||||
@@ -2182,35 +2180,35 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileParentBlock();
|
||||
}
|
||||
}
|
||||
// line 347 "src/Parser/TemplateParser.y"
|
||||
// line 345 "src/Parser/TemplateParser.y"
|
||||
public function yy_r14(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
|
||||
}
|
||||
// line 351 "src/Parser/TemplateParser.y"
|
||||
// line 349 "src/Parser/TemplateParser.y"
|
||||
public function yy_r15(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
|
||||
}
|
||||
// line 355 "src/Parser/TemplateParser.y"
|
||||
// line 353 "src/Parser/TemplateParser.y"
|
||||
public function yy_r16(){
|
||||
$this->_retvalue = $this->compiler->compilePrintExpression($this->yystack[$this->yyidx + 0]->minor[0], $this->yystack[$this->yyidx + 0]->minor[1]);
|
||||
}
|
||||
// line 364 "src/Parser/TemplateParser.y"
|
||||
// line 362 "src/Parser/TemplateParser.y"
|
||||
public function yy_r17(){
|
||||
$this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + 0]->minor[0]),array('var'=>'\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\'')),$this->yystack[$this->yyidx + 0]->minor[1]));
|
||||
}
|
||||
// line 368 "src/Parser/TemplateParser.y"
|
||||
// line 366 "src/Parser/TemplateParser.y"
|
||||
public function yy_r18(){
|
||||
$this->_retvalue = $this->compiler->compileTag('assign',array_merge(array(array('value'=>$this->yystack[$this->yyidx + 0]->minor[0]),array('var'=>$this->yystack[$this->yyidx + -1]->minor['var'])),$this->yystack[$this->yyidx + 0]->minor[1]),array('smarty_internal_index'=>$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']));
|
||||
}
|
||||
// line 372 "src/Parser/TemplateParser.y"
|
||||
// line 370 "src/Parser/TemplateParser.y"
|
||||
public function yy_r19(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 376 "src/Parser/TemplateParser.y"
|
||||
// line 374 "src/Parser/TemplateParser.y"
|
||||
public function yy_r20(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 391 "src/Parser/TemplateParser.y"
|
||||
// line 389 "src/Parser/TemplateParser.y"
|
||||
public function yy_r24(){
|
||||
if (defined($this->yystack[$this->yyidx + -1]->minor)) {
|
||||
if ($this->security) {
|
||||
@@ -2221,7 +2219,7 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
}
|
||||
// line 401 "src/Parser/TemplateParser.y"
|
||||
// line 399 "src/Parser/TemplateParser.y"
|
||||
public function yy_r25(){
|
||||
if (defined($this->yystack[$this->yyidx + 0]->minor)) {
|
||||
if ($this->security) {
|
||||
@@ -2232,7 +2230,7 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor,array());
|
||||
}
|
||||
}
|
||||
// line 414 "src/Parser/TemplateParser.y"
|
||||
// line 412 "src/Parser/TemplateParser.y"
|
||||
public function yy_r26(){
|
||||
if (defined($this->yystack[$this->yyidx + -2]->minor)) {
|
||||
if ($this->security) {
|
||||
@@ -2243,66 +2241,66 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor,$this->yystack[$this->yyidx + 0]->minor, array('modifierlist'=>$this->yystack[$this->yyidx + -1]->minor));
|
||||
}
|
||||
}
|
||||
// line 426 "src/Parser/TemplateParser.y"
|
||||
// line 424 "src/Parser/TemplateParser.y"
|
||||
public function yy_r27(){
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor,$this->yystack[$this->yyidx + 0]->minor,array('object_method'=>$this->yystack[$this->yyidx + -1]->minor));
|
||||
}
|
||||
// line 431 "src/Parser/TemplateParser.y"
|
||||
// line 429 "src/Parser/TemplateParser.y"
|
||||
public function yy_r28(){
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -4]->minor,$this->yystack[$this->yyidx + 0]->minor,array('modifierlist'=>$this->yystack[$this->yyidx + -1]->minor, 'object_method'=>$this->yystack[$this->yyidx + -2]->minor));
|
||||
}
|
||||
// line 436 "src/Parser/TemplateParser.y"
|
||||
// line 434 "src/Parser/TemplateParser.y"
|
||||
public function yy_r29(){
|
||||
$tag = trim(substr($this->yystack[$this->yyidx + -1]->minor,$this->compiler->getLdelLength()));
|
||||
$this->_retvalue = $this->compiler->compileTag(($tag === 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 441 "src/Parser/TemplateParser.y"
|
||||
// line 439 "src/Parser/TemplateParser.y"
|
||||
public function yy_r30(){
|
||||
$tag = trim(substr($this->yystack[$this->yyidx + -2]->minor,$this->compiler->getLdelLength()));
|
||||
$this->_retvalue = $this->compiler->compileTag(($tag === 'else if')? 'elseif' : $tag,$this->yystack[$this->yyidx + 0]->minor,array('if condition'=>$this->yystack[$this->yyidx + -1]->minor));
|
||||
}
|
||||
// line 446 "src/Parser/TemplateParser.y"
|
||||
// line 444 "src/Parser/TemplateParser.y"
|
||||
public function yy_r31(){
|
||||
$tag = trim(substr($this->yystack[$this->yyidx + -1]->minor,$this->compiler->getLdelLength()));
|
||||
$this->_retvalue = $this->compiler->compileTag(($tag === 'else if')? 'elseif' : $tag,array(),array('if condition'=>$this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 457 "src/Parser/TemplateParser.y"
|
||||
// line 455 "src/Parser/TemplateParser.y"
|
||||
public function yy_r33(){
|
||||
$this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + 0]->minor,array(array('start'=>$this->yystack[$this->yyidx + -6]->minor),array('ifexp'=>$this->yystack[$this->yyidx + -4]->minor),array('var'=>$this->yystack[$this->yyidx + -2]->minor),array('step'=>$this->yystack[$this->yyidx + -1]->minor))),1);
|
||||
}
|
||||
// line 461 "src/Parser/TemplateParser.y"
|
||||
// line 459 "src/Parser/TemplateParser.y"
|
||||
public function yy_r34(){
|
||||
$this->_retvalue = '='.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 469 "src/Parser/TemplateParser.y"
|
||||
// line 467 "src/Parser/TemplateParser.y"
|
||||
public function yy_r36(){
|
||||
$this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + 0]->minor,array(array('start'=>$this->yystack[$this->yyidx + -3]->minor),array('to'=>$this->yystack[$this->yyidx + -1]->minor))),0);
|
||||
}
|
||||
// line 473 "src/Parser/TemplateParser.y"
|
||||
// line 471 "src/Parser/TemplateParser.y"
|
||||
public function yy_r37(){
|
||||
$this->_retvalue = $this->compiler->compileTag('for',array_merge($this->yystack[$this->yyidx + 0]->minor,array(array('start'=>$this->yystack[$this->yyidx + -5]->minor),array('to'=>$this->yystack[$this->yyidx + -3]->minor),array('step'=>$this->yystack[$this->yyidx + -1]->minor))),0);
|
||||
}
|
||||
// line 478 "src/Parser/TemplateParser.y"
|
||||
// line 476 "src/Parser/TemplateParser.y"
|
||||
public function yy_r38(){
|
||||
$this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + 0]->minor,array(array('from'=>$this->yystack[$this->yyidx + -3]->minor),array('item'=>$this->yystack[$this->yyidx + -1]->minor))));
|
||||
}
|
||||
// line 482 "src/Parser/TemplateParser.y"
|
||||
// line 480 "src/Parser/TemplateParser.y"
|
||||
public function yy_r39(){
|
||||
$this->_retvalue = $this->compiler->compileTag('foreach',array_merge($this->yystack[$this->yyidx + 0]->minor,array(array('from'=>$this->yystack[$this->yyidx + -5]->minor),array('item'=>$this->yystack[$this->yyidx + -1]->minor),array('key'=>$this->yystack[$this->yyidx + -3]->minor))));
|
||||
}
|
||||
// line 485 "src/Parser/TemplateParser.y"
|
||||
// line 483 "src/Parser/TemplateParser.y"
|
||||
public function yy_r40(){
|
||||
$this->_retvalue = $this->compiler->compileTag('foreach',$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 490 "src/Parser/TemplateParser.y"
|
||||
// line 488 "src/Parser/TemplateParser.y"
|
||||
public function yy_r41(){
|
||||
$this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array(array_merge(array($this->yystack[$this->yyidx + -1]->minor),$this->yystack[$this->yyidx + 0]->minor))));
|
||||
}
|
||||
// line 494 "src/Parser/TemplateParser.y"
|
||||
// line 492 "src/Parser/TemplateParser.y"
|
||||
public function yy_r42(){
|
||||
$this->_retvalue = $this->compiler->compileTag('setfilter',array(),array('modifier_list'=>array_merge(array(array_merge(array($this->yystack[$this->yyidx + -2]->minor),$this->yystack[$this->yyidx + -1]->minor)),$this->yystack[$this->yyidx + 0]->minor)));
|
||||
}
|
||||
// line 500 "src/Parser/TemplateParser.y"
|
||||
// line 498 "src/Parser/TemplateParser.y"
|
||||
public function yy_r43(){
|
||||
$tag = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->compiler->getLdelLength(), -$this->compiler->getRdelLength()), ' /');
|
||||
if ($tag === 'strip') {
|
||||
@@ -2312,36 +2310,36 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileTag($tag.'close',array());
|
||||
}
|
||||
}
|
||||
// line 509 "src/Parser/TemplateParser.y"
|
||||
// line 507 "src/Parser/TemplateParser.y"
|
||||
public function yy_r44(){
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + 0]->minor.'close',array());
|
||||
}
|
||||
// line 513 "src/Parser/TemplateParser.y"
|
||||
// line 511 "src/Parser/TemplateParser.y"
|
||||
public function yy_r45(){
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -1]->minor.'close',array(),array('modifier_list'=>$this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 518 "src/Parser/TemplateParser.y"
|
||||
// line 516 "src/Parser/TemplateParser.y"
|
||||
public function yy_r46(){
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -2]->minor.'close',array(),array('object_method'=>$this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 522 "src/Parser/TemplateParser.y"
|
||||
// line 520 "src/Parser/TemplateParser.y"
|
||||
public function yy_r47(){
|
||||
$this->_retvalue = $this->compiler->compileTag($this->yystack[$this->yyidx + -3]->minor.'close',array(),array('object_method'=>$this->yystack[$this->yyidx + -1]->minor, 'modifier_list'=>$this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 530 "src/Parser/TemplateParser.y"
|
||||
// line 528 "src/Parser/TemplateParser.y"
|
||||
public function yy_r48(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
|
||||
$this->_retvalue[] = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 536 "src/Parser/TemplateParser.y"
|
||||
// line 534 "src/Parser/TemplateParser.y"
|
||||
public function yy_r49(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 541 "src/Parser/TemplateParser.y"
|
||||
// line 539 "src/Parser/TemplateParser.y"
|
||||
public function yy_r50(){
|
||||
$this->_retvalue = array();
|
||||
}
|
||||
// line 546 "src/Parser/TemplateParser.y"
|
||||
// line 544 "src/Parser/TemplateParser.y"
|
||||
public function yy_r51(){
|
||||
if (defined($this->yystack[$this->yyidx + 0]->minor)) {
|
||||
if ($this->security) {
|
||||
@@ -2352,108 +2350,108 @@ public static $yy_action = array(
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>'\''.$this->yystack[$this->yyidx + 0]->minor.'\'');
|
||||
}
|
||||
}
|
||||
// line 557 "src/Parser/TemplateParser.y"
|
||||
// line 555 "src/Parser/TemplateParser.y"
|
||||
public function yy_r52(){
|
||||
$this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor," =\n\r\t")=>$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 565 "src/Parser/TemplateParser.y"
|
||||
// line 563 "src/Parser/TemplateParser.y"
|
||||
public function yy_r54(){
|
||||
$this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';
|
||||
}
|
||||
// line 577 "src/Parser/TemplateParser.y"
|
||||
// line 575 "src/Parser/TemplateParser.y"
|
||||
public function yy_r57(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor=>$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 590 "src/Parser/TemplateParser.y"
|
||||
// line 588 "src/Parser/TemplateParser.y"
|
||||
public function yy_r59(){
|
||||
$this->yystack[$this->yyidx + -2]->minor[]=$this->yystack[$this->yyidx + 0]->minor;
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor;
|
||||
}
|
||||
// line 595 "src/Parser/TemplateParser.y"
|
||||
// line 593 "src/Parser/TemplateParser.y"
|
||||
public function yy_r60(){
|
||||
$this->_retvalue = array('var' => '\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'\'', 'value'=>$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 602 "src/Parser/TemplateParser.y"
|
||||
// line 600 "src/Parser/TemplateParser.y"
|
||||
public function yy_r62(){
|
||||
$this->_retvalue = array('var' => $this->yystack[$this->yyidx + -2]->minor, 'value'=>$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 606 "src/Parser/TemplateParser.y"
|
||||
// line 604 "src/Parser/TemplateParser.y"
|
||||
public function yy_r63(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
|
||||
}
|
||||
// line 631 "src/Parser/TemplateParser.y"
|
||||
// line 629 "src/Parser/TemplateParser.y"
|
||||
public function yy_r67(){
|
||||
$this->_retvalue = '$_smarty_tpl->getVariable(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')->preIncDec(\'' . $this->yystack[$this->yyidx + -1]->minor . '\')';
|
||||
}
|
||||
// line 636 "src/Parser/TemplateParser.y"
|
||||
// line 634 "src/Parser/TemplateParser.y"
|
||||
public function yy_r68(){
|
||||
$this->_retvalue = '$_smarty_tpl->getVariable(\''. substr($this->yystack[$this->yyidx + -1]->minor,1) .'\')->postIncDec(\'' . $this->yystack[$this->yyidx + 0]->minor . '\')';
|
||||
}
|
||||
// line 641 "src/Parser/TemplateParser.y"
|
||||
// line 639 "src/Parser/TemplateParser.y"
|
||||
public function yy_r69(){
|
||||
$this->_retvalue = '$_smarty_tpl->getStreamVariable(\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'://' . $this->yystack[$this->yyidx + 0]->minor . '\')';
|
||||
}
|
||||
// line 646 "src/Parser/TemplateParser.y"
|
||||
// line 644 "src/Parser/TemplateParser.y"
|
||||
public function yy_r70(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor . trim($this->yystack[$this->yyidx + -1]->minor) . $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 656 "src/Parser/TemplateParser.y"
|
||||
// line 654 "src/Parser/TemplateParser.y"
|
||||
public function yy_r72(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor['pre']. $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor['op'].$this->yystack[$this->yyidx + 0]->minor .')';
|
||||
}
|
||||
// line 660 "src/Parser/TemplateParser.y"
|
||||
// line 658 "src/Parser/TemplateParser.y"
|
||||
public function yy_r73(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 664 "src/Parser/TemplateParser.y"
|
||||
// line 662 "src/Parser/TemplateParser.y"
|
||||
public function yy_r74(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor . $this->yystack[$this->yyidx + -1]->minor . ')';
|
||||
}
|
||||
// line 668 "src/Parser/TemplateParser.y"
|
||||
// line 666 "src/Parser/TemplateParser.y"
|
||||
public function yy_r75(){
|
||||
$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor.')';
|
||||
}
|
||||
// line 672 "src/Parser/TemplateParser.y"
|
||||
// line 670 "src/Parser/TemplateParser.y"
|
||||
public function yy_r76(){
|
||||
$this->_retvalue = 'in_array('.$this->yystack[$this->yyidx + -2]->minor.',(array)'.$this->yystack[$this->yyidx + 0]->minor.')';
|
||||
}
|
||||
// line 677 "src/Parser/TemplateParser.y"
|
||||
// line 675 "src/Parser/TemplateParser.y"
|
||||
public function yy_r77(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?? '.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 684 "src/Parser/TemplateParser.y"
|
||||
// line 682 "src/Parser/TemplateParser.y"
|
||||
public function yy_r78(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? '. $this->compiler->compileVariable('\''.substr($this->yystack[$this->yyidx + -2]->minor,1).'\'') . ' : '.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 688 "src/Parser/TemplateParser.y"
|
||||
// line 686 "src/Parser/TemplateParser.y"
|
||||
public function yy_r79(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -4]->minor.' ? '.$this->yystack[$this->yyidx + -2]->minor.' : '.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 697 "src/Parser/TemplateParser.y"
|
||||
// line 695 "src/Parser/TemplateParser.y"
|
||||
public function yy_r81(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -3]->minor.' ?: '.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 707 "src/Parser/TemplateParser.y"
|
||||
// line 705 "src/Parser/TemplateParser.y"
|
||||
public function yy_r83(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 712 "src/Parser/TemplateParser.y"
|
||||
// line 710 "src/Parser/TemplateParser.y"
|
||||
public function yy_r84(){
|
||||
$this->_retvalue = '!'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 733 "src/Parser/TemplateParser.y"
|
||||
// line 731 "src/Parser/TemplateParser.y"
|
||||
public function yy_r89(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 737 "src/Parser/TemplateParser.y"
|
||||
// line 735 "src/Parser/TemplateParser.y"
|
||||
public function yy_r90(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.';
|
||||
}
|
||||
// line 741 "src/Parser/TemplateParser.y"
|
||||
// line 739 "src/Parser/TemplateParser.y"
|
||||
public function yy_r91(){
|
||||
$this->_retvalue = '.'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 746 "src/Parser/TemplateParser.y"
|
||||
// line 744 "src/Parser/TemplateParser.y"
|
||||
public function yy_r92(){
|
||||
if (defined($this->yystack[$this->yyidx + 0]->minor)) {
|
||||
if ($this->security) {
|
||||
@@ -2464,15 +2462,15 @@ public static $yy_action = array(
|
||||
$this->_retvalue = '\''.$this->yystack[$this->yyidx + 0]->minor.'\'';
|
||||
}
|
||||
}
|
||||
// line 763 "src/Parser/TemplateParser.y"
|
||||
// line 761 "src/Parser/TemplateParser.y"
|
||||
public function yy_r94(){
|
||||
$this->_retvalue = '('. $this->yystack[$this->yyidx + -1]->minor .')';
|
||||
}
|
||||
// line 767 "src/Parser/TemplateParser.y"
|
||||
// line 765 "src/Parser/TemplateParser.y"
|
||||
public function yy_r95(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 785 "src/Parser/TemplateParser.y"
|
||||
// line 783 "src/Parser/TemplateParser.y"
|
||||
public function yy_r99(){
|
||||
if ($this->security && $this->security->static_classes !== array()) {
|
||||
$this->compiler->trigger_template_error('dynamic static class not allowed by security setting');
|
||||
@@ -2485,18 +2483,18 @@ public static $yy_action = array(
|
||||
}
|
||||
$this->_retvalue = $prefixVar .'::'.$this->yystack[$this->yyidx + 0]->minor[0].$this->yystack[$this->yyidx + 0]->minor[1];
|
||||
}
|
||||
// line 799 "src/Parser/TemplateParser.y"
|
||||
// line 797 "src/Parser/TemplateParser.y"
|
||||
public function yy_r100(){
|
||||
$prefixVar = $this->compiler->getNewPrefixVariable();
|
||||
$tmp = $this->compiler->appendCode('<?php ob_start();?>', $this->yystack[$this->yyidx + 0]->minor);
|
||||
$this->compiler->appendPrefixCode($this->compiler->appendCode($tmp, "<?php {$prefixVar} = ob_get_clean();?>"));
|
||||
$this->_retvalue = $prefixVar;
|
||||
}
|
||||
// line 806 "src/Parser/TemplateParser.y"
|
||||
// line 804 "src/Parser/TemplateParser.y"
|
||||
public function yy_r101(){
|
||||
$this->_retvalue = $this->compiler->compileModifier($this->yystack[$this->yyidx + 0]->minor, $this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
// line 819 "src/Parser/TemplateParser.y"
|
||||
// line 817 "src/Parser/TemplateParser.y"
|
||||
public function yy_r104(){
|
||||
if (!in_array(strtolower($this->yystack[$this->yyidx + -2]->minor), array('self', 'parent')) && (!$this->security || $this->security->isTrustedStaticClassAccess($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + 0]->minor, $this->compiler))) {
|
||||
if (isset($this->smarty->registered_classes[$this->yystack[$this->yyidx + -2]->minor])) {
|
||||
@@ -2508,15 +2506,15 @@ public static $yy_action = array(
|
||||
$this->compiler->trigger_template_error ('static class \''.$this->yystack[$this->yyidx + -2]->minor.'\' is undefined or not allowed by security setting');
|
||||
}
|
||||
}
|
||||
// line 838 "src/Parser/TemplateParser.y"
|
||||
// line 836 "src/Parser/TemplateParser.y"
|
||||
public function yy_r106(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 849 "src/Parser/TemplateParser.y"
|
||||
// line 847 "src/Parser/TemplateParser.y"
|
||||
public function yy_r107(){
|
||||
$this->_retvalue = $this->compiler->compileVariable('\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\'');
|
||||
}
|
||||
// line 852 "src/Parser/TemplateParser.y"
|
||||
// line 850 "src/Parser/TemplateParser.y"
|
||||
public function yy_r108(){
|
||||
if ($this->yystack[$this->yyidx + 0]->minor['var'] === '\'smarty\'') {
|
||||
$smarty_var = (new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index']);
|
||||
@@ -2528,104 +2526,104 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileVariable($this->yystack[$this->yyidx + 0]->minor['var']).$this->yystack[$this->yyidx + 0]->minor['smarty_internal_index'];
|
||||
}
|
||||
}
|
||||
// line 865 "src/Parser/TemplateParser.y"
|
||||
// line 863 "src/Parser/TemplateParser.y"
|
||||
public function yy_r109(){
|
||||
$this->_retvalue = '$_smarty_tpl->getVariable('. $this->yystack[$this->yyidx + -2]->minor .')->'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 875 "src/Parser/TemplateParser.y"
|
||||
// line 873 "src/Parser/TemplateParser.y"
|
||||
public function yy_r111(){
|
||||
$this->_retvalue = $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -1]->minor . '\'');
|
||||
}
|
||||
// line 879 "src/Parser/TemplateParser.y"
|
||||
// line 877 "src/Parser/TemplateParser.y"
|
||||
public function yy_r112(){
|
||||
$this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable('\'' . $this->yystack[$this->yyidx + -2]->minor . '\'') . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' :null)';
|
||||
}
|
||||
// line 883 "src/Parser/TemplateParser.y"
|
||||
// line 881 "src/Parser/TemplateParser.y"
|
||||
public function yy_r113(){
|
||||
$this->_retvalue = $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
// line 887 "src/Parser/TemplateParser.y"
|
||||
// line 885 "src/Parser/TemplateParser.y"
|
||||
public function yy_r114(){
|
||||
$this->_retvalue = '(is_array($tmp = ' . $this->compiler->compileConfigVariable($this->yystack[$this->yyidx + -2]->minor) . ') ? $tmp'.$this->yystack[$this->yyidx + 0]->minor.' : null)';
|
||||
}
|
||||
// line 891 "src/Parser/TemplateParser.y"
|
||||
// line 889 "src/Parser/TemplateParser.y"
|
||||
public function yy_r115(){
|
||||
$this->_retvalue = array('var'=>'\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\'', 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 894 "src/Parser/TemplateParser.y"
|
||||
// line 892 "src/Parser/TemplateParser.y"
|
||||
public function yy_r116(){
|
||||
$this->_retvalue = array('var'=>$this->yystack[$this->yyidx + -1]->minor, 'smarty_internal_index'=>$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 907 "src/Parser/TemplateParser.y"
|
||||
// line 905 "src/Parser/TemplateParser.y"
|
||||
public function yy_r118(){
|
||||
return;
|
||||
}
|
||||
// line 913 "src/Parser/TemplateParser.y"
|
||||
// line 911 "src/Parser/TemplateParser.y"
|
||||
public function yy_r119(){
|
||||
$this->_retvalue = '['.$this->compiler->compileVariable('\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\'').']';
|
||||
}
|
||||
// line 916 "src/Parser/TemplateParser.y"
|
||||
// line 914 "src/Parser/TemplateParser.y"
|
||||
public function yy_r120(){
|
||||
$this->_retvalue = '['.$this->compiler->compileVariable($this->yystack[$this->yyidx + 0]->minor).']';
|
||||
}
|
||||
// line 920 "src/Parser/TemplateParser.y"
|
||||
// line 918 "src/Parser/TemplateParser.y"
|
||||
public function yy_r121(){
|
||||
$this->_retvalue = '['.$this->compiler->compileVariable($this->yystack[$this->yyidx + -2]->minor).'->'.$this->yystack[$this->yyidx + 0]->minor.']';
|
||||
}
|
||||
// line 924 "src/Parser/TemplateParser.y"
|
||||
// line 922 "src/Parser/TemplateParser.y"
|
||||
public function yy_r122(){
|
||||
$this->_retvalue = '[\''. $this->yystack[$this->yyidx + 0]->minor .'\']';
|
||||
}
|
||||
// line 928 "src/Parser/TemplateParser.y"
|
||||
// line 926 "src/Parser/TemplateParser.y"
|
||||
public function yy_r123(){
|
||||
$this->_retvalue = '['. $this->yystack[$this->yyidx + 0]->minor .']';
|
||||
}
|
||||
// line 933 "src/Parser/TemplateParser.y"
|
||||
// line 931 "src/Parser/TemplateParser.y"
|
||||
public function yy_r124(){
|
||||
$this->_retvalue = '['. $this->yystack[$this->yyidx + -1]->minor .']';
|
||||
}
|
||||
// line 938 "src/Parser/TemplateParser.y"
|
||||
// line 936 "src/Parser/TemplateParser.y"
|
||||
public function yy_r125(){
|
||||
$this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\'][\'index\']').']';
|
||||
}
|
||||
// line 942 "src/Parser/TemplateParser.y"
|
||||
// line 940 "src/Parser/TemplateParser.y"
|
||||
public function yy_r126(){
|
||||
$this->_retvalue = '['.(new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,'[\'section\'][\''.$this->yystack[$this->yyidx + -3]->minor.'\'][\''.$this->yystack[$this->yyidx + -1]->minor.'\']').']';
|
||||
}
|
||||
// line 945 "src/Parser/TemplateParser.y"
|
||||
// line 943 "src/Parser/TemplateParser.y"
|
||||
public function yy_r127(){
|
||||
$this->_retvalue = '['.$this->yystack[$this->yyidx + -1]->minor.']';
|
||||
}
|
||||
// line 951 "src/Parser/TemplateParser.y"
|
||||
// line 949 "src/Parser/TemplateParser.y"
|
||||
public function yy_r129(){
|
||||
$this->_retvalue = '['.$this->compiler->compileVariable('\''.substr($this->yystack[$this->yyidx + -1]->minor,1).'\'').']';
|
||||
}
|
||||
// line 967 "src/Parser/TemplateParser.y"
|
||||
// line 965 "src/Parser/TemplateParser.y"
|
||||
public function yy_r133(){
|
||||
$this->_retvalue = '[]';
|
||||
}
|
||||
// line 977 "src/Parser/TemplateParser.y"
|
||||
// line 975 "src/Parser/TemplateParser.y"
|
||||
public function yy_r134(){
|
||||
$this->_retvalue = '\''.substr($this->yystack[$this->yyidx + 0]->minor,1).'\'';
|
||||
}
|
||||
// line 981 "src/Parser/TemplateParser.y"
|
||||
// line 979 "src/Parser/TemplateParser.y"
|
||||
public function yy_r135(){
|
||||
$this->_retvalue = '\'\'';
|
||||
}
|
||||
// line 986 "src/Parser/TemplateParser.y"
|
||||
// line 984 "src/Parser/TemplateParser.y"
|
||||
public function yy_r136(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.'.'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 994 "src/Parser/TemplateParser.y"
|
||||
// line 992 "src/Parser/TemplateParser.y"
|
||||
public function yy_r138(){
|
||||
$var = trim(substr($this->yystack[$this->yyidx + 0]->minor, $this->compiler->getLdelLength(), -$this->compiler->getRdelLength()), ' $');
|
||||
$this->_retvalue = $this->compiler->compileVariable('\''.$var.'\'');
|
||||
}
|
||||
// line 1000 "src/Parser/TemplateParser.y"
|
||||
// line 998 "src/Parser/TemplateParser.y"
|
||||
public function yy_r139(){
|
||||
$this->_retvalue = '('.$this->yystack[$this->yyidx + -1]->minor.')';
|
||||
}
|
||||
// line 1007 "src/Parser/TemplateParser.y"
|
||||
// line 1005 "src/Parser/TemplateParser.y"
|
||||
public function yy_r140(){
|
||||
if ($this->yystack[$this->yyidx + -1]->minor['var'] === '\'smarty\'') {
|
||||
$this->_retvalue = (new \Smarty\Compile\SpecialVariableCompiler())->compile(array(),$this->compiler,$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index']).$this->yystack[$this->yyidx + 0]->minor;
|
||||
@@ -2633,58 +2631,58 @@ public static $yy_action = array(
|
||||
$this->_retvalue = $this->compiler->compileVariable($this->yystack[$this->yyidx + -1]->minor['var']).$this->yystack[$this->yyidx + -1]->minor['smarty_internal_index'].$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
}
|
||||
// line 1016 "src/Parser/TemplateParser.y"
|
||||
// line 1014 "src/Parser/TemplateParser.y"
|
||||
public function yy_r141(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1021 "src/Parser/TemplateParser.y"
|
||||
// line 1019 "src/Parser/TemplateParser.y"
|
||||
public function yy_r142(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1026 "src/Parser/TemplateParser.y"
|
||||
// line 1024 "src/Parser/TemplateParser.y"
|
||||
public function yy_r143(){
|
||||
if ($this->security && substr($this->yystack[$this->yyidx + -1]->minor,0,1) === '_') {
|
||||
$this->compiler->trigger_template_error (self::ERR1);
|
||||
}
|
||||
$this->_retvalue = '->'.$this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1033 "src/Parser/TemplateParser.y"
|
||||
// line 1031 "src/Parser/TemplateParser.y"
|
||||
public function yy_r144(){
|
||||
if ($this->security) {
|
||||
$this->compiler->trigger_template_error (self::ERR2);
|
||||
}
|
||||
$this->_retvalue = '->{'.$this->compiler->compileVariable($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor.'}';
|
||||
}
|
||||
// line 1040 "src/Parser/TemplateParser.y"
|
||||
// line 1038 "src/Parser/TemplateParser.y"
|
||||
public function yy_r145(){
|
||||
if ($this->security) {
|
||||
$this->compiler->trigger_template_error (self::ERR2);
|
||||
}
|
||||
$this->_retvalue = '->{'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
|
||||
}
|
||||
// line 1047 "src/Parser/TemplateParser.y"
|
||||
// line 1045 "src/Parser/TemplateParser.y"
|
||||
public function yy_r146(){
|
||||
if ($this->security) {
|
||||
$this->compiler->trigger_template_error (self::ERR2);
|
||||
}
|
||||
$this->_retvalue = '->{\''.$this->yystack[$this->yyidx + -4]->minor.'\'.'.$this->yystack[$this->yyidx + -2]->minor.$this->yystack[$this->yyidx + 0]->minor.'}';
|
||||
}
|
||||
// line 1055 "src/Parser/TemplateParser.y"
|
||||
// line 1053 "src/Parser/TemplateParser.y"
|
||||
public function yy_r147(){
|
||||
$this->_retvalue = '->'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1063 "src/Parser/TemplateParser.y"
|
||||
// line 1061 "src/Parser/TemplateParser.y"
|
||||
public function yy_r148(){
|
||||
$this->_retvalue = $this->compiler->compileFunctionCall($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor);
|
||||
$this->_retvalue = $this->compiler->compileModifierInExpression($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
// line 1071 "src/Parser/TemplateParser.y"
|
||||
// line 1069 "src/Parser/TemplateParser.y"
|
||||
public function yy_r149(){
|
||||
if ($this->security && substr($this->yystack[$this->yyidx + -3]->minor,0,1) === '_') {
|
||||
$this->compiler->trigger_template_error (self::ERR1);
|
||||
}
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -3]->minor . '('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')';
|
||||
}
|
||||
// line 1078 "src/Parser/TemplateParser.y"
|
||||
// line 1076 "src/Parser/TemplateParser.y"
|
||||
public function yy_r150(){
|
||||
if ($this->security) {
|
||||
$this->compiler->trigger_template_error (self::ERR2);
|
||||
@@ -2693,55 +2691,55 @@ public static $yy_action = array(
|
||||
$this->compiler->appendPrefixCode("<?php {$prefixVar} = ".$this->compiler->compileVariable('\''.substr($this->yystack[$this->yyidx + -3]->minor,1).'\'').';?>');
|
||||
$this->_retvalue = $prefixVar .'('. implode(',',$this->yystack[$this->yyidx + -1]->minor) .')';
|
||||
}
|
||||
// line 1089 "src/Parser/TemplateParser.y"
|
||||
// line 1087 "src/Parser/TemplateParser.y"
|
||||
public function yy_r151(){
|
||||
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array($this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 1106 "src/Parser/TemplateParser.y"
|
||||
// line 1104 "src/Parser/TemplateParser.y"
|
||||
public function yy_r154(){
|
||||
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -2]->minor,array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor)));
|
||||
}
|
||||
// line 1110 "src/Parser/TemplateParser.y"
|
||||
// line 1108 "src/Parser/TemplateParser.y"
|
||||
public function yy_r155(){
|
||||
$this->_retvalue = array(array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor));
|
||||
}
|
||||
// line 1118 "src/Parser/TemplateParser.y"
|
||||
// line 1116 "src/Parser/TemplateParser.y"
|
||||
public function yy_r157(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 1126 "src/Parser/TemplateParser.y"
|
||||
// line 1124 "src/Parser/TemplateParser.y"
|
||||
public function yy_r158(){
|
||||
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor,$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 1139 "src/Parser/TemplateParser.y"
|
||||
// line 1137 "src/Parser/TemplateParser.y"
|
||||
public function yy_r161(){
|
||||
$this->_retvalue = array(trim($this->yystack[$this->yyidx + -1]->minor).$this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 1148 "src/Parser/TemplateParser.y"
|
||||
// line 1146 "src/Parser/TemplateParser.y"
|
||||
public function yy_r163(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '', 'method');
|
||||
}
|
||||
// line 1153 "src/Parser/TemplateParser.y"
|
||||
// line 1151 "src/Parser/TemplateParser.y"
|
||||
public function yy_r164(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'method');
|
||||
}
|
||||
// line 1158 "src/Parser/TemplateParser.y"
|
||||
// line 1156 "src/Parser/TemplateParser.y"
|
||||
public function yy_r165(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + 0]->minor, '');
|
||||
}
|
||||
// line 1163 "src/Parser/TemplateParser.y"
|
||||
// line 1161 "src/Parser/TemplateParser.y"
|
||||
public function yy_r166(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + -1]->minor, $this->yystack[$this->yyidx + 0]->minor, 'property');
|
||||
}
|
||||
// line 1168 "src/Parser/TemplateParser.y"
|
||||
// line 1166 "src/Parser/TemplateParser.y"
|
||||
public function yy_r167(){
|
||||
$this->_retvalue = array($this->yystack[$this->yyidx + -2]->minor, $this->yystack[$this->yyidx + -1]->minor.$this->yystack[$this->yyidx + 0]->minor, 'property');
|
||||
}
|
||||
// line 1174 "src/Parser/TemplateParser.y"
|
||||
// line 1172 "src/Parser/TemplateParser.y"
|
||||
public function yy_r168(){
|
||||
$this->_retvalue = ' '. trim($this->yystack[$this->yyidx + 0]->minor) . ' ';
|
||||
}
|
||||
// line 1178 "src/Parser/TemplateParser.y"
|
||||
// line 1176 "src/Parser/TemplateParser.y"
|
||||
public function yy_r169(){
|
||||
static $lops = array(
|
||||
'eq' => ' == ',
|
||||
@@ -2761,7 +2759,7 @@ public static $yy_action = array(
|
||||
$op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor));
|
||||
$this->_retvalue = $lops[$op];
|
||||
}
|
||||
// line 1197 "src/Parser/TemplateParser.y"
|
||||
// line 1195 "src/Parser/TemplateParser.y"
|
||||
public function yy_r170(){
|
||||
static $tlops = array(
|
||||
'isdivby' => array('op' => ' % ', 'pre' => '!('),
|
||||
@@ -2774,7 +2772,7 @@ public static $yy_action = array(
|
||||
$op = strtolower(preg_replace('/\s*/', '', $this->yystack[$this->yyidx + 0]->minor));
|
||||
$this->_retvalue = $tlops[$op];
|
||||
}
|
||||
// line 1210 "src/Parser/TemplateParser.y"
|
||||
// line 1208 "src/Parser/TemplateParser.y"
|
||||
public function yy_r171(){
|
||||
static $scond = array (
|
||||
'iseven' => '!(1 & ',
|
||||
@@ -2785,53 +2783,53 @@ public static $yy_action = array(
|
||||
$op = strtolower(str_replace(' ', '', $this->yystack[$this->yyidx + 0]->minor));
|
||||
$this->_retvalue = $scond[$op];
|
||||
}
|
||||
// line 1224 "src/Parser/TemplateParser.y"
|
||||
// line 1222 "src/Parser/TemplateParser.y"
|
||||
public function yy_r172(){
|
||||
$this->_retvalue = 'array('.$this->yystack[$this->yyidx + -1]->minor.')';
|
||||
}
|
||||
// line 1235 "src/Parser/TemplateParser.y"
|
||||
// line 1233 "src/Parser/TemplateParser.y"
|
||||
public function yy_r175(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.','.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1243 "src/Parser/TemplateParser.y"
|
||||
// line 1241 "src/Parser/TemplateParser.y"
|
||||
public function yy_r177(){
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -2]->minor.'=>'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1247 "src/Parser/TemplateParser.y"
|
||||
// line 1245 "src/Parser/TemplateParser.y"
|
||||
public function yy_r178(){
|
||||
$this->_retvalue = '\''.$this->yystack[$this->yyidx + -2]->minor.'\'=>'.$this->yystack[$this->yyidx + 0]->minor;
|
||||
}
|
||||
// line 1263 "src/Parser/TemplateParser.y"
|
||||
// line 1261 "src/Parser/TemplateParser.y"
|
||||
public function yy_r181(){
|
||||
$this->compiler->leaveDoubleQuote();
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor->to_smarty_php($this);
|
||||
}
|
||||
// line 1269 "src/Parser/TemplateParser.y"
|
||||
// line 1267 "src/Parser/TemplateParser.y"
|
||||
public function yy_r182(){
|
||||
$this->yystack[$this->yyidx + -1]->minor->append_subtree($this, $this->yystack[$this->yyidx + 0]->minor);
|
||||
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
|
||||
}
|
||||
// line 1274 "src/Parser/TemplateParser.y"
|
||||
// line 1272 "src/Parser/TemplateParser.y"
|
||||
public function yy_r183(){
|
||||
$this->_retvalue = new Dq($this, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 1278 "src/Parser/TemplateParser.y"
|
||||
// line 1276 "src/Parser/TemplateParser.y"
|
||||
public function yy_r184(){
|
||||
$this->_retvalue = new Code('(string)'.$this->yystack[$this->yyidx + -1]->minor);
|
||||
}
|
||||
// line 1282 "src/Parser/TemplateParser.y"
|
||||
// line 1280 "src/Parser/TemplateParser.y"
|
||||
public function yy_r185(){
|
||||
$this->_retvalue = new Code('(string)('.$this->yystack[$this->yyidx + -1]->minor.')');
|
||||
}
|
||||
// line 1286 "src/Parser/TemplateParser.y"
|
||||
// line 1284 "src/Parser/TemplateParser.y"
|
||||
public function yy_r186(){
|
||||
$this->_retvalue = new Code('(string)$_smarty_tpl->getValue(\''. substr($this->yystack[$this->yyidx + 0]->minor,1) .'\')');
|
||||
}
|
||||
// line 1298 "src/Parser/TemplateParser.y"
|
||||
// line 1296 "src/Parser/TemplateParser.y"
|
||||
public function yy_r189(){
|
||||
$this->_retvalue = new Tag($this, $this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
// line 1302 "src/Parser/TemplateParser.y"
|
||||
// line 1300 "src/Parser/TemplateParser.y"
|
||||
public function yy_r190(){
|
||||
$this->_retvalue = new DqContent($this->yystack[$this->yyidx + 0]->minor);
|
||||
}
|
||||
|
||||
@@ -290,9 +290,7 @@ literal_e1(A) ::= . {
|
||||
}
|
||||
// Smarty tag
|
||||
template ::= template smartytag(B). {
|
||||
if ($this->compiler->has_code) {
|
||||
$this->current_buffer->append_subtree($this, $this->mergePrefixCode(B));
|
||||
}
|
||||
$this->current_buffer->append_subtree($this, $this->mergePrefixCode(B));
|
||||
$this->compiler->has_variable_string = false;
|
||||
$this->block_nesting_level = $this->compiler->getTagStackCount();
|
||||
}
|
||||
@@ -1061,7 +1059,7 @@ objectelement(res)::= PTR method(f). {
|
||||
// function
|
||||
//
|
||||
function(res) ::= ns1(f) OPENP params(p) CLOSEP. {
|
||||
res = $this->compiler->compileFunctionCall(f, p);
|
||||
res = $this->compiler->compileModifierInExpression(f, p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -26,31 +26,26 @@ class TplFunctionRuntime {
|
||||
*/
|
||||
public function callTemplateFunction(Template $tpl, $name, $params, $nocache) {
|
||||
$funcParam = $tpl->tplFunctions[$name] ?? ($tpl->getSmarty()->tplFunctions[$name] ?? null);
|
||||
if (isset($funcParam)) {
|
||||
if (!$tpl->caching || ($tpl->caching && $nocache)) {
|
||||
$function = $funcParam['call_name'];
|
||||
if (!isset($funcParam)) {
|
||||
throw new \Smarty\Exception("Unable to find template function '{$name}'");
|
||||
}
|
||||
|
||||
if (!$tpl->caching || ($tpl->caching && $nocache)) {
|
||||
$function = $funcParam['call_name'];
|
||||
} else {
|
||||
if (isset($funcParam['call_name_caching'])) {
|
||||
$function = $funcParam['call_name_caching'];
|
||||
} else {
|
||||
if (isset($funcParam['call_name_caching'])) {
|
||||
$function = $funcParam['call_name_caching'];
|
||||
} else {
|
||||
$function = $funcParam['call_name'];
|
||||
}
|
||||
}
|
||||
if (function_exists($function)) {
|
||||
$this->saveTemplateVariables($tpl, $name);
|
||||
$function($tpl, $params);
|
||||
$this->restoreTemplateVariables($tpl, $name);
|
||||
return;
|
||||
}
|
||||
// try to load template function dynamically
|
||||
if ($this->addTplFuncToCache($tpl, $name, $function)) {
|
||||
$this->saveTemplateVariables($tpl, $name);
|
||||
$function($tpl, $params);
|
||||
$this->restoreTemplateVariables($tpl, $name);
|
||||
return;
|
||||
$function = $funcParam['call_name'];
|
||||
}
|
||||
}
|
||||
throw new \Smarty\Exception("Unable to find template function '{$name}'");
|
||||
if (!function_exists($function) && !$this->addTplFuncToCache($tpl, $name, $function)) {
|
||||
throw new \Smarty\Exception("Unable to find template function '{$name}'");
|
||||
}
|
||||
|
||||
$tpl->pushStack();
|
||||
$function($tpl, $params);
|
||||
$tpl->popStack();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -146,28 +141,4 @@ class TplFunctionRuntime {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Save current template variables on stack
|
||||
*
|
||||
* @param \Smarty\Template $tpl
|
||||
* @param string $name stack name
|
||||
*/
|
||||
public function saveTemplateVariables(Template $tpl, $name) {
|
||||
$tpl->_var_stack[] =
|
||||
['tpl' => $tpl->tpl_vars, 'config' => $tpl->config_vars, 'name' => "_tplFunction_{$name}"];
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore saved variables into template objects
|
||||
*
|
||||
* @param \Smarty\Template $tpl
|
||||
* @param string $name stack name
|
||||
*/
|
||||
public function restoreTemplateVariables(Template $tpl, $name) {
|
||||
if (isset($tpl->_var_stack)) {
|
||||
$vars = array_pop($tpl->_var_stack);
|
||||
$tpl->tpl_vars = $vars['tpl'];
|
||||
$tpl->config_vars = $vars['config'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -53,7 +53,7 @@ class Smarty extends \Smarty\TemplateBase {
|
||||
/**
|
||||
* smarty version
|
||||
*/
|
||||
const SMARTY_VERSION = '5.0.0-rc1';
|
||||
const SMARTY_VERSION = '5.0.0';
|
||||
|
||||
/**
|
||||
* define caching modes
|
||||
@@ -251,9 +251,10 @@ class Smarty extends \Smarty\TemplateBase {
|
||||
|
||||
/**
|
||||
* debug mode
|
||||
* Setting this to true enables the debug-console.
|
||||
* Setting this to true enables the debug-console. Setting it to 2 enables individual Debug Console window by
|
||||
* template name.
|
||||
*
|
||||
* @var boolean
|
||||
* @var boolean|int
|
||||
*/
|
||||
public $debugging = false;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user