mirror of
https://github.com/smarty-php/smarty.git
synced 2025-07-30 16:07:13 +02:00
Improved another chunk of the designers docs
This commit is contained in:
@ -4,7 +4,7 @@ It is sometimes desirable or even necessary to have Smarty ignore
|
|||||||
sections it would otherwise parse. A classic example is embedding
|
sections it would otherwise parse. A classic example is embedding
|
||||||
Javascript or CSS code in a template. The problem arises as those
|
Javascript or CSS code in a template. The problem arises as those
|
||||||
languages use the { and } characters which are also the default
|
languages use the { and } characters which are also the default
|
||||||
[delimiters](#language.function.ldelim) for Smarty.
|
[delimiters](../language-builtin-functions/language-function-ldelim.md) for Smarty.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
@ -16,37 +16,37 @@ languages use the { and } characters which are also the default
|
|||||||
|
|
||||||
In Smarty templates, the { and } braces will be ignored so long as they
|
In Smarty templates, the { and } braces will be ignored so long as they
|
||||||
are surrounded by white space. This behavior can be disabled by setting
|
are surrounded by white space. This behavior can be disabled by setting
|
||||||
the Smarty class variable [`$auto_literal`](#variable.auto.literal) to
|
the Smarty class variable [`$auto_literal`](../../programmers/api-variables/variable-auto-literal.md) to
|
||||||
false.
|
false.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
<script>
|
```smarty
|
||||||
// the following braces are ignored by Smarty
|
<script>
|
||||||
// since they are surrounded by whitespace
|
// the following braces are ignored by Smarty
|
||||||
function foobar {
|
// since they are surrounded by whitespace
|
||||||
alert('foobar!');
|
function foobar {
|
||||||
}
|
alert('foobar!');
|
||||||
// this one will need literal escapement
|
}
|
||||||
{literal}
|
// this one will need literal escapement
|
||||||
function bazzy {alert('foobar!');}
|
{literal}
|
||||||
{/literal}
|
function bazzy {alert('foobar!');}
|
||||||
</script>
|
{/literal}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
[`{literal}..{/literal}`](../language-builtin-functions/language-function-literal.md) blocks are used
|
||||||
|
|
||||||
[`{literal}..{/literal}`](#language.function.literal) blocks are used
|
|
||||||
for escaping blocks of template logic. You can also escape the braces
|
for escaping blocks of template logic. You can also escape the braces
|
||||||
individually with
|
individually with
|
||||||
[`{ldelim}`](#language.function.ldelim),[`{rdelim}`](#language.function.ldelim)
|
[`{ldelim}`, `{rdelim}`](../language-builtin-functions/language-function-ldelim.md) tags or
|
||||||
tags or
|
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](../language-variables/language-variables-smarty.md#smartyldelim-smartyrdelim-languagevariablessmartyldelim)
|
||||||
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](#language.variables.smarty.ldelim)
|
|
||||||
variables.
|
variables.
|
||||||
|
|
||||||
Smarty\'s default delimiters { and } cleanly represent presentational
|
Smarty's default delimiters { and } cleanly represent presentational
|
||||||
content. However if another set of delimiters suit your needs better,
|
content. However, if another set of delimiters suit your needs better,
|
||||||
you can change them with Smarty\'s
|
you can change them with Smarty's
|
||||||
[`$left_delimiter`](#variable.left.delimiter) and
|
[`$left_delimiter`](../../programmers/api-variables/variable-left-delimiter.md) and
|
||||||
[`$right_delimiter`](#variable.right.delimiter) values.
|
[`$right_delimiter`](../../programmers/api-variables/variable-right-delimiter.md) values.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
@ -54,30 +54,26 @@ you can change them with Smarty\'s
|
|||||||
> sure to clear out cache and compiled files if you decide to change
|
> sure to clear out cache and compiled files if you decide to change
|
||||||
> them.
|
> them.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
<?php
|
$smarty->left_delimiter = '<!--{';
|
||||||
|
$smarty->right_delimiter = '}-->';
|
||||||
$smarty->left_delimiter = '<!--{';
|
|
||||||
$smarty->right_delimiter = '}-->';
|
|
||||||
|
|
||||||
$smarty->assign('foo', 'bar');
|
|
||||||
$smarty->assign('name', 'Albert');
|
|
||||||
$smarty->display('example.tpl');
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
$smarty->assign('foo', 'bar');
|
||||||
|
$smarty->assign('name', 'Albert');
|
||||||
|
$smarty->display('example.tpl');
|
||||||
|
```
|
||||||
|
|
||||||
Where the template is:
|
Where the template is:
|
||||||
|
|
||||||
|
```smarty
|
||||||
Welcome <!--{$name}--> to Smarty
|
Welcome <!--{$name}--> to Smarty
|
||||||
<script language="javascript">
|
<script language="javascript">
|
||||||
var foo = <!--{$foo}-->;
|
var foo = <!--{$foo}-->;
|
||||||
function dosomething() {
|
function dosomething() {
|
||||||
alert("foo is " + foo);
|
alert("foo is " + foo);
|
||||||
}
|
}
|
||||||
dosomething();
|
dosomething();
|
||||||
</script>
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -1,24 +1,23 @@
|
|||||||
Math {#language.math}
|
# Math
|
||||||
====
|
|
||||||
|
|
||||||
Math can be applied directly to variable values.
|
Math can be applied directly to variable values.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{$foo+1}
|
||||||
|
|
||||||
{$foo+1}
|
{$foo*$bar}
|
||||||
|
|
||||||
{$foo*$bar}
|
{* some more complicated examples *}
|
||||||
|
|
||||||
{* some more complicated examples *}
|
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
|
||||||
|
|
||||||
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
|
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
|
||||||
|
|
||||||
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
|
|
||||||
|
|
||||||
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
|
|
||||||
|
|
||||||
{assign var="foo" value="`$foo+$bar`"}
|
|
||||||
|
|
||||||
|
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
|
||||||
|
|
||||||
|
{assign var="foo" value="`$foo+$bar`"}
|
||||||
|
```
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
Attributes {#language.syntax.attributes}
|
# Attributes
|
||||||
==========
|
|
||||||
|
|
||||||
Most of the [functions](#language.syntax.functions) take attributes that
|
Most of the [functions](./language-syntax-functions.md) take attributes that
|
||||||
specify or modify their behavior. Attributes to Smarty functions are
|
specify or modify their behavior. Attributes to Smarty functions are
|
||||||
much like HTML attributes. Static values don't have to be enclosed in
|
much like HTML attributes. Static values don't have to be enclosed in
|
||||||
quotes, but it is required for literal strings. Variables with or
|
quotes, but it is required for literal strings. Variables with or
|
||||||
@ -12,34 +11,34 @@ Some attributes require boolean values (TRUE or FALSE). These can be
|
|||||||
specified as `true` and `false`. If an attribute has no value assigned
|
specified as `true` and `false`. If an attribute has no value assigned
|
||||||
it gets the default boolean value of true.
|
it gets the default boolean value of true.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{include file="header.tpl"}
|
||||||
|
|
||||||
{include file="header.tpl"}
|
{include file="header.tpl" nocache} // is equivalent to nocache=true
|
||||||
|
|
||||||
{include file="header.tpl" nocache} // is equivalent to nocache=true
|
{include file="header.tpl" attrib_name="attrib value"}
|
||||||
|
|
||||||
{include file="header.tpl" attrib_name="attrib value"}
|
{include file=$includeFile}
|
||||||
|
|
||||||
{include file=$includeFile}
|
{include file=#includeFile# title="My Title"}
|
||||||
|
|
||||||
{include file=#includeFile# title="My Title"}
|
{assign var=foo value={counter}} // plugin result
|
||||||
|
|
||||||
{assign var=foo value={counter}} // plugin result
|
{assign var=foo value=substr($bar,2,5)} // PHP function result
|
||||||
|
|
||||||
{assign var=foo value=substr($bar,2,5)} // PHP function result
|
{assign var=foo value=$bar|strlen} // using modifier
|
||||||
|
|
||||||
{assign var=foo value=$bar|strlen} // using modifier
|
{assign var=foo value=$buh+$bar|strlen} // more complex expression
|
||||||
|
|
||||||
{assign var=foo value=$buh+$bar|strlen} // more complex expression
|
{html_select_date display_days=true}
|
||||||
|
|
||||||
{html_select_date display_days=true}
|
|
||||||
|
|
||||||
{mailto address="smarty@example.com"}
|
|
||||||
|
|
||||||
<select name="company_id">
|
|
||||||
{html_options options=$companies selected=$company_id}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
|
{mailto address="smarty@example.com"}
|
||||||
|
|
||||||
|
<select name="company_id">
|
||||||
|
{html_options options=$companies selected=$company_id}
|
||||||
|
</select>
|
||||||
|
```
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
|
@ -1,27 +1,25 @@
|
|||||||
Comments {#language.syntax.comments}
|
# Comments
|
||||||
========
|
|
||||||
|
|
||||||
Template comments are surrounded by asterisks, and that is surrounded by
|
Template comments are surrounded by asterisks, and that is surrounded by
|
||||||
the [delimiter](#variable.left.delimiter) tags like so:
|
the [delimiter](../../programmers/api-variables/variable-left-delimiter.md) tags like so:
|
||||||
|
|
||||||
::: {.informalexample}
|
## Examples
|
||||||
|
|
||||||
{* this is a comment *}
|
```smarty
|
||||||
|
{* this is a comment *}
|
||||||
|
```
|
||||||
:::
|
|
||||||
|
|
||||||
Smarty comments are NOT displayed in the final output of the template,
|
Smarty comments are NOT displayed in the final output of the template,
|
||||||
unlike `<!-- HTML comments -->`. These are useful for making internal
|
unlike `<!-- HTML comments -->`. These are useful for making internal
|
||||||
notes in the templates which no one will see ;-)
|
notes in the templates which no one will see ;-)
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* I am a Smarty comment, I don't exist in the compiled output *}
|
{* I am a Smarty comment, I don't exist in the compiled output *}
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<title>{$title}</title>
|
<title>{$title}</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
{* another single line smarty comment *}
|
{* another single line smarty comment *}
|
||||||
<!-- HTML comment that is sent to the browser -->
|
<!-- HTML comment that is sent to the browser -->
|
||||||
@ -66,6 +64,6 @@ notes in the templates which no one will see ;-)
|
|||||||
*}
|
*}
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -1,40 +1,40 @@
|
|||||||
Functions {#language.syntax.functions}
|
# Functions
|
||||||
=========
|
|
||||||
|
|
||||||
Every Smarty tag either prints a [variable](#language.variables) or
|
Every Smarty tag either prints a [variable](./language-syntax-variables.md) or
|
||||||
invokes some sort of function. These are processed and displayed by
|
invokes some sort of function. These are processed and displayed by
|
||||||
enclosing the function and its [attributes](#language.syntax.attributes)
|
enclosing the function and its [attributes](./language-syntax-attributes.md)
|
||||||
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
|
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
{config_load file="colors.conf"}
|
```smarty
|
||||||
|
{config_load file="colors.conf"}
|
||||||
|
|
||||||
{include file="header.tpl"}
|
{include file="header.tpl"}
|
||||||
{insert file="banner_ads.tpl" title="My Site"}
|
{insert file="banner_ads.tpl" title="My Site"}
|
||||||
|
|
||||||
{if $logged_in}
|
{if $logged_in}
|
||||||
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
|
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
|
||||||
{else}
|
{else}
|
||||||
hi, {$name}
|
hi, {$name}
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
{include file="footer.tpl"}
|
{include file="footer.tpl"}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Both [built-in functions](../language-builtin-functions/index.md) and [custom
|
||||||
|
functions](../language-custom-functions.md) have the same syntax within
|
||||||
- Both [built-in functions](#language.builtin.functions) and [custom
|
|
||||||
functions](#language.custom.functions) have the same syntax within
|
|
||||||
templates.
|
templates.
|
||||||
|
|
||||||
- Built-in functions are the **inner** workings of Smarty, such as
|
- Built-in functions are the **inner** workings of Smarty, such as
|
||||||
[`{if}`](#language.function.if),
|
[`{if}`](../language-builtin-functions/language-function-if.md),
|
||||||
[`{section}`](#language.function.section) and
|
[`{section}`](../language-builtin-functions/language-function-section.md) and
|
||||||
[`{strip}`](#language.function.strip). There should be no need to
|
[`{strip}`](../language-builtin-functions/language-function-strip.md). There should be no need to
|
||||||
change or modify them.
|
change or modify them.
|
||||||
|
|
||||||
- Custom functions are **additional** functions implemented via
|
- Custom functions are **additional** functions implemented via
|
||||||
[plugins](#plugins). They can be modified to your liking, or you can
|
[plugins](../../programmers/plugins.md). They can be modified to your liking, or you can
|
||||||
create new ones. [`{html_options}`](#language.function.html.options)
|
create new ones. [`{html_options}`](../language-custom-functions/language-function-html-options.md)
|
||||||
is an example of a custom function.
|
is an example of a custom function.
|
||||||
|
|
||||||
See also [`registerPlugin()`](#api.register.plugin)
|
See also [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md)
|
||||||
|
@ -1,54 +1,47 @@
|
|||||||
Embedding Vars in Double Quotes {#language.syntax.quotes}
|
# Embedding Vars in Double Quotes
|
||||||
===============================
|
|
||||||
|
|
||||||
- Smarty will recognize [assigned](#api.assign)
|
- Smarty will recognize [assigned](../../programmers/api-functions/api-assign.md)
|
||||||
[variables](#language.syntax.variables) embedded in \"double
|
[variables](./language-syntax-variables.md) embedded in "double
|
||||||
quotes\" so long as the variable name contains only numbers, letters
|
quotes" so long as the variable name contains only numbers, letters
|
||||||
and under\_scores. See [naming](https://www.php.net/language.variables)
|
and under_scores. See [naming](https://www.php.net/language.variables)
|
||||||
for more detail.
|
for more detail.
|
||||||
|
|
||||||
- With any other characters, for example a period(.) or
|
- With any other characters, for example a period(.) or
|
||||||
`$object->reference`, then the variable must be surrounded by
|
`$object->reference`, then the variable must be surrounded by `` `backticks` ``.
|
||||||
`` `backticks` ``.
|
|
||||||
|
|
||||||
- In addition Smarty3 does allow embedded Smarty tags in double quoted
|
- In addition, Smarty does allow embedded Smarty tags in double-quoted
|
||||||
strings. This is useful if you want to include variables with
|
strings. This is useful if you want to include variables with
|
||||||
modifiers, plugin or PHP function results.
|
modifiers, plugin or PHP function results.
|
||||||
|
|
||||||
<!-- -->
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{func var="test $foo test"} // sees $foo
|
||||||
|
{func var="test $foo_bar test"} // sees $foo_bar
|
||||||
|
{func var="test `$foo[0]` test"} // sees $foo[0]
|
||||||
|
{func var="test `$foo[bar]` test"} // sees $foo[bar]
|
||||||
|
{func var="test $foo.bar test"} // sees $foo (not $foo.bar)
|
||||||
|
{func var="test `$foo.bar` test"} // sees $foo.bar
|
||||||
|
{func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
|
||||||
|
{func var="test {$foo|escape} test"} // modifiers inside quotes!
|
||||||
|
{func var="test {time()} test"} // PHP function result
|
||||||
|
{func var="test {counter} test"} // plugin result
|
||||||
|
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
|
||||||
|
|
||||||
|
{* will replace $tpl_name with value *}
|
||||||
|
{include file="subdir/$tpl_name.tpl"}
|
||||||
|
|
||||||
{func var="test $foo test"} // sees $foo
|
{* does NOT replace $tpl_name *}
|
||||||
{func var="test $foo_bar test"} // sees $foo_bar
|
{include file='subdir/$tpl_name.tpl'} // vars require double quotes!
|
||||||
{func var="test `$foo[0]` test"} // sees $foo[0]
|
|
||||||
{func var="test `$foo[bar]` test"} // sees $foo[bar]
|
|
||||||
{func var="test $foo.bar test"} // sees $foo (not $foo.bar)
|
|
||||||
{func var="test `$foo.bar` test"} // sees $foo.bar
|
|
||||||
{func var="test `$foo.bar` test"|escape} // modifiers outside quotes!
|
|
||||||
{func var="test {$foo|escape} test"} // modifiers inside quotes!
|
|
||||||
{func var="test {time()} test"} // PHP function result
|
|
||||||
{func var="test {counter} test"} // plugin result
|
|
||||||
{func var="variable foo is {if !$foo}not {/if} defined"} // Smarty block function
|
|
||||||
|
|
||||||
|
{* must have backticks as it contains a dot "." *}
|
||||||
|
{cycle values="one,two,`$smarty.config.myval`"}
|
||||||
|
|
||||||
|
{* must have backticks as it contains a dot "." *}
|
||||||
|
{include file="`$module.contact`.tpl"}
|
||||||
|
|
||||||
|
{* can use variable with dot syntax *}
|
||||||
{* will replace $tpl_name with value *}
|
{include file="`$module.$view`.tpl"}
|
||||||
{include file="subdir/$tpl_name.tpl"}
|
```
|
||||||
|
|
||||||
{* does NOT replace $tpl_name *}
|
|
||||||
{include file='subdir/$tpl_name.tpl'} // vars require double quotes!
|
|
||||||
|
|
||||||
{* must have backticks as it contains a dot "." *}
|
|
||||||
{cycle values="one,two,`$smarty.config.myval`"}
|
|
||||||
|
|
||||||
{* must have backticks as it contains a dot "." *}
|
|
||||||
{include file="`$module.contact`.tpl"}
|
|
||||||
|
|
||||||
{* can use variable with dot syntax *}
|
|
||||||
{include file="`$module.$view`.tpl"}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
@ -58,4 +51,4 @@ Embedding Vars in Double Quotes {#language.syntax.quotes}
|
|||||||
> complex, it may be a good idea to move the bits that do not deal
|
> complex, it may be a good idea to move the bits that do not deal
|
||||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||||
|
|
||||||
See also [`escape`](#language.modifier.escape).
|
See also [`escape`](../language-modifiers/language-modifier-escape.md).
|
||||||
|
@ -1,99 +1,97 @@
|
|||||||
Variables {#language.syntax.variables}
|
# Variables
|
||||||
=========
|
|
||||||
|
|
||||||
Template variables start with the \$dollar sign. They can contain
|
Template variables start with the $dollar sign. They can contain
|
||||||
numbers, letters and underscores, much like a [PHP
|
numbers, letters and underscores, much like a [PHP
|
||||||
variable](https://www.php.net/language.variables). You can reference arrays
|
variable](https://www.php.net/language.variables). You can reference arrays
|
||||||
by index numerically or non-numerically. Also reference object
|
by index numerically or non-numerically. Also reference object
|
||||||
properties and methods.
|
properties and methods.
|
||||||
|
|
||||||
[Config file variables](#language.config.variables) are an exception to
|
[Config file variables](../language-variables/language-config-variables.md) are an exception to
|
||||||
the \$dollar syntax and are instead referenced with surrounding
|
the \$dollar syntax and are instead referenced with surrounding
|
||||||
\#hashmarks\#, or via the
|
\#hashmarks\#, or via the [`$smarty.config`](../language-variables/language-variables-smarty.md#smartyconfig-languagevariablessmartyconfig) variable.
|
||||||
[`$smarty.config`](#language.variables.smarty.config) variable.
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
{$foo} <-- displaying a simple variable (non array/object)
|
```smarty
|
||||||
{$foo[4]} <-- display the 5th element of a zero-indexed array
|
{$foo} <-- displaying a simple variable (non array/object)
|
||||||
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
|
{$foo[4]} <-- display the 5th element of a zero-indexed array
|
||||||
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
|
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
|
||||||
{$foo->bar} <-- display the object property "bar"
|
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
|
||||||
{$foo->bar()} <-- display the return value of object method "bar"
|
{$foo->bar} <-- display the object property "bar"
|
||||||
{#foo#} <-- display the config file variable "foo"
|
{$foo->bar()} <-- display the return value of object method "bar"
|
||||||
{$smarty.config.foo} <-- synonym for {#foo#}
|
{#foo#} <-- display the config file variable "foo"
|
||||||
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
|
{$smarty.config.foo} <-- synonym for {#foo#}
|
||||||
{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
|
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
|
||||||
|
{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
|
||||||
|
|
||||||
Many other combinations are allowed
|
Many other combinations are allowed
|
||||||
|
|
||||||
{$foo.bar.baz}
|
{$foo.bar.baz}
|
||||||
{$foo.$bar.$baz}
|
{$foo.$bar.$baz}
|
||||||
{$foo[4].baz}
|
{$foo[4].baz}
|
||||||
{$foo[4].$baz}
|
{$foo[4].$baz}
|
||||||
{$foo.bar.baz[4]}
|
{$foo.bar.baz[4]}
|
||||||
{$foo->bar($baz,2,$bar)} <-- passing parameters
|
{$foo->bar($baz,2,$bar)} <-- passing parameters
|
||||||
{"foo"} <-- static values are allowed
|
{"foo"} <-- static values are allowed
|
||||||
|
|
||||||
{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
|
{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
|
||||||
{$smarty.server.SERVER_NAME}
|
{$smarty.server.SERVER_NAME}
|
||||||
|
|
||||||
Math and embedding tags:
|
Math and embedding tags:
|
||||||
|
|
||||||
{$x+$y} // will output the sum of x and y.
|
{$x+$y} // will output the sum of x and y.
|
||||||
{assign var=foo value=$x+$y} // in attributes
|
{assign var=foo value=$x+$y} // in attributes
|
||||||
{$foo[$x+3]} // as array index
|
{$foo[$x+3]} // as array index
|
||||||
{$foo={counter}+3} // tags within tags
|
{$foo={counter}+3} // tags within tags
|
||||||
{$foo="this is message {counter}"} // tags within double quoted strings
|
{$foo="this is message {counter}"} // tags within double quoted strings
|
||||||
|
|
||||||
Defining Arrays:
|
Defining Arrays:
|
||||||
|
|
||||||
{assign var=foo value=[1,2,3]}
|
{assign var=foo value=[1,2,3]}
|
||||||
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
|
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
|
||||||
{assign var=foo value=[1,[9,8],3]} // can be nested
|
{assign var=foo value=[1,[9,8],3]} // can be nested
|
||||||
|
|
||||||
Short variable assignment:
|
Short variable assignment:
|
||||||
|
|
||||||
{$foo=$bar+2}
|
{$foo=$bar+2}
|
||||||
{$foo = strlen($bar)} // function in assignment
|
{$foo = strlen($bar)} // function in assignment
|
||||||
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
|
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
|
||||||
{$foo.bar=1} // assign to specific array element
|
{$foo.bar=1} // assign to specific array element
|
||||||
{$foo.bar.baz=1}
|
{$foo.bar.baz=1}
|
||||||
{$foo[]=1} // appending to an array
|
{$foo[]=1} // appending to an array
|
||||||
|
|
||||||
Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
|
Smarty "dot" syntax (note: embedded {} are used to address ambiguities):
|
||||||
|
|
||||||
{$foo.a.b.c} => $foo['a']['b']['c']
|
{$foo.a.b.c} => $foo['a']['b']['c']
|
||||||
{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
|
{$foo.a.$b.c} => $foo['a'][$b]['c'] // with variable index
|
||||||
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
|
{$foo.a.{$b+4}.c} => $foo['a'][$b+4]['c'] // with expression as index
|
||||||
{$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
|
{$foo.a.{$b.c}} => $foo['a'][$b['c']] // with nested index
|
||||||
|
|
||||||
PHP-like syntax, alternative to "dot" syntax:
|
PHP-like syntax, alternative to "dot" syntax:
|
||||||
|
|
||||||
{$foo[1]} // normal access
|
{$foo[1]} // normal access
|
||||||
{$foo['bar']}
|
{$foo['bar']}
|
||||||
{$foo['bar'][1]}
|
{$foo['bar'][1]}
|
||||||
{$foo[$x+$x]} // index may contain any expression
|
{$foo[$x+$x]} // index may contain any expression
|
||||||
{$foo[$bar[1]]} // nested index
|
{$foo[$bar[1]]} // nested index
|
||||||
{$foo[section_name]} // smarty {section} access, not array access!
|
{$foo[section_name]} // smarty {section} access, not array access!
|
||||||
|
|
||||||
Variable variables:
|
Variable variables:
|
||||||
|
|
||||||
$foo // normal variable
|
$foo // normal variable
|
||||||
$foo_{$bar} // variable name containing other variable
|
$foo_{$bar} // variable name containing other variable
|
||||||
$foo_{$x+$y} // variable name containing expressions
|
$foo_{$x+$y} // variable name containing expressions
|
||||||
$foo_{$bar}_buh_{$blar} // variable name with multiple segments
|
$foo_{$bar}_buh_{$blar} // variable name with multiple segments
|
||||||
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
|
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
|
||||||
|
|
||||||
Object chaining:
|
Object chaining:
|
||||||
|
|
||||||
{$object->method1($x)->method2($y)}
|
|
||||||
|
|
||||||
Direct PHP function access:
|
|
||||||
|
|
||||||
{time()}
|
|
||||||
|
|
||||||
|
{$object->method1($x)->method2($y)}
|
||||||
|
|
||||||
|
Direct PHP function access:
|
||||||
|
|
||||||
|
{time()}
|
||||||
|
```
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
@ -104,8 +102,8 @@ the \$dollar syntax and are instead referenced with surrounding
|
|||||||
> explicitly with presentation to PHP by way of plugins or modifiers.
|
> explicitly with presentation to PHP by way of plugins or modifiers.
|
||||||
|
|
||||||
Request variables such as `$_GET`, `$_SESSION`, etc are available via
|
Request variables such as `$_GET`, `$_SESSION`, etc are available via
|
||||||
the reserved [`$smarty`](#language.variables.smarty) variable.
|
the reserved [`$smarty`](../language-variables/language-variables-smarty.md) variable.
|
||||||
|
|
||||||
See also [`$smarty`](#language.variables.smarty), [config
|
See also [`$smarty`](../language-variables/language-variables-smarty.md), [config
|
||||||
variables](#language.config.variables)
|
variables](../language-variables/language-config-variables.md)
|
||||||
[`{assign}`](#language.function.assign) and [`assign()`](#api.assign).
|
[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`assign()`](../../programmers/api-functions/api-assign.md).
|
||||||
|
@ -11,6 +11,9 @@
|
|||||||
| section | No | The name of the section to load |
|
| section | No | The name of the section to load |
|
||||||
| scope | no | How the scope of the loaded variables are treated, which must be one of local, parent or global. local means variables are loaded into the local template context. parent means variables are loaded into both the local context and the parent template that called it. global means variables are available to all templates. |
|
| scope | no | How the scope of the loaded variables are treated, which must be one of local, parent or global. local means variables are loaded into the local template context. parent means variables are loaded into both the local context and the parent template that called it. global means variables are available to all templates. |
|
||||||
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
The `example.conf` file.
|
The `example.conf` file.
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
|
@ -26,6 +26,8 @@ Inheritance](../../programmers/advanced-features/advanced-features-template-inhe
|
|||||||
> [`$compile_id`](../../programmers/api-variables/variable-compile-id.md). Otherwise, Smarty cannot
|
> [`$compile_id`](../../programmers/api-variables/variable-compile-id.md). Otherwise, Smarty cannot
|
||||||
> distinguish between different `$parent_file`s.
|
> distinguish between different `$parent_file`s.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
```smarty
|
```smarty
|
||||||
{extends file='parent.tpl'}
|
{extends file='parent.tpl'}
|
||||||
{extends 'parent.tpl'} {* short-hand *}
|
{extends 'parent.tpl'} {* short-hand *}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
{for} {#language.function.for}
|
# {for}
|
||||||
=====
|
|
||||||
|
|
||||||
The `{for}{forelse}` tag is used to create simple loops. The following
|
The `{for}{forelse}` tag is used to create simple loops. The following different formats are supported:
|
||||||
different formats are supported:
|
|
||||||
|
|
||||||
- `{for $var=$start to $end}` simple loop with step size of 1.
|
- `{for $var=$start to $end}` simple loop with step size of 1.
|
||||||
|
|
||||||
@ -11,87 +9,83 @@ different formats are supported:
|
|||||||
|
|
||||||
`{forelse}` is executed when the loop is not iterated.
|
`{forelse}` is executed when the loop is not iterated.
|
||||||
|
|
||||||
**Attributes:**
|
## Attributes
|
||||||
|
|
||||||
Attribute Name Shorthand Type Required Default Description
|
| Attribute | Required | Description |
|
||||||
---------------- ----------- --------- ---------- --------- --------------------------------
|
|-----------|----------|--------------------------------|
|
||||||
max n/a integer No *n/a* Limit the number of iterations
|
| max | No | Limit the number of iterations |
|
||||||
|
|
||||||
**Option Flags:**
|
## Option Flags
|
||||||
|
|
||||||
Name Description
|
| Name | Description |
|
||||||
--------- --------------------------------------
|
|---------|--------------------------------------|
|
||||||
nocache Disables caching of the `{for}` loop
|
| nocache | Disables caching of the `{for}` loop |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
<ul>
|
```smarty
|
||||||
|
<ul>
|
||||||
{for $foo=1 to 3}
|
{for $foo=1 to 3}
|
||||||
<li>{$foo}</li>
|
<li>{$foo}</li>
|
||||||
{/for}
|
{/for}
|
||||||
</ul>
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>1</li>
|
||||||
|
<li>2</li>
|
||||||
|
<li>3</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
<ul>
|
```php
|
||||||
<li>1</li>
|
<?php
|
||||||
<li>2</li>
|
$smarty->assign('to',10);
|
||||||
<li>3</li>
|
```
|
||||||
</ul>
|
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
|
||||||
$smarty->assign('to',10);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
{for $foo=3 to $to max=3}
|
{for $foo=3 to $to max=3}
|
||||||
<li>{$foo}</li>
|
<li>{$foo}</li>
|
||||||
{/for}
|
{/for}
|
||||||
</ul>
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>3</li>
|
||||||
|
<li>4</li>
|
||||||
|
<li>5</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
<ul>
|
```php
|
||||||
<li>3</li>
|
<?php
|
||||||
<li>4</li>
|
$smarty->assign('start',10);
|
||||||
<li>5</li>
|
$smarty->assign('to',5);
|
||||||
</ul>
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<ul>
|
||||||
|
|
||||||
$smarty->assign('start',10);
|
|
||||||
$smarty->assign('to',5);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
{for $foo=$start to $to}
|
{for $foo=$start to $to}
|
||||||
<li>{$foo}</li>
|
<li>{$foo}</li>
|
||||||
{forelse}
|
{forelse}
|
||||||
no iteration
|
no iteration
|
||||||
{/for}
|
{/for}
|
||||||
</ul>
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
|
no iteration
|
||||||
|
```
|
||||||
|
|
||||||
no iteration
|
See also [`{foreach}`](./language-function-foreach.md),
|
||||||
|
[`{section}`](./language-function-section.md) and
|
||||||
|
[`{while}`](./language-function-while.md)
|
||||||
|
|
||||||
See also [`{foreach}`](#language.function.foreach),
|
|
||||||
[`{section}`](#language.function.section) and
|
|
||||||
[`{while}`](#language.function.while)
|
|
||||||
|
@ -1,15 +1,30 @@
|
|||||||
{foreach},{foreachelse} {#language.function.foreach}
|
# {foreach},{foreachelse}
|
||||||
=======================
|
|
||||||
|
|
||||||
`{foreach}` is used for looping over arrays of data. `{foreach}` has a
|
`{foreach}` is used for looping over arrays of data. `{foreach}` has a
|
||||||
simpler and cleaner syntax than the
|
simpler and cleaner syntax than the
|
||||||
[`{section}`](#language.function.section) loop, and can also loop over
|
[`{section}`](./language-function-section.md) loop, and can also loop over
|
||||||
associative arrays.
|
associative arrays.
|
||||||
|
|
||||||
`{foreach $arrayvar as $itemvar}`
|
## Option Flags
|
||||||
|
|
||||||
`{foreach $arrayvar as $keyvar=>$itemvar}`
|
| Name | Description |
|
||||||
|
|---------|------------------------------------------|
|
||||||
|
| nocache | Disables caching of the `{foreach}` loop |
|
||||||
|
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{foreach $arrayvar as $itemvar}
|
||||||
|
{$itemvar|escape}
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
{foreach $arrayvar as $keyvar=>$itemvar}
|
||||||
|
{$keyvar}: {$itemvar|escape}
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
|
```
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> This foreach syntax does not accept any named attributes. This syntax
|
> This foreach syntax does not accept any named attributes. This syntax
|
||||||
@ -26,15 +41,15 @@ associative arrays.
|
|||||||
- `{foreachelse}` is executed when there are no values in the `array`
|
- `{foreachelse}` is executed when there are no values in the `array`
|
||||||
variable.
|
variable.
|
||||||
|
|
||||||
- `{foreach}` properties are [`@index`](#foreach.property.index),
|
- `{foreach}` properties are [`@index`](#index),
|
||||||
[`@iteration`](#foreach.property.iteration),
|
[`@iteration`](#iteration),
|
||||||
[`@first`](#foreach.property.first),
|
[`@first`](#first),
|
||||||
[`@last`](#foreach.property.last),
|
[`@last`](#last),
|
||||||
[`@show`](#foreach.property.show),
|
[`@show`](#show),
|
||||||
[`@total`](#foreach.property.total).
|
[`@total`](#total).
|
||||||
|
|
||||||
- `{foreach}` constructs are [`{break}`](#foreach.construct.break),
|
- `{foreach}` constructs are [`{break}`](#break),
|
||||||
[`{continue}`](#foreach.construct.continue).
|
[`{continue}`](#continue).
|
||||||
|
|
||||||
- Instead of specifying the `key` variable you can access the current
|
- Instead of specifying the `key` variable you can access the current
|
||||||
key of the loop item by `{$item@key}` (see examples below).
|
key of the loop item by `{$item@key}` (see examples below).
|
||||||
@ -51,161 +66,139 @@ associative arrays.
|
|||||||
> `{foreach $myArray as $myKey => $myValue}`, the key is always
|
> `{foreach $myArray as $myKey => $myValue}`, the key is always
|
||||||
> available as `$myValue@key` within the foreach loop.
|
> available as `$myValue@key` within the foreach loop.
|
||||||
|
|
||||||
**Option Flags:**
|
```php
|
||||||
|
<?php
|
||||||
Name Description
|
$arr = array('red', 'green', 'blue');
|
||||||
--------- ------------------------------------------
|
$smarty->assign('myColors', $arr);
|
||||||
nocache Disables caching of the `{foreach}` loop
|
```
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$arr = array('red', 'green', 'blue');
|
|
||||||
$smarty->assign('myColors', $arr);
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Template to output `$myColors` in an un-ordered list
|
Template to output `$myColors` in an un-ordered list
|
||||||
|
|
||||||
|
```smarty
|
||||||
<ul>
|
<ul>
|
||||||
{foreach $myColors as $color}
|
{foreach $myColors as $color}
|
||||||
<li>{$color}</li>
|
<li>{$color}</li>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</ul>
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<ul>
|
||||||
|
<li>red</li>
|
||||||
|
<li>green</li>
|
||||||
|
<li>blue</li>
|
||||||
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
<ul>
|
```php
|
||||||
<li>red</li>
|
<?php
|
||||||
<li>green</li>
|
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
|
||||||
<li>blue</li>
|
$smarty->assign('myPeople', $people);
|
||||||
</ul>
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<?php
|
|
||||||
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
|
|
||||||
$smarty->assign('myPeople', $people);
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Template to output `$myArray` as key/value pairs.
|
Template to output `$myArray` as key/value pairs.
|
||||||
|
|
||||||
|
```smarty
|
||||||
<ul>
|
<ul>
|
||||||
{foreach $myPeople as $value}
|
{foreach $myPeople as $value}
|
||||||
<li>{$value@key}: {$value}</li>
|
<li>{$value@key}: {$value}</li>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</ul>
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
<ul>
|
<ul>
|
||||||
<li>fname: John</li>
|
<li>fname: John</li>
|
||||||
<li>lname: Doe</li>
|
<li>lname: Doe</li>
|
||||||
<li>email: j.doe@example.com</li>
|
<li>email: j.doe@example.com</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Assign an array to Smarty, the key contains the key for each looped
|
Assign an array to Smarty, the key contains the key for each looped
|
||||||
value.
|
value.
|
||||||
|
|
||||||
|
```php
|
||||||
<?php
|
<?php
|
||||||
$smarty->assign('contacts', array(
|
$smarty->assign(
|
||||||
array('phone' => '555-555-1234',
|
'contacts',
|
||||||
'fax' => '555-555-5678',
|
[
|
||||||
'cell' => '555-555-0357'),
|
['phone' => '555-555-1234', 'fax' => '555-555-5678', 'cell' => '555-555-0357'],
|
||||||
array('phone' => '800-555-4444',
|
['phone' => '800-555-4444', 'fax' => '800-555-3333', 'cell' => '800-555-2222'],
|
||||||
'fax' => '800-555-3333',
|
]
|
||||||
'cell' => '800-555-2222')
|
);
|
||||||
));
|
```
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The template to output `$contact`.
|
The template to output `$contact`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* key always available as a property *}
|
||||||
|
{foreach $contacts as $contact}
|
||||||
|
{foreach $contact as $value}
|
||||||
|
{$value@key}: {$value}
|
||||||
|
{/foreach}
|
||||||
|
{/foreach}
|
||||||
|
|
||||||
{* key always available as a property *}
|
{* accessing key the PHP syntax alternate *}
|
||||||
{foreach $contacts as $contact}
|
{foreach $contacts as $contact}
|
||||||
{foreach $contact as $value}
|
{foreach $contact as $key => $value}
|
||||||
{$value@key}: {$value}
|
{$key}: {$value}
|
||||||
{/foreach}
|
{/foreach}
|
||||||
{/foreach}
|
{/foreach}
|
||||||
|
```
|
||||||
{* accessing key the PHP syntax alternate *}
|
|
||||||
{foreach $contacts as $contact}
|
|
||||||
{foreach $contact as $key => $value}
|
|
||||||
{$key}: {$value}
|
|
||||||
{/foreach}
|
|
||||||
{/foreach}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Either of the above examples will output:
|
Either of the above examples will output:
|
||||||
|
|
||||||
|
```
|
||||||
phone: 555-555-1234
|
phone: 555-555-1234
|
||||||
fax: 555-555-5678
|
fax: 555-555-5678
|
||||||
cell: 555-555-0357
|
cell: 555-555-0357
|
||||||
phone: 800-555-4444
|
phone: 800-555-4444
|
||||||
fax: 800-555-3333
|
fax: 800-555-3333
|
||||||
cell: 800-555-2222
|
cell: 800-555-2222
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
A database (PDO) example of looping over search results. This example is
|
A database (PDO) example of looping over search results. This example is
|
||||||
looping over a PHP iterator instead of an array().
|
looping over a PHP iterator instead of an array().
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
include('Smarty.class.php');
|
||||||
|
|
||||||
<?php
|
$smarty = new Smarty;
|
||||||
include('Smarty.class.php');
|
|
||||||
|
|
||||||
$smarty = new Smarty;
|
$dsn = 'mysql:host=localhost;dbname=test';
|
||||||
|
$login = 'test';
|
||||||
|
$passwd = 'test';
|
||||||
|
|
||||||
$dsn = 'mysql:host=localhost;dbname=test';
|
// setting PDO to use buffered queries in mysql is
|
||||||
$login = 'test';
|
// important if you plan on using multiple result cursors
|
||||||
$passwd = 'test';
|
// in the template.
|
||||||
|
|
||||||
// setting PDO to use buffered queries in mysql is
|
$db = new PDO($dsn, $login, $passwd, array(
|
||||||
// important if you plan on using multiple result cursors
|
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
|
||||||
// in the template.
|
|
||||||
|
|
||||||
$db = new PDO($dsn, $login, $passwd, array(
|
$res = $db->prepare("select * from users");
|
||||||
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
|
$res->execute();
|
||||||
|
$res->setFetchMode(PDO::FETCH_LAZY);
|
||||||
|
|
||||||
$res = $db->prepare("select * from users");
|
// assign to smarty
|
||||||
$res->execute();
|
$smarty->assign('res',$res);
|
||||||
$res->setFetchMode(PDO::FETCH_LAZY);
|
|
||||||
|
|
||||||
// assign to smarty
|
|
||||||
$smarty->assign('res',$res);
|
|
||||||
|
|
||||||
$smarty->display('index.tpl');?>
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{foreach $res as $r}
|
|
||||||
{$r.id}
|
|
||||||
{$r.name}
|
|
||||||
{foreachelse}
|
|
||||||
.. no results ..
|
|
||||||
{/foreach}
|
|
||||||
|
|
||||||
|
$smarty->display('index.tpl');?>
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{foreach $res as $r}
|
||||||
|
{$r.id}
|
||||||
|
{$r.name}
|
||||||
|
{foreachelse}
|
||||||
|
.. no results ..
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
The above is assuming the results contain the columns named `id` and
|
The above is assuming the results contain the columns named `id` and
|
||||||
`name`.
|
`name`.
|
||||||
@ -216,14 +209,13 @@ looped. With an iterator, each result is loaded/released within the
|
|||||||
loop. This saves processing time and memory, especially for very large
|
loop. This saves processing time and memory, especially for very large
|
||||||
result sets.
|
result sets.
|
||||||
|
|
||||||
\@index {#foreach.property.index}
|
## @index
|
||||||
-------
|
|
||||||
|
|
||||||
`index` contains the current array index, starting with zero.
|
`index` contains the current array index, starting with zero.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* output empty row on the 4th iteration (when index is 3) *}
|
{* output empty row on the 4th iteration (when index is 3) *}
|
||||||
<table>
|
<table>
|
||||||
{foreach $items as $i}
|
{foreach $items as $i}
|
||||||
{if $i@index eq 3}
|
{if $i@index eq 3}
|
||||||
{* put empty table row *}
|
{* put empty table row *}
|
||||||
@ -231,72 +223,69 @@ result sets.
|
|||||||
{/if}
|
{/if}
|
||||||
<tr><td>{$i.label}</td></tr>
|
<tr><td>{$i.label}</td></tr>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</table>
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## @iteration
|
||||||
\@iteration {#foreach.property.iteration}
|
|
||||||
-----------
|
|
||||||
|
|
||||||
`iteration` contains the current loop iteration and always starts at
|
`iteration` contains the current loop iteration and always starts at
|
||||||
one, unlike [`index`](#foreach.property.index). It is incremented by one
|
one, unlike [`index`](#index). It is incremented by one
|
||||||
on each iteration.
|
on each iteration.
|
||||||
|
|
||||||
The *\"is div by\"* operator can be used to detect a specific iteration.
|
The *"is div by"* operator can be used to detect a specific iteration.
|
||||||
Here we bold-face the name every 4th iteration.
|
Here we bold-face the name every 4th iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{foreach $myNames as $name}
|
||||||
|
{if $name@iteration is div by 4}
|
||||||
|
<b>{$name}</b>
|
||||||
|
{/if}
|
||||||
|
{$name}
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
{foreach $myNames as $name}
|
The *"is even by"* and *"is odd by"* operators can be used to
|
||||||
{if $name@iteration is div by 4}
|
|
||||||
<b>{$name}</b>
|
|
||||||
{/if}
|
|
||||||
{$name}
|
|
||||||
{/foreach}
|
|
||||||
|
|
||||||
The *\"is even by\"* and *\"is odd by\"* operators can be used to
|
|
||||||
alternate something every so many iterations. Choosing between even or
|
alternate something every so many iterations. Choosing between even or
|
||||||
odd rotates which one starts. Here we switch the font color every 3rd
|
odd rotates which one starts. Here we switch the font color every 3rd
|
||||||
iteration.
|
iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{foreach $myNames as $name}
|
{foreach $myNames as $name}
|
||||||
{if $name@iteration is even by 3}
|
{if $name@iteration is even by 3}
|
||||||
<span style="color: #000">{$name}</span>
|
<span style="color: #000">{$name}</span>
|
||||||
{else}
|
{else}
|
||||||
<span style="color: #eee">{$name}</span>
|
<span style="color: #eee">{$name}</span>
|
||||||
{/if}
|
{/if}
|
||||||
{/foreach}
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
This will output something similar to this:
|
This will output something similar to this:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #000">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
<span style="color: #eee">...</span>
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
<span style="color: #000">...</span>
|
## @first
|
||||||
<span style="color: #000">...</span>
|
|
||||||
<span style="color: #000">...</span>
|
|
||||||
<span style="color: #eee">...</span>
|
|
||||||
<span style="color: #eee">...</span>
|
|
||||||
<span style="color: #eee">...</span>
|
|
||||||
<span style="color: #000">...</span>
|
|
||||||
<span style="color: #000">...</span>
|
|
||||||
<span style="color: #000">...</span>
|
|
||||||
<span style="color: #eee">...</span>
|
|
||||||
<span style="color: #eee">...</span>
|
|
||||||
<span style="color: #eee">...</span>
|
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\@first {#foreach.property.first}
|
|
||||||
-------
|
|
||||||
|
|
||||||
`first` is TRUE if the current `{foreach}` iteration is the initial one.
|
`first` is TRUE if the current `{foreach}` iteration is the initial one.
|
||||||
Here we display a table header row on the first iteration.
|
Here we display a table header row on the first iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* show table header at first iteration *}
|
{* show table header at first iteration *}
|
||||||
<table>
|
<table>
|
||||||
{foreach $items as $i}
|
{foreach $items as $i}
|
||||||
{if $i@first}
|
{if $i@first}
|
||||||
<tr>
|
<tr>
|
||||||
@ -309,99 +298,92 @@ Here we display a table header row on the first iteration.
|
|||||||
<td>{$i.name}</td>
|
<td>{$i.name}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</table>
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
## @last
|
||||||
|
|
||||||
\@last {#foreach.property.last}
|
|
||||||
------
|
|
||||||
|
|
||||||
`last` is set to TRUE if the current `{foreach}` iteration is the final
|
`last` is set to TRUE if the current `{foreach}` iteration is the final
|
||||||
one. Here we display a horizontal rule on the last iteration.
|
one. Here we display a horizontal rule on the last iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* Add horizontal rule at end of list *}
|
||||||
|
{foreach $items as $item}
|
||||||
|
<a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if}
|
||||||
|
{foreachelse}
|
||||||
|
... no items to loop ...
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
{* Add horizontal rule at end of list *}
|
## @show
|
||||||
{foreach $items as $item}
|
|
||||||
<a href="#{$item.id}">{$item.name}</a>{if $item@last}<hr>{else},{/if}
|
|
||||||
{foreachelse}
|
|
||||||
... no items to loop ...
|
|
||||||
{/foreach}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
\@show {#foreach.property.show}
|
|
||||||
------
|
|
||||||
|
|
||||||
The show `show` property can be used after the execution of a
|
The show `show` property can be used after the execution of a
|
||||||
`{foreach}` loop to detect if data has been displayed or not. `show` is
|
`{foreach}` loop to detect if data has been displayed or not. `show` is
|
||||||
a boolean value.
|
a boolean value.
|
||||||
|
|
||||||
|
```smarty
|
||||||
<ul>
|
<ul>
|
||||||
{foreach $myArray as $name}
|
{foreach $myArray as $name}
|
||||||
<li>{$name}</li>
|
<li>{$name}</li>
|
||||||
{/foreach}
|
{/foreach}
|
||||||
</ul>
|
</ul>
|
||||||
{if $name@show} do something here if the array contained data {/if}
|
{if $name@show} do something here if the array contained data {/if}
|
||||||
|
```
|
||||||
|
|
||||||
\@total {#foreach.property.total}
|
## @total
|
||||||
-------
|
|
||||||
|
|
||||||
`total` contains the number of iterations that this `{foreach}` will
|
`total` contains the number of iterations that this `{foreach}` will
|
||||||
loop. This can be used inside or after the `{foreach}`.
|
loop. This can be used inside or after the `{foreach}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* show number of rows at end *}
|
||||||
|
{foreach $items as $item}
|
||||||
|
{$item.name}<hr/>
|
||||||
|
{if $item@last}
|
||||||
|
<div id="total">{$item@total} items</div>
|
||||||
|
{/if}
|
||||||
|
{foreachelse}
|
||||||
|
... no items to loop ...
|
||||||
|
{/foreach}
|
||||||
|
```
|
||||||
|
|
||||||
{* show number of rows at end *}
|
See also [`{section}`](./language-function-section.md),
|
||||||
{foreach $items as $item}
|
[`{for}`](./language-function-for.md) and
|
||||||
{$item.name}<hr/>
|
[`{while}`](./language-function-while.md)
|
||||||
{if $item@last}
|
|
||||||
<div id="total">{$item@total} items</div>
|
|
||||||
{/if}
|
|
||||||
{foreachelse}
|
|
||||||
... no items to loop ...
|
|
||||||
{/foreach}
|
|
||||||
|
|
||||||
See also [`{section}`](#language.function.section),
|
## {break}
|
||||||
[`{for}`](#language.function.for) and
|
|
||||||
[`{while}`](#language.function.while)
|
|
||||||
|
|
||||||
{break} {#foreach.construct.break}
|
|
||||||
-------
|
|
||||||
|
|
||||||
`{break}` aborts the iteration of the array
|
`{break}` aborts the iteration of the array
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{$data = [1,2,3,4,5]}
|
||||||
|
{foreach $data as $value}
|
||||||
|
{if $value == 3}
|
||||||
|
{* abort iterating the array *}
|
||||||
|
{break}
|
||||||
|
{/if}
|
||||||
|
{$value}
|
||||||
|
{/foreach}
|
||||||
|
{*
|
||||||
|
prints: 1 2
|
||||||
|
*}
|
||||||
|
```
|
||||||
|
|
||||||
{$data = [1,2,3,4,5]}
|
## {continue}
|
||||||
{foreach $data as $value}
|
|
||||||
{if $value == 3}
|
|
||||||
{* abort iterating the array *}
|
|
||||||
{break}
|
|
||||||
{/if}
|
|
||||||
{$value}
|
|
||||||
{/foreach}
|
|
||||||
{*
|
|
||||||
prints: 1 2
|
|
||||||
*}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{continue} {#foreach.construct.continue}
|
|
||||||
----------
|
|
||||||
|
|
||||||
`{continue}` leaves the current iteration and begins with the next
|
`{continue}` leaves the current iteration and begins with the next
|
||||||
iteration.
|
iteration.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{$data = [1,2,3,4,5]}
|
{$data = [1,2,3,4,5]}
|
||||||
{foreach $data as $value}
|
{foreach $data as $value}
|
||||||
{if $value == 3}
|
{if $value == 3}
|
||||||
{* skip this iteration *}
|
{* skip this iteration *}
|
||||||
{continue}
|
{continue}
|
||||||
{/if}
|
{/if}
|
||||||
{$value}
|
{$value}
|
||||||
{/foreach}
|
{/foreach}
|
||||||
{*
|
{*
|
||||||
prints: 1 2 4 5
|
prints: 1 2 4 5
|
||||||
*}
|
*}
|
||||||
|
```
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
{function} {#language.function.function}
|
# {function}
|
||||||
==========
|
|
||||||
|
|
||||||
`{function}` is used to create functions within a template and call them
|
`{function}` is used to create functions within a template and call them
|
||||||
just like a plugin function. Instead of writing a plugin that generates
|
just like a plugin function. Instead of writing a plugin that generates
|
||||||
@ -12,15 +11,22 @@ nested menus.
|
|||||||
> Template functions are defined global. Since the Smarty compiler is a
|
> Template functions are defined global. Since the Smarty compiler is a
|
||||||
> single-pass compiler, The [`{call}`](#language.function.call) tag must
|
> single-pass compiler, The [`{call}`](#language.function.call) tag must
|
||||||
> be used to call a template function defined externally from the given
|
> be used to call a template function defined externally from the given
|
||||||
> template. Otherwise you can directly use the function as
|
> template. Otherwise, you can directly use the function as
|
||||||
> `{funcname ...}` in the template.
|
> `{funcname ...}` in the template.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|---------------------------------------------------------------|
|
||||||
|
| name | Yes | The name of the template function |
|
||||||
|
| \[var \...\] | No | default variable value to pass local to the template function |
|
||||||
|
|
||||||
- The `{function}` tag must have the `name` attribute which contains
|
- The `{function}` tag must have the `name` attribute which contains
|
||||||
the the name of the template function. A tag with this name can be
|
the name of the template function. A tag with this name can be
|
||||||
used to call the template function.
|
used to call the template function.
|
||||||
|
|
||||||
- Default values for variables can be passed to the template function
|
- Default values for variables can be passed to the template function
|
||||||
as [attributes](#language.syntax.attributes). Like in PHP function
|
as [attributes](../language-basic-syntax/language-syntax-attributes.md). Like in PHP function
|
||||||
declarations you can only use scalar values as default. The default
|
declarations you can only use scalar values as default. The default
|
||||||
values can be overwritten when the template function is being
|
values can be overwritten when the template function is being
|
||||||
called.
|
called.
|
||||||
@ -30,12 +36,7 @@ nested menus.
|
|||||||
inside the template function have local scope and are not visible
|
inside the template function have local scope and are not visible
|
||||||
inside the calling template after the template function is executed.
|
inside the calling template after the template function is executed.
|
||||||
|
|
||||||
**Attributes:**
|
|
||||||
|
|
||||||
Attribute Name Type Required Default Description
|
|
||||||
---------------- -------------- ---------- --------- ---------------------------------------------------------------
|
|
||||||
name string Yes *n/a* The name of the template function
|
|
||||||
\[var \...\] \[var type\] No *n/a* default variable value to pass local to the template function
|
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
@ -45,44 +46,44 @@ nested menus.
|
|||||||
> values must be scalar and can not be variable. Variables must be
|
> values must be scalar and can not be variable. Variables must be
|
||||||
> passed when the template is called.
|
> passed when the template is called.
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
{* define the function *}
|
```smarty
|
||||||
{function name=menu level=0}
|
{* define the function *}
|
||||||
{function menu level=0} {* short-hand *}
|
{function name=menu level=0}
|
||||||
<ul class="level{$level}">
|
{function menu level=0} {* short-hand *}
|
||||||
{foreach $data as $entry}
|
<ul class="level{$level}">
|
||||||
{if is_array($entry)}
|
{foreach $data as $entry}
|
||||||
<li>{$entry@key}</li>
|
{if is_array($entry)}
|
||||||
{menu data=$entry level=$level+1}
|
<li>{$entry@key}</li>
|
||||||
{else}
|
{menu data=$entry level=$level+1}
|
||||||
<li>{$entry}</li>
|
{else}
|
||||||
{/if}
|
<li>{$entry}</li>
|
||||||
{/foreach}
|
{/if}
|
||||||
</ul>
|
{/foreach}
|
||||||
{/function}
|
</ul>
|
||||||
|
{/function}
|
||||||
{* create an array to demonstrate *}
|
|
||||||
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
|
||||||
['item3-3-1','item3-3-2']],'item4']}
|
|
||||||
|
|
||||||
{* run the array through the function *}
|
|
||||||
{menu data=$menu}
|
|
||||||
|
|
||||||
|
{* create an array to demonstrate *}
|
||||||
|
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
||||||
|
['item3-3-1','item3-3-2']],'item4']}
|
||||||
|
|
||||||
|
{* run the array through the function *}
|
||||||
|
{menu data=$menu}
|
||||||
|
```
|
||||||
|
|
||||||
Will generate the following output
|
Will generate the following output
|
||||||
|
|
||||||
|
```
|
||||||
|
* item1
|
||||||
|
* item2
|
||||||
|
* item3
|
||||||
|
o item3-1
|
||||||
|
o item3-2
|
||||||
|
o item3-3
|
||||||
|
+ item3-3-1
|
||||||
|
+ item3-3-2
|
||||||
|
* item4
|
||||||
|
```
|
||||||
|
|
||||||
* item1
|
See also [`{call}`](./language-function-call.md)
|
||||||
* item2
|
|
||||||
* item3
|
|
||||||
o item3-1
|
|
||||||
o item3-2
|
|
||||||
o item3-3
|
|
||||||
+ item3-3-1
|
|
||||||
+ item3-3-2
|
|
||||||
* item4
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`{call}`](#language.function.call)
|
|
||||||
|
@ -1,121 +1,120 @@
|
|||||||
{if},{elseif},{else} {#language.function.if}
|
# {if},{elseif},{else}
|
||||||
====================
|
|
||||||
|
|
||||||
`{if}` statements in Smarty have much the same flexibility as PHP
|
`{if}` statements in Smarty have much the same flexibility as PHP
|
||||||
[if](https://www.php.net/if) statements, with a few added features for the
|
[if](https://www.php.net/if) statements, with a few added features for the
|
||||||
template engine. Every `{if}` must be paired with a matching `{/if}`.
|
template engine. Every `{if}` must be paired with a matching `{/if}`.
|
||||||
`{else}` and `{elseif}` are also permitted. All PHP conditionals and
|
`{else}` and `{elseif}` are also permitted. All PHP conditionals and
|
||||||
functions are recognized, such as *\|\|*, *or*, *&&*, *and*,
|
functions are recognized, such as *\|\|*, *or*, *&&*, *and*,
|
||||||
*is\_array()*, etc.
|
*is_array()*, etc.
|
||||||
|
|
||||||
If securty is enabled, only PHP functions from `$php_functions` property
|
If security is enabled, only PHP functions from `$php_functions` property
|
||||||
of the securty policy are allowed. See the
|
of the security policy are allowed. See the
|
||||||
[Security](#advanced.features.security) section for details.
|
[Security](../../programmers/advanced-features/advanced-features-security.md) section for details.
|
||||||
|
|
||||||
The following is a list of recognized qualifiers, which must be
|
The following is a list of recognized qualifiers, which must be
|
||||||
separated from surrounding elements by spaces. Note that items listed in
|
separated from surrounding elements by spaces. Note that items listed in
|
||||||
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||||
|
|
||||||
Qualifier Alternates Syntax Example Meaning PHP Equivalent
|
## Qualifiers
|
||||||
-------------------- ------------ ------------------------ -------------------------------- ----------------------
|
|
||||||
== eq \$a eq \$b equals ==
|
| Qualifier | Alternates | Syntax Example | Meaning | PHP Equivalent |
|
||||||
!= ne, neq \$a neq \$b not equals !=
|
|--------------------|------------|----------------------|--------------------------------|--------------------|
|
||||||
\> gt \$a gt \$b greater than \>
|
| == | eq | $a eq $b | equals | == |
|
||||||
\< lt \$a lt \$b less than \<
|
| != | ne, neq | $a neq $b | not equals | != |
|
||||||
\>= gte, ge \$a ge \$b greater than or equal \>=
|
| > | gt | $a gt $b | greater than | > |
|
||||||
\<= lte, le \$a le \$b less than or equal \<=
|
| < | lt | $a lt $b | less than | < |
|
||||||
=== \$a === 0 check for identity ===
|
| >= | gte, ge | $a ge $b | greater than or equal | >= |
|
||||||
! not not \$a negation (unary) !
|
| <= | lte, le | $a le $b | less than or equal | <= |
|
||||||
\% mod \$a mod \$b modulous \%
|
| === | | $a === 0 | check for identity | === |
|
||||||
is \[not\] div by \$a is not div by 4 divisible by \$a % \$b == 0
|
| ! | not | not $a | negation (unary) | ! |
|
||||||
is \[not\] even \$a is not even \[not\] an even number (unary) \$a % 2 == 0
|
| % | mod | $a mod $b | modulo | % |
|
||||||
is \[not\] even by \$a is not even by \$b grouping level \[not\] even (\$a / \$b) % 2 == 0
|
| is \[not\] div by | | $a is not div by 4 | divisible by | $a % $b == 0 |
|
||||||
is \[not\] odd \$a is not odd \[not\] an odd number (unary) \$a % 2 != 0
|
| is \[not\] even | | $a is not even | \[not\] an even number (unary) | $a % 2 == 0 |
|
||||||
is \[not\] odd by \$a is not odd by \$b \[not\] an odd grouping (\$a / \$b) % 2 != 0
|
| is \[not\] even by | | $a is not even by $b | grouping level \[not\] even | ($a / $b) % 2 == 0 |
|
||||||
|
| is \[not\] odd | | $a is not odd | \[not\] an odd number (unary) | $a % 2 != 0 |
|
||||||
|
| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{if $name eq 'Fred'}
|
||||||
|
Welcome Sir.
|
||||||
|
{elseif $name eq 'Wilma'}
|
||||||
|
Welcome Ma'am.
|
||||||
|
{else}
|
||||||
|
Welcome, whatever you are.
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* an example with "or" logic *}
|
||||||
|
{if $name eq 'Fred' or $name eq 'Wilma'}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* same as above *}
|
||||||
|
{if $name == 'Fred' || $name == 'Wilma'}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
{if $name eq 'Fred'}
|
{* parenthesis are allowed *}
|
||||||
Welcome Sir.
|
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
||||||
{elseif $name eq 'Wilma'}
|
...
|
||||||
Welcome Ma'am.
|
{/if}
|
||||||
{else}
|
|
||||||
Welcome, whatever you are.
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{* an example with "or" logic *}
|
|
||||||
{if $name eq 'Fred' or $name eq 'Wilma'}
|
|
||||||
...
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{* same as above *}
|
|
||||||
{if $name == 'Fred' || $name == 'Wilma'}
|
|
||||||
...
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
|
||||||
{* parenthesis are allowed *}
|
{* you can also embed php function calls *}
|
||||||
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
{if count($var) gt 0}
|
||||||
...
|
...
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
|
{* check for array. *}
|
||||||
|
{if is_array($foo) }
|
||||||
|
.....
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* check for not null. *}
|
||||||
|
{if isset($foo) }
|
||||||
|
.....
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
|
||||||
{* you can also embed php function calls *}
|
{* test if values are even or odd *}
|
||||||
{if count($var) gt 0}
|
{if $var is even}
|
||||||
...
|
...
|
||||||
{/if}
|
{/if}
|
||||||
|
{if $var is odd}
|
||||||
{* check for array. *}
|
...
|
||||||
{if is_array($foo) }
|
{/if}
|
||||||
.....
|
{if $var is not odd}
|
||||||
{/if}
|
...
|
||||||
|
{/if}
|
||||||
{* check for not null. *}
|
|
||||||
{if isset($foo) }
|
|
||||||
.....
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
|
||||||
{* test if values are even or odd *}
|
{* test if var is divisible by 4 *}
|
||||||
{if $var is even}
|
{if $var is div by 4}
|
||||||
...
|
...
|
||||||
{/if}
|
{/if}
|
||||||
{if $var is odd}
|
|
||||||
...
|
|
||||||
{/if}
|
|
||||||
{if $var is not odd}
|
|
||||||
...
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
|
||||||
{* test if var is divisible by 4 *}
|
{*
|
||||||
{if $var is div by 4}
|
test if var is even, grouped by two. i.e.,
|
||||||
...
|
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
|
||||||
{/if}
|
*}
|
||||||
|
{if $var is even by 2}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
|
{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
|
||||||
|
{if $var is even by 3}
|
||||||
|
...
|
||||||
|
{/if}
|
||||||
|
|
||||||
{*
|
{if isset($name) && $name == 'Blog'}
|
||||||
test if var is even, grouped by two. i.e.,
|
{* do something *}
|
||||||
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
|
{elseif $name == $foo}
|
||||||
*}
|
{* do something *}
|
||||||
{if $var is even by 2}
|
{/if}
|
||||||
...
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{* 0=even, 1=even, 2=even, 3=odd, 4=odd, 5=odd, etc. *}
|
|
||||||
{if $var is even by 3}
|
|
||||||
...
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{if isset($name) && $name == 'Blog'}
|
|
||||||
{* do something *}
|
|
||||||
{elseif $name == $foo}
|
|
||||||
{* do something *}
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
{if is_array($foo) && count($foo) > 0}
|
|
||||||
{* do a foreach loop *}
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
{if is_array($foo) && count($foo) > 0}
|
||||||
|
{* do a foreach loop *}
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
@ -1,19 +1,31 @@
|
|||||||
{include} {#language.function.include}
|
# {include}
|
||||||
=========
|
|
||||||
|
|
||||||
`{include}` tags are used for including other templates in the current
|
`{include}` tags are used for including other templates in the current
|
||||||
template. Any variables available in the current template are also
|
template. Any variables available in the current template are also
|
||||||
available within the included template.
|
available within the included template.
|
||||||
|
|
||||||
|
## Attributes
|
||||||
|
|
||||||
|
| Attribute Name | Required | Description |
|
||||||
|
|----------------|----------|--------------------------------------------------------------------------------------------|
|
||||||
|
| file | Yes | The name of the template file to include |
|
||||||
|
| assign | No | The name of the variable that the output of include will be assigned to |
|
||||||
|
| cache_lifetime | No | Enable caching of this subtemplate with an individual cache lifetime |
|
||||||
|
| compile_id | No | Compile this subtemplate with an individual compile_id |
|
||||||
|
| cache_id | No | Enable caching of this subtemplate with an individual cache_id |
|
||||||
|
| scope | No | Define the scope of all in the subtemplate assigned variables: 'parent','root' or 'global' |
|
||||||
|
| \[var \...\] | No | variable to pass local to template |
|
||||||
|
|
||||||
|
|
||||||
- The `{include}` tag must have the `file` attribute which contains
|
- The `{include}` tag must have the `file` attribute which contains
|
||||||
the template resource path.
|
the template resource path.
|
||||||
|
|
||||||
- Setting the optional `assign` attribute specifies the template
|
- Setting the optional `assign` attribute specifies the template
|
||||||
variable that the output of `{include}` is assigned to, instead of
|
variable that the output of `{include}` is assigned to, instead of
|
||||||
being displayed. Similar to [`{assign}`](#language.function.assign).
|
being displayed. Similar to [`{assign}`](./language-function-assign.md).
|
||||||
|
|
||||||
- Variables can be passed to included templates as
|
- Variables can be passed to included templates as
|
||||||
[attributes](#language.syntax.attributes). Any variables explicitly
|
[attributes](../language-basic-syntax/language-syntax-attributes.md). Any variables explicitly
|
||||||
passed to an included template are only available within the scope
|
passed to an included template are only available within the scope
|
||||||
of the included file. Attribute variables override current template
|
of the included file. Attribute variables override current template
|
||||||
variables, in the case when they are named the same.
|
variables, in the case when they are named the same.
|
||||||
@ -25,36 +37,25 @@ available within the included template.
|
|||||||
default behaviour can be changed for all variables assigned in the
|
default behaviour can be changed for all variables assigned in the
|
||||||
included template by using the scope attribute at the `{include}`
|
included template by using the scope attribute at the `{include}`
|
||||||
statement or for individual variables by using the scope attribute
|
statement or for individual variables by using the scope attribute
|
||||||
at the [`{assign}`](#language.function.assign) statement. The later
|
at the [`{assign}`](./language-function-assign.md) statement. The later
|
||||||
is useful to return values from the included template to the
|
is useful to return values from the included template to the
|
||||||
including template.
|
including template.
|
||||||
|
|
||||||
- Use the syntax for [template resources](#resources) to `{include}`
|
- Use the syntax for [template resources](../../programmers/resources.md) to `{include}`
|
||||||
files outside of the [`$template_dir`](#variable.template.dir)
|
files outside of the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md)
|
||||||
directory.
|
directory.
|
||||||
|
|
||||||
**Attributes:**
|
## Option Flags
|
||||||
|
|
||||||
Attribute Name Type Required Default Description
|
| Name | Description |
|
||||||
----------------- ---------------- ---------- --------- --------------------------------------------------------------------------------------------------
|
|---------|--------------------------------------------------------------------------------------|
|
||||||
file string Yes *n/a* The name of the template file to include
|
| nocache | Disables caching of this subtemplate |
|
||||||
assign string No *n/a* The name of the variable that the output of include will be assigned to
|
| caching | Enable caching of this subtemplate |
|
||||||
cache\_lifetime integer No *n/a* Enable caching of this subtemplate with an individual cache lifetime
|
| inline | If set, merge the compile-code of the subtemplate into the compiled calling template |
|
||||||
compile\_id string/integer No *n/a* Compile this subtemplate with an individual compile\_id
|
|
||||||
cache\_id string/integer No *n/a* Enable caching of this subtemplate with an individual cache\_id
|
|
||||||
scope string No *n/a* Define the scope of all in the subtemplate assigned variables: \'parent\',\'root\' or \'global\'
|
|
||||||
\[var \...\] \[var type\] No *n/a* variable to pass local to template
|
|
||||||
|
|
||||||
**Option Flags:**
|
## Examples
|
||||||
|
```smarty
|
||||||
Name Description
|
<html>
|
||||||
--------- -------------------------------------------------------------------------------------
|
|
||||||
nocache Disables caching of this subtemplate
|
|
||||||
caching Enable caching of this subtemplate
|
|
||||||
inline If set merge the compile code of the subtemplate into the compiled calling template
|
|
||||||
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
<head>
|
||||||
<title>{$title}</title>
|
<title>{$title}</title>
|
||||||
</head>
|
</head>
|
||||||
@ -69,124 +70,118 @@ available within the included template.
|
|||||||
{* using shortform file attribute *}
|
{* using shortform file attribute *}
|
||||||
{include 'page_footer.tpl'}
|
{include 'page_footer.tpl'}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
```
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
|
||||||
|
{include 'links.tpl' title='Newest links' links=$link_array}
|
||||||
|
{* body of template goes here *}
|
||||||
|
{include 'footer.tpl' foo='bar'}
|
||||||
|
|
||||||
|
```
|
||||||
{include 'links.tpl' title='Newest links' links=$link_array}
|
|
||||||
{* body of template goes here *}
|
|
||||||
{include 'footer.tpl' foo='bar'}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The template above includes the example `links.tpl` below
|
The template above includes the example `links.tpl` below
|
||||||
|
|
||||||
|
```smarty
|
||||||
<div id="box">
|
<div id="box">
|
||||||
<h3>{$title}{/h3>
|
<h3>{$title}{/h3>
|
||||||
<ul>
|
<ul>
|
||||||
{foreach from=$links item=l}
|
{foreach from=$links item=l}
|
||||||
.. do stuff ...
|
.. do stuff ...
|
||||||
</foreach}
|
</foreach}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
```
|
||||||
Variables assigned in the included template will be seen in the
|
Variables assigned in the included template will be seen in the
|
||||||
including template.
|
including template.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{include 'sub_template.tpl' scope=parent}
|
{include 'sub_template.tpl' scope=parent}
|
||||||
...
|
...
|
||||||
{* display variables assigned in sub_template *}
|
{* display variables assigned in sub_template *}
|
||||||
{$foo}<br>
|
{$foo}<br>
|
||||||
{$bar}<br>
|
{$bar}<br>
|
||||||
...
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The template above includes the example `sub_template.tpl` below
|
The template above includes the example `sub_template.tpl` below
|
||||||
|
|
||||||
|
```smarty
|
||||||
...
|
...
|
||||||
{assign var=foo value='something'}
|
{assign var=foo value='something'}
|
||||||
{assign var=bar value='value'}
|
{assign var=bar value='value'}
|
||||||
...
|
...
|
||||||
|
```
|
||||||
|
|
||||||
The included template will not be cached.
|
The included template will not be cached.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{include 'sub_template.tpl' nocache}
|
{include 'sub_template.tpl' nocache}
|
||||||
...
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
In this example included template will be cached with an individual
|
In this example included template will be cached with an individual
|
||||||
cache lifetime of 500 seconds.
|
cache lifetime of 500 seconds.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{include 'sub_template.tpl' cache_lifetime=500}
|
{include 'sub_template.tpl' cache_lifetime=500}
|
||||||
...
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
In this example included template will be cached independent of the
|
In this example included template will be cached independent of the
|
||||||
global caching setting.
|
global caching setting.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{include 'sub_template.tpl' caching}
|
{include 'sub_template.tpl' caching}
|
||||||
...
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
This example assigns the contents of `nav.tpl` to the `$navbar`
|
This example assigns the contents of `nav.tpl` to the `$navbar`
|
||||||
variable, which is then output at both the top and bottom of the page.
|
variable, which is then output at both the top and bottom of the page.
|
||||||
|
|
||||||
|
```smarty
|
||||||
<body>
|
<body>
|
||||||
{include 'nav.tpl' assign=navbar}
|
{include 'nav.tpl' assign=navbar}
|
||||||
{include 'header.tpl' title='Smarty is cool'}
|
{include 'header.tpl' title='Smarty is cool'}
|
||||||
{$navbar}
|
{$navbar}
|
||||||
{* body of template goes here *}
|
{* body of template goes here *}
|
||||||
{$navbar}
|
{$navbar}
|
||||||
{include 'footer.tpl'}
|
{include 'footer.tpl'}
|
||||||
</body>
|
</body>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
This example includes another template relative to the directory of the
|
This example includes another template relative to the directory of the
|
||||||
current template.
|
current template.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{include 'template-in-a-template_dir-directory.tpl'}
|
||||||
|
{include './template-in-same-directory.tpl'}
|
||||||
|
{include '../template-in-parent-directory.tpl'}
|
||||||
|
```
|
||||||
|
|
||||||
{include 'template-in-a-template_dir-directory.tpl'}
|
```smarty
|
||||||
{include './template-in-same-directory.tpl'}
|
{* absolute filepath *}
|
||||||
{include '../template-in-parent-directory.tpl'}
|
{include file='/usr/local/include/templates/header.tpl'}
|
||||||
|
|
||||||
|
{* absolute filepath (same thing) *}
|
||||||
|
{include file='file:/usr/local/include/templates/header.tpl'}
|
||||||
|
|
||||||
|
{* windows absolute filepath (MUST use "file:" prefix) *}
|
||||||
|
{include file='file:C:/www/pub/templates/header.tpl'}
|
||||||
|
|
||||||
|
{* include from template resource named "db" *}
|
||||||
|
{include file='db:header.tpl'}
|
||||||
|
|
||||||
{* absolute filepath *}
|
{* include a $variable template - eg $module = 'contacts' *}
|
||||||
{include file='/usr/local/include/templates/header.tpl'}
|
{include file="$module.tpl"}
|
||||||
|
|
||||||
{* absolute filepath (same thing) *}
|
{* wont work as its single quotes ie no variable substitution *}
|
||||||
{include file='file:/usr/local/include/templates/header.tpl'}
|
{include file='$module.tpl'}
|
||||||
|
|
||||||
{* windows absolute filepath (MUST use "file:" prefix) *}
|
{* include a multi $variable template - eg amber/links.view.tpl *}
|
||||||
{include file='file:C:/www/pub/templates/header.tpl'}
|
{include file="$style_dir/$module.$view.tpl"}
|
||||||
|
```
|
||||||
|
|
||||||
{* include from template resource named "db" *}
|
See also [`{insert}`](./language-function-insert.md), [template resources](../../programmers/resources.md) and
|
||||||
{include file='db:header.tpl'}
|
[componentized templates](../../appendixes/tips.md#componentized-templates).
|
||||||
|
|
||||||
{* include a $variable template - eg $module = 'contacts' *}
|
|
||||||
{include file="$module.tpl"}
|
|
||||||
|
|
||||||
{* wont work as its single quotes ie no variable substitution *}
|
|
||||||
{include file='$module.tpl'}
|
|
||||||
|
|
||||||
{* include a multi $variable template - eg amber/links.view.tpl *}
|
|
||||||
{include file="$style_dir/$module.$view.tpl"}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`{insert}`](#language.function.insert), [template resources](#resources) and
|
|
||||||
[componentized templates](#tips.componentized.templates).
|
|
||||||
|
@ -1,51 +1,51 @@
|
|||||||
{insert} {#language.function.insert}
|
# {insert}
|
||||||
========
|
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> `{insert}` tags are deprecated from Smarty, and should not be used.
|
> `{insert}` tags are deprecated from Smarty, and should not be used.
|
||||||
> Put your PHP logic in PHP scripts or plugin functions instead.
|
> Put your PHP logic in PHP scripts or plugin functions instead.
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> As of Smarty 3.1 the `{insert}` tags are only available from
|
> As of Smarty 3.1 the `{insert}` tags are only available from
|
||||||
> [SmartyBC](#bc).
|
> [SmartyBC](#bc).
|
||||||
|
|
||||||
`{insert}` tags work much like [`{include}`](#language.function.include)
|
`{insert}` tags work much like [`{include}`](./language-function-include.md)
|
||||||
tags, except that `{insert}` tags are NOT cached when template
|
tags, except that `{insert}` tags are NOT cached when template
|
||||||
[caching](#caching) is enabled. They will be executed on every
|
[caching](../../programmers/caching.md) is enabled. They will be executed on every
|
||||||
invocation of the template.
|
invocation of the template.
|
||||||
|
|
||||||
Attribute Name Type Required Default Description
|
| Attribute Name | Required | Description |
|
||||||
---------------- -------------- ---------- --------- ----------------------------------------------------------------------------------
|
|----------------|----------|----------------------------------------------------------------------------------|
|
||||||
name string Yes *n/a* The name of the insert function (insert\_`name`) or insert plugin
|
| name | Yes | The name of the insert function (insert_`name`) or insert plugin |
|
||||||
assign string No *n/a* The name of the template variable the output will be assigned to
|
| assign | No | The name of the template variable the output will be assigned to |
|
||||||
script string No *n/a* The name of the php script that is included before the insert function is called
|
| script | No | The name of the php script that is included before the insert function is called |
|
||||||
\[var \...\] \[var type\] No *n/a* variable to pass to insert function
|
| \[var \...\] | No | variable to pass to insert function |
|
||||||
|
|
||||||
Let\'s say you have a template with a banner slot at the top of the
|
## Examples
|
||||||
|
|
||||||
|
Let's say you have a template with a banner slot at the top of the
|
||||||
page. The banner can contain any mixture of HTML, images, flash, etc. so
|
page. The banner can contain any mixture of HTML, images, flash, etc. so
|
||||||
we can\'t just use a static link here, and we don\'t want this contents
|
we can't just use a static link here, and we don't want this contents
|
||||||
cached with the page. In comes the {insert} tag: the template knows
|
cached with the page. In comes the {insert} tag: the template knows
|
||||||
\#banner\_location\_id\# and \#site\_id\# values (gathered from a
|
\#banner\_location\_id\# and \#site\_id\# values (gathered from a
|
||||||
[config file](#config.files)), and needs to call a function to get the
|
[config file](../config-files.md)), and needs to call a function to get the
|
||||||
banner contents.
|
banner contents.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* example of fetching a banner *}
|
{* example of fetching a banner *}
|
||||||
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
|
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
|
||||||
{insert "getBanner" lid=#banner_location_id# sid=#site_id#} {* short-hand *}
|
{insert "getBanner" lid=#banner_location_id# sid=#site_id#} {* short-hand *}
|
||||||
|
```
|
||||||
|
|
||||||
In this example, we are using the name "getBanner" and passing the
|
In this example, we are using the name "getBanner" and passing the
|
||||||
parameters \#banner\_location\_id\# and \#site\_id\#. Smarty will look
|
parameters \#banner\_location\_id\# and \#site\_id\#. Smarty will look
|
||||||
for a function named insert\_getBanner() in your PHP application,
|
for a function named insert\_getBanner() in your PHP application,
|
||||||
passing the values of \#banner\_location\_id\# and \#site\_id\# as the
|
passing the values of \#banner\_location\_id\# and \#site\_id\# as the
|
||||||
first argument in an associative array. All {insert} function names in
|
first argument in an associative array. All {insert} function names in
|
||||||
your application must be prepended with \"insert\_\" to remedy possible
|
your application must be prepended with "insert_" to remedy possible
|
||||||
function name-space conflicts. Your insert\_getBanner() function should
|
function name-space conflicts. Your insert\_getBanner() function should
|
||||||
do something with the passed values and return the results. These
|
do something with the passed values and return the results. These
|
||||||
results are then displayed in the template in place of the {insert} tag.
|
results are then displayed in the template in place of the {insert} tag.
|
||||||
In this example, Smarty would call this function:
|
In this example, Smarty would call this function:
|
||||||
insert\_getBanner(array(\"lid\" =\> \"12345\",\"sid\" =\> \"67890\"));
|
insert_getBanner(array("lid" => "12345","sid" => "67890"));
|
||||||
and display the returned results in place of the {insert} tag.
|
and display the returned results in place of the {insert} tag.
|
||||||
|
|
||||||
- If you supply the `assign` attribute, the output of the `{insert}`
|
- If you supply the `assign` attribute, the output of the `{insert}`
|
||||||
@ -54,8 +54,8 @@ and display the returned results in place of the {insert} tag.
|
|||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> Assigning the output to a template variable isn\'t too useful with
|
> Assigning the output to a template variable isn't too useful with
|
||||||
> [caching](#variable.caching) enabled.
|
> [caching](../../programmers/api-variables/variable-caching.md) enabled.
|
||||||
|
|
||||||
- If you supply the `script` attribute, this php script will be
|
- If you supply the `script` attribute, this php script will be
|
||||||
included (only once) before the `{insert}` function is executed.
|
included (only once) before the `{insert}` function is executed.
|
||||||
@ -63,9 +63,9 @@ and display the returned results in place of the {insert} tag.
|
|||||||
php script must be included first to make it work.
|
php script must be included first to make it work.
|
||||||
|
|
||||||
The path can be either absolute, or relative to
|
The path can be either absolute, or relative to
|
||||||
[`$trusted_dir`](#variable.trusted.dir). If security is enabled,
|
[`$trusted_dir`](../../programmers/api-variables/variable-trusted-dir.md). If security is enabled,
|
||||||
then the script must be located in the `$trusted_dir` path of the
|
then the script must be located in the `$trusted_dir` path of the
|
||||||
security policy. See the [Security](#advanced.features.security)
|
security policy. See the [Security](../../programmers/advanced-features/advanced-features-security.md)
|
||||||
section for details.
|
section for details.
|
||||||
|
|
||||||
The Smarty object is passed as the second argument. This way you can
|
The Smarty object is passed as the second argument. This way you can
|
||||||
@ -78,9 +78,9 @@ insert plugin.
|
|||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> It is possible to have portions of the template not cached. If you
|
> It is possible to have portions of the template not cached. If you
|
||||||
> have [caching](#caching) turned on, `{insert}` tags will not be
|
> have [caching](../../programmers/api-variables/variable-caching.md) turned on, `{insert}` tags will not be
|
||||||
> cached. They will run dynamically every time the page is created, even
|
> cached. They will run dynamically every time the page is created, even
|
||||||
> within cached pages. This works good for things like banners, polls,
|
> within cached pages. This works good for things like banners, polls,
|
||||||
> live weather, search results, user feedback areas, etc.
|
> live weather, search results, user feedback areas, etc.
|
||||||
|
|
||||||
See also [`{include}`](#language.function.include)
|
See also [`{include}`](./language-function-include.md)
|
||||||
|
@ -1,55 +1,51 @@
|
|||||||
{ldelim},{rdelim} {#language.function.ldelim}
|
# {ldelim}, {rdelim}
|
||||||
=================
|
|
||||||
|
|
||||||
`{ldelim}` and `{rdelim}` are used for [escaping](#language.escaping)
|
`{ldelim}` and `{rdelim}` are used for [escaping](../language-basic-syntax/language-escaping.md)
|
||||||
template delimiters, by default **{** and **}**. You can also use
|
template delimiters, by default **{** and **}**. You can also use
|
||||||
[`{literal}{/literal}`](#language.function.literal) to escape blocks of
|
[`{literal}{/literal}`](./language-function-literal.md) to escape blocks of
|
||||||
text eg Javascript or CSS. See also the complementary
|
text eg Javascript or CSS. See also the complementary
|
||||||
[`{$smarty.ldelim}`](#language.variables.smarty.ldelim).
|
[`{$smarty.ldelim}`](../../programmers/api-variables/variable-left-delimiter.md).
|
||||||
|
|
||||||
|
|
||||||
{* this will print literal delimiters out of the template *}
|
|
||||||
|
|
||||||
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{* this will print literal delimiters out of the template *}
|
||||||
|
|
||||||
|
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
||||||
|
```
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```
|
||||||
{funcname} is how functions look in Smarty!
|
{funcname} is how functions look in Smarty!
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Another example with some Javascript
|
Another example with some Javascript
|
||||||
|
|
||||||
|
```smarty
|
||||||
<script language="JavaScript">
|
<script>
|
||||||
function foo() {ldelim}
|
function foo() {ldelim}
|
||||||
... code ...
|
... code ...
|
||||||
{rdelim}
|
{rdelim}
|
||||||
</script>
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
will output
|
will output
|
||||||
|
|
||||||
|
```html
|
||||||
|
<script>
|
||||||
|
function foo() {
|
||||||
|
.... code ...
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
<script language="JavaScript">
|
```smarty
|
||||||
function foo() {
|
<script>
|
||||||
.... code ...
|
function myJsFunction(){ldelim}
|
||||||
}
|
alert("The server name\n{$smarty.server.SERVER_NAME|escape:javascript}\n{$smarty.server.SERVER_ADDR|escape:javascript}");
|
||||||
</script>
|
{rdelim}
|
||||||
|
</script>
|
||||||
|
<a href="javascript:myJsFunction()">Click here for Server Info</a>
|
||||||
|
```
|
||||||
|
|
||||||
|
See also [`{literal}`](./language-function-literal.md) and [escaping Smarty
|
||||||
|
parsing](../language-basic-syntax/language-escaping.md).
|
||||||
|
|
||||||
<script language="JavaScript" type="text/javascript">
|
|
||||||
function myJsFunction(){ldelim}
|
|
||||||
alert("The server name\n{$smarty.server.SERVER_NAME}\n{$smarty.server.SERVER_ADDR}");
|
|
||||||
{rdelim}
|
|
||||||
</script>
|
|
||||||
<a href="javascript:myJsFunction()">Click here for Server Info</a>
|
|
||||||
|
|
||||||
See also [`{literal}`](#language.function.literal) and [escaping Smarty
|
|
||||||
parsing](#language.escaping).
|
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
{literal} {#language.function.literal}
|
# {literal}
|
||||||
=========
|
|
||||||
|
|
||||||
`{literal}` tags allow a block of data to be taken literally. This is
|
`{literal}` tags allow a block of data to be taken literally. This is
|
||||||
typically used around Javascript or stylesheet blocks where {curly
|
typically used around Javascript or stylesheet blocks where {curly
|
||||||
braces} would interfere with the template
|
braces} would interfere with the template
|
||||||
[delimiter](#variable.left.delimiter) syntax. Anything within
|
[delimiter](../../programmers/api-variables/variable-left-delimiter.md) syntax. Anything within
|
||||||
`{literal}{/literal}` tags is not interpreted, but displayed as-is. If
|
`{literal}{/literal}` tags is not interpreted, but displayed as-is. If
|
||||||
you need template tags embedded in a `{literal}` block, consider using
|
you need template tags embedded in a `{literal}` block, consider using
|
||||||
[`{ldelim}{rdelim}`](#language.function.ldelim) to escape the individual
|
[`{ldelim}{rdelim}`](./language-function-ldelim.md) to escape the individual
|
||||||
delimiters instead.
|
delimiters instead.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
@ -17,20 +16,19 @@ delimiters instead.
|
|||||||
> javascript and CSS curly braces are surrounded by whitespace. This is
|
> javascript and CSS curly braces are surrounded by whitespace. This is
|
||||||
> new behavior to Smarty 3.
|
> new behavior to Smarty 3.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
|
// the following braces are ignored by Smarty
|
||||||
|
// since they are surrounded by whitespace
|
||||||
|
function myFoo {
|
||||||
|
alert('Foo!');
|
||||||
|
}
|
||||||
|
// this one will need literal escapement
|
||||||
|
{literal}
|
||||||
|
function myBar {alert('Bar!');}
|
||||||
|
{/literal}
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
<script>
|
See also [`{ldelim} {rdelim}`](./language-function-ldelim.md) and the
|
||||||
// the following braces are ignored by Smarty
|
[escaping Smarty parsing](../language-basic-syntax/language-escaping.md) page.
|
||||||
// since they are surrounded by whitespace
|
|
||||||
function myFoo {
|
|
||||||
alert('Foo!');
|
|
||||||
}
|
|
||||||
// this one will need literal escapement
|
|
||||||
{literal}
|
|
||||||
function myBar {alert('Bar!');}
|
|
||||||
{/literal}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`{ldelim} {rdelim}`](#language.function.ldelim) and the
|
|
||||||
[escaping Smarty parsing](#language.escaping) page.
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
{nocache} {#language.function.nocache}
|
# {nocache}
|
||||||
=========
|
|
||||||
|
|
||||||
`{nocache}` is used to disable caching of a template section. Every
|
`{nocache}` is used to disable caching of a template section. Every
|
||||||
`{nocache}` must be paired with a matching `{/nocache}`.
|
`{nocache}` must be paired with a matching `{/nocache}`.
|
||||||
@ -9,15 +8,13 @@
|
|||||||
> Be sure any variables used within a non-cached section are also
|
> Be sure any variables used within a non-cached section are also
|
||||||
> assigned from PHP when the page is loaded from the cache.
|
> assigned from PHP when the page is loaded from the cache.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
Today's date is
|
||||||
Today's date is
|
{nocache}
|
||||||
{nocache}
|
{$smarty.now|date_format}
|
||||||
{$smarty.now|date_format}
|
{/nocache}
|
||||||
{/nocache}
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The above code will output the current date on a cached page.
|
The above code will output the current date on a cached page.
|
||||||
|
|
||||||
See also the [caching section](#caching).
|
See also the [caching section](../../programmers/caching.md).
|
||||||
|
@ -1,14 +1,13 @@
|
|||||||
{section},{sectionelse} {#language.function.section}
|
# {section}, {sectionelse}
|
||||||
=======================
|
|
||||||
|
|
||||||
A `{section}` is for looping over **sequentially indexed arrays of
|
A `{section}` is for looping over **sequentially indexed arrays of
|
||||||
data**, unlike [`{foreach}`](#language.function.foreach) which is used
|
data**, unlike [`{foreach}`](./language-function-foreach.md) which is used
|
||||||
to loop over a **single associative array**. Every `{section}` tag must
|
to loop over a **single associative array**. Every `{section}` tag must
|
||||||
be paired with a closing `{/section}` tag.
|
be paired with a closing `{/section}` tag.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> The [`{foreach}`](#language.function.foreach) loop can do everything a
|
> The [`{foreach}`](./language-function-foreach.md) loop can do everything a
|
||||||
> {section} loop can do, and has a simpler and easier syntax. It is
|
> {section} loop can do, and has a simpler and easier syntax. It is
|
||||||
> usually preferred over the {section} loop.
|
> usually preferred over the {section} loop.
|
||||||
|
|
||||||
@ -16,22 +15,25 @@ be paired with a closing `{/section}` tag.
|
|||||||
>
|
>
|
||||||
> {section} loops cannot loop over associative arrays, they must be
|
> {section} loops cannot loop over associative arrays, they must be
|
||||||
> numerically indexed, and sequential (0,1,2,\...). For associative
|
> numerically indexed, and sequential (0,1,2,\...). For associative
|
||||||
> arrays, use the [`{foreach}`](#language.function.foreach) loop.
|
> arrays, use the [`{foreach}`](./language-function-foreach.md) loop.
|
||||||
|
|
||||||
Attribute Name Type Required Default Description
|
|
||||||
---------------- --------- ---------- --------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
name string Yes *n/a* The name of the section
|
|
||||||
loop mixed Yes *n/a* Value to determine the number of loop iterations
|
|
||||||
start integer No *0* The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value.
|
|
||||||
step integer No *1* The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0,2,4, etc. If step is negative, it will step through the array backwards.
|
|
||||||
max integer No *n/a* Sets the maximum number of times the section will loop.
|
|
||||||
show boolean No *TRUE* Determines whether or not to show this section
|
|
||||||
|
|
||||||
**Option Flags:**
|
## Attributes
|
||||||
|
|
||||||
Name Description
|
| Attribute Name | Required | Description |
|
||||||
--------- ------------------------------------------
|
|----------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||||
nocache Disables caching of the `{section}` loop
|
| name | Yes | The name of the section |
|
||||||
|
| loop | Yes | Value to determine the number of loop iterations |
|
||||||
|
| start | No | The index position that the section will begin looping. If the value is negative, the start position is calculated from the end of the array. For example, if there are seven values in the loop array and start is -2, the start index is 5. Invalid values (values outside of the length of the loop array) are automatically truncated to the closest valid value. Defaults to 0. |
|
||||||
|
| step | No | The step value that will be used to traverse the loop array. For example, step=2 will loop on index 0, 2, 4, etc. If step is negative, it will step through the array backwards. Defaults to 1. |
|
||||||
|
| max | No | Sets the maximum number of times the section will loop. |
|
||||||
|
| show | No | Determines whether to show this section (defaults to true) |
|
||||||
|
|
||||||
|
## Option Flags
|
||||||
|
|
||||||
|
| Name | Description |
|
||||||
|
|---------|------------------------------------------|
|
||||||
|
| nocache | Disables caching of the `{section}` loop |
|
||||||
|
|
||||||
- Required attributes are `name` and `loop`.
|
- Required attributes are `name` and `loop`.
|
||||||
|
|
||||||
@ -39,7 +41,7 @@ be paired with a closing `{/section}` tag.
|
|||||||
letters, numbers and underscores, like [PHP
|
letters, numbers and underscores, like [PHP
|
||||||
variables](https://www.php.net/language.variables).
|
variables](https://www.php.net/language.variables).
|
||||||
|
|
||||||
- {section}\'s can be nested, and the nested `{section}` names must be
|
- {section}'s can be nested, and the nested `{section}` names must be
|
||||||
unique from each other.
|
unique from each other.
|
||||||
|
|
||||||
- The `loop` attribute, usually an array of values, determines the
|
- The `loop` attribute, usually an array of values, determines the
|
||||||
@ -54,162 +56,156 @@ be paired with a closing `{/section}` tag.
|
|||||||
|
|
||||||
- A `{section}` also has its own variables that handle `{section}`
|
- A `{section}` also has its own variables that handle `{section}`
|
||||||
properties. These properties are accessible as:
|
properties. These properties are accessible as:
|
||||||
[`{$smarty.section.name.property}`](#language.variables.smarty.loops)
|
[`{$smarty.section.name.property}`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops)
|
||||||
where "name" is the attribute `name`.
|
where "name" is the attribute `name`.
|
||||||
|
|
||||||
- `{section}` properties are [`index`](#section.property.index),
|
- `{section}` properties are [`index`](#index),
|
||||||
[`index_prev`](#section.property.index.prev),
|
[`index_prev`](#index_prev),
|
||||||
[`index_next`](#section.property.index.next),
|
[`index_next`](#index_next),
|
||||||
[`iteration`](#section.property.iteration),
|
[`iteration`](#iteration),
|
||||||
[`first`](#section.property.first),
|
[`first`](#first),
|
||||||
[`last`](#section.property.last),
|
[`last`](#last),
|
||||||
[`rownum`](#section.property.rownum),
|
[`rownum`](#rownum),
|
||||||
[`loop`](#section.property.loop), [`show`](#section.property.show),
|
[`loop`](#loop), [`show`](#show),
|
||||||
[`total`](#section.property.total).
|
[`total`](#total).
|
||||||
|
|
||||||
[`assign()`](#api.assign) an array to Smarty
|
[`assign()`](../../programmers/api-functions/api-assign.md) an array to Smarty
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
<?php
|
```php
|
||||||
$data = array(1000,1001,1002);
|
<?php
|
||||||
$smarty->assign('custid',$data);
|
$data = [1000, 1001, 1002];
|
||||||
?>
|
$smarty->assign('custid', $data);
|
||||||
|
```
|
||||||
|
|
||||||
The template that outputs the array
|
The template that outputs the array
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* this example will print out all the values of the $custid array *}
|
{* this example will print out all the values of the $custid array *}
|
||||||
{section name=customer loop=$custid}
|
{section name=customer loop=$custid}
|
||||||
{section customer $custid} {* short-hand *}
|
{section customer $custid} {* short-hand *}
|
||||||
id: {$custid[customer]}<br />
|
id: {$custid[customer]}<br />
|
||||||
{/section}
|
{/section}
|
||||||
<hr />
|
<hr />
|
||||||
{* print out all the values of the $custid array reversed *}
|
{* print out all the values of the $custid array reversed *}
|
||||||
{section name=foo loop=$custid step=-1}
|
{section name=foo loop=$custid step=-1}
|
||||||
{section foo $custid step=-1} {* short-hand *}
|
{section foo $custid step=-1} {* short-hand *}
|
||||||
{$custid[foo]}<br />
|
{$custid[foo]}<br />
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
id: 1000<br />
|
||||||
|
id: 1001<br />
|
||||||
|
id: 1002<br />
|
||||||
|
<hr />
|
||||||
|
id: 1002<br />
|
||||||
|
id: 1001<br />
|
||||||
|
id: 1000<br />
|
||||||
|
```
|
||||||
|
|
||||||
id: 1000<br />
|
```smarty
|
||||||
id: 1001<br />
|
{section name=foo start=10 loop=20 step=2}
|
||||||
id: 1002<br />
|
{$smarty.section.foo.index}
|
||||||
<hr />
|
{/section}
|
||||||
id: 1002<br />
|
<hr />
|
||||||
id: 1001<br />
|
{section name=bar loop=21 max=6 step=-2}
|
||||||
id: 1000<br />
|
{$smarty.section.bar.index}
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
{section name=foo start=10 loop=20 step=2}
|
|
||||||
{$smarty.section.foo.index}
|
|
||||||
{/section}
|
|
||||||
<hr />
|
|
||||||
{section name=bar loop=21 max=6 step=-2}
|
|
||||||
{$smarty.section.bar.index}
|
|
||||||
{/section}
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
10 12 14 16 18
|
10 12 14 16 18
|
||||||
<hr />
|
<hr />
|
||||||
20 18 16 14 12 10
|
20 18 16 14 12 10
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The `name` of the `{section}` can be anything you like, see [PHP
|
The `name` of the `{section}` can be anything you like, see [PHP
|
||||||
variables](https://www.php.net/language.variables). It is used to reference
|
variables](https://www.php.net/language.variables). It is used to reference
|
||||||
the data within the `{section}`.
|
the data within the `{section}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=anything loop=$myArray}
|
{section name=anything loop=$myArray}
|
||||||
{$myArray[anything].foo}
|
{$myArray[anything].foo}
|
||||||
{$name[anything]}
|
{$name[anything]}
|
||||||
{$address[anything].bar}
|
{$address[anything].bar}
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
This is an example of printing an associative array of data with a
|
This is an example of printing an associative array of data with a
|
||||||
`{section}`. Following is the php script to assign the `$contacts` array
|
`{section}`. Following is the php script to assign the `$contacts` array
|
||||||
to Smarty.
|
to Smarty.
|
||||||
|
|
||||||
|
```php
|
||||||
<?php
|
<?php
|
||||||
$data = array(
|
$data = [
|
||||||
array('name' => 'John Smith', 'home' => '555-555-5555',
|
['name' => 'John Smith', 'home' => '555-555-5555',
|
||||||
'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
|
'cell' => '666-555-5555', 'email' => 'john@myexample.com'],
|
||||||
array('name' => 'Jack Jones', 'home' => '777-555-5555',
|
['name' => 'Jack Jones', 'home' => '777-555-5555',
|
||||||
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
|
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'],
|
||||||
array('name' => 'Jane Munson', 'home' => '000-555-5555',
|
['name' => 'Jane Munson', 'home' => '000-555-5555',
|
||||||
'cell' => '123456', 'email' => 'jane@myexample.com')
|
'cell' => '123456', 'email' => 'jane@myexample.com']
|
||||||
);
|
];
|
||||||
$smarty->assign('contacts',$data);
|
$smarty->assign('contacts',$data);
|
||||||
?>
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
The template to output `$contacts`
|
The template to output `$contacts`
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=customer loop=$contacts}
|
{section name=customer loop=$contacts}
|
||||||
<p>
|
<p>
|
||||||
name: {$contacts[customer].name}<br />
|
name: {$contacts[customer].name}<br />
|
||||||
home: {$contacts[customer].home}<br />
|
home: {$contacts[customer].home}<br />
|
||||||
cell: {$contacts[customer].cell}<br />
|
cell: {$contacts[customer].cell}<br />
|
||||||
e-mail: {$contacts[customer].email}
|
e-mail: {$contacts[customer].email}
|
||||||
</p>
|
</p>
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
<p>
|
<p>
|
||||||
name: John Smith<br />
|
name: John Smith<br />
|
||||||
home: 555-555-5555<br />
|
home: 555-555-5555<br />
|
||||||
cell: 666-555-5555<br />
|
cell: 666-555-5555<br />
|
||||||
e-mail: john@myexample.com
|
e-mail: john@myexample.com
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
name: Jack Jones<br />
|
name: Jack Jones<br />
|
||||||
home phone: 777-555-5555<br />
|
home phone: 777-555-5555<br />
|
||||||
cell phone: 888-555-5555<br />
|
cell phone: 888-555-5555<br />
|
||||||
e-mail: jack@myexample.com
|
e-mail: jack@myexample.com
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
name: Jane Munson<br />
|
name: Jane Munson<br />
|
||||||
home phone: 000-555-5555<br />
|
home phone: 000-555-5555<br />
|
||||||
cell phone: 123456<br />
|
cell phone: 123456<br />
|
||||||
e-mail: jane@myexample.com
|
e-mail: jane@myexample.com
|
||||||
</p>
|
</p>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
This example assumes that `$custid`, `$name` and `$address` are all
|
This example assumes that `$custid`, `$name` and `$address` are all
|
||||||
arrays containing the same number of values. First the php script that
|
arrays containing the same number of values. First the php script that
|
||||||
assign\'s the arrays to Smarty.
|
assign's the arrays to Smarty.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
<?php
|
$id = [1001,1002,1003];
|
||||||
|
$smarty->assign('custid',$id);
|
||||||
|
|
||||||
$id = array(1001,1002,1003);
|
$fullnames = ['John Smith','Jack Jones','Jane Munson'];
|
||||||
$smarty->assign('custid',$id);
|
$smarty->assign('name',$fullnames);
|
||||||
|
|
||||||
$fullnames = array('John Smith','Jack Jones','Jane Munson');
|
$addr = ['253 Abbey road', '417 Mulberry ln', '5605 apple st'];
|
||||||
$smarty->assign('name',$fullnames);
|
$smarty->assign('address',$addr);
|
||||||
|
```
|
||||||
$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
|
|
||||||
$smarty->assign('address',$addr);
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
The `loop` variable only determines the number of times to loop. You can
|
The `loop` variable only determines the number of times to loop. You can
|
||||||
access ANY variable from the template within the `{section}`. This is
|
access ANY variable from the template within the `{section}`. This is
|
||||||
@ -217,125 +213,119 @@ useful for looping multiple arrays. You can pass an array which will
|
|||||||
determine the loop count by the array size, or you can pass an integer
|
determine the loop count by the array size, or you can pass an integer
|
||||||
to specify the number of loops.
|
to specify the number of loops.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=customer loop=$custid}
|
{section name=customer loop=$custid}
|
||||||
<p>
|
<p>
|
||||||
id: {$custid[customer]}<br />
|
id: {$custid[customer]}<br />
|
||||||
name: {$name[customer]}<br />
|
name: {$name[customer]}<br />
|
||||||
address: {$address[customer]}
|
address: {$address[customer]}
|
||||||
</p>
|
</p>
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
<p>
|
||||||
|
id: 1000<br />
|
||||||
|
name: John Smith<br />
|
||||||
|
address: 253 Abbey road
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
id: 1001<br />
|
||||||
|
name: Jack Jones<br />
|
||||||
|
address: 417 Mulberry ln
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
id: 1002<br />
|
||||||
|
name: Jane Munson<br />
|
||||||
|
address: 5605 apple st
|
||||||
|
</p>
|
||||||
|
```
|
||||||
|
|
||||||
<p>
|
{section}'s can be nested as deep as you like. With nested
|
||||||
id: 1000<br />
|
{section}'s, you can access complex data structures, such as
|
||||||
name: John Smith<br />
|
multidimensional arrays. This is an example `.php` script that
|
||||||
address: 253 Abbey road
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
id: 1001<br />
|
|
||||||
name: Jack Jones<br />
|
|
||||||
address: 417 Mulberry ln
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
id: 1002<br />
|
|
||||||
name: Jane Munson<br />
|
|
||||||
address: 5605 apple st
|
|
||||||
</p>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{section}\'s can be nested as deep as you like. With nested
|
|
||||||
{section}\'s, you can access complex data structures, such as
|
|
||||||
multi-dimensional arrays. This is an example `.php` script that
|
|
||||||
assigns the arrays.
|
assigns the arrays.
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
<?php
|
$id = [1001,1002,1003];
|
||||||
|
$smarty->assign('custid',$id);
|
||||||
|
|
||||||
$id = array(1001,1002,1003);
|
$fullnames = ['John Smith','Jack Jones','Jane Munson'];
|
||||||
$smarty->assign('custid',$id);
|
$smarty->assign('name',$fullnames);
|
||||||
|
|
||||||
$fullnames = array('John Smith','Jack Jones','Jane Munson');
|
$addr = ['253 N 45th', '417 Mulberry ln', '5605 apple st'];
|
||||||
$smarty->assign('name',$fullnames);
|
$smarty->assign('address',$addr);
|
||||||
|
|
||||||
$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
|
$types = [
|
||||||
$smarty->assign('address',$addr);
|
[ 'home phone', 'cell phone', 'e-mail'],
|
||||||
|
[ 'home phone', 'web'],
|
||||||
|
[ 'cell phone']
|
||||||
|
];
|
||||||
|
$smarty->assign('contact_type', $types);
|
||||||
|
|
||||||
$types = array(
|
$info = [
|
||||||
array( 'home phone', 'cell phone', 'e-mail'),
|
['555-555-5555', '666-555-5555', 'john@myexample.com'],
|
||||||
array( 'home phone', 'web'),
|
[ '123-456-4', 'www.example.com'],
|
||||||
array( 'cell phone')
|
[ '0457878']
|
||||||
);
|
];
|
||||||
$smarty->assign('contact_type', $types);
|
$smarty->assign('contact_info', $info);
|
||||||
|
```
|
||||||
|
|
||||||
$info = array(
|
In this template, *$contact_type\[customer\]* is an array of contact
|
||||||
array('555-555-5555', '666-555-5555', 'john@myexample.com'),
|
|
||||||
array( '123-456-4', 'www.example.com'),
|
|
||||||
array( '0457878')
|
|
||||||
);
|
|
||||||
$smarty->assign('contact_info', $info);
|
|
||||||
|
|
||||||
?>
|
|
||||||
|
|
||||||
|
|
||||||
In this template, *\$contact\_type\[customer\]* is an array of contact
|
|
||||||
types for the current customer.
|
types for the current customer.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=customer loop=$custid}
|
{section name=customer loop=$custid}
|
||||||
<hr>
|
<hr>
|
||||||
id: {$custid[customer]}<br />
|
id: {$custid[customer]}<br />
|
||||||
name: {$name[customer]}<br />
|
name: {$name[customer]}<br />
|
||||||
address: {$address[customer]}<br />
|
address: {$address[customer]}<br />
|
||||||
{section name=contact loop=$contact_type[customer]}
|
{section name=contact loop=$contact_type[customer]}
|
||||||
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
|
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
|
||||||
{/section}
|
{/section}
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
<hr>
|
<hr>
|
||||||
id: 1000<br />
|
id: 1000<br />
|
||||||
name: John Smith<br />
|
name: John Smith<br />
|
||||||
address: 253 N 45th<br />
|
address: 253 N 45th<br />
|
||||||
home phone: 555-555-5555<br />
|
home phone: 555-555-5555<br />
|
||||||
cell phone: 666-555-5555<br />
|
cell phone: 666-555-5555<br />
|
||||||
e-mail: john@myexample.com<br />
|
e-mail: john@myexample.com<br />
|
||||||
<hr>
|
<hr>
|
||||||
id: 1001<br />
|
id: 1001<br />
|
||||||
name: Jack Jones<br />
|
name: Jack Jones<br />
|
||||||
address: 417 Mulberry ln<br />
|
address: 417 Mulberry ln<br />
|
||||||
home phone: 123-456-4<br />
|
home phone: 123-456-4<br />
|
||||||
web: www.example.com<br />
|
web: www.example.com<br />
|
||||||
<hr>
|
<hr>
|
||||||
id: 1002<br />
|
id: 1002<br />
|
||||||
name: Jane Munson<br />
|
name: Jane Munson<br />
|
||||||
address: 5605 apple st<br />
|
address: 5605 apple st<br />
|
||||||
cell phone: 0457878<br />
|
cell phone: 0457878<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Results of a database search (eg ADODB or PEAR) are assigned to Smarty
|
Results of a database search (eg ADODB or PEAR) are assigned to Smarty
|
||||||
|
|
||||||
|
```php
|
||||||
<?php
|
<?php
|
||||||
$sql = 'select id, name, home, cell, email from contacts '
|
$sql = 'select id, name, home, cell, email from contacts '
|
||||||
."where name like '$foo%' ";
|
."where name like '$foo%' ";
|
||||||
$smarty->assign('contacts', $db->getAll($sql));
|
$smarty->assign('contacts', $db->getAll($sql));
|
||||||
?>
|
```
|
||||||
|
|
||||||
The template to output the database result in a HTML table
|
The template to output the database result in a HTML table
|
||||||
|
|
||||||
|
```smarty
|
||||||
<table>
|
<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}
|
{section name=co loop=$contacts}
|
||||||
<tr>
|
<tr>
|
||||||
@ -348,11 +338,10 @@ The template to output the database result in a HTML table
|
|||||||
{sectionelse}
|
{sectionelse}
|
||||||
<tr><td colspan="5">No items found</td></tr>
|
<tr><td colspan="5">No items found</td></tr>
|
||||||
{/section}
|
{/section}
|
||||||
</table>
|
</table>
|
||||||
|
```
|
||||||
.index {#section.property.index}
|
|
||||||
------
|
|
||||||
|
|
||||||
|
## .index
|
||||||
`index` contains the current array index, starting with zero or the
|
`index` contains the current array index, starting with zero or the
|
||||||
`start` attribute if given. It increments by one or by the `step`
|
`start` attribute if given. It increments by one or by the `step`
|
||||||
attribute if given.
|
attribute if given.
|
||||||
@ -360,129 +349,120 @@ attribute if given.
|
|||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> If the `step` and `start` properties are not modified, then this works
|
> If the `step` and `start` properties are not modified, then this works
|
||||||
> the same as the [`iteration`](#section.property.iteration) property,
|
> the same as the [`iteration`](#iteration) property,
|
||||||
> except it starts at zero instead of one.
|
> except it starts at zero instead of one.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> `$custid[customer.index]` and `$custid[customer]` are identical.
|
> `$custid[customer.index]` and `$custid[customer]` are identical.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=customer loop=$custid}
|
{section name=customer loop=$custid}
|
||||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
0 id: 1000<br />
|
0 id: 1000<br />
|
||||||
1 id: 1001<br />
|
1 id: 1001<br />
|
||||||
2 id: 1002<br />
|
2 id: 1002<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## .index_prev
|
||||||
|
|
||||||
.index\_prev {#section.property.index.prev}
|
`index_prev` is the previous loop index. On the first loop, this is set to -1.
|
||||||
------------
|
|
||||||
|
|
||||||
`index_prev` is the previous loop index. On the first loop, this is set
|
## .index_next
|
||||||
to -1.
|
|
||||||
|
|
||||||
.index\_next {#section.property.index.next}
|
|
||||||
------------
|
|
||||||
|
|
||||||
`index_next` is the next loop index. On the last loop, this is still one
|
`index_next` is the next loop index. On the last loop, this is still one
|
||||||
more than the current index, respecting the setting of the `step`
|
more than the current index, respecting the setting of the `step`
|
||||||
attribute, if given.
|
attribute, if given.
|
||||||
|
|
||||||
|
```php
|
||||||
<?php
|
<?php
|
||||||
$data = array(1001,1002,1003,1004,1005);
|
$data = [1001,1002,1003,1004,1005];
|
||||||
$smarty->assign('rows',$data);
|
$smarty->assign('rows',$data);
|
||||||
?>
|
```
|
||||||
|
|
||||||
Template to output the above array in a table
|
Template to output the above array in a table
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* $rows[row.index] and $rows[row] are identical in meaning *}
|
{* $rows[row.index] and $rows[row] are identical in meaning *}
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<th>index</th><th>id</th>
|
<th>index</th><th>id</th>
|
||||||
<th>index_prev</th><th>prev_id</th>
|
<th>index_prev</th><th>prev_id</th>
|
||||||
<th>index_next</th><th>next_id</th>
|
<th>index_next</th><th>next_id</th>
|
||||||
</tr>
|
</tr>
|
||||||
{section name=row loop=$rows}
|
{section name=row loop=$rows}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
|
<td>{$smarty.section.row.index}</td><td>{$rows[row]}</td>
|
||||||
<td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
|
<td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td>
|
||||||
<td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
|
<td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{/section}
|
{/section}
|
||||||
</table>
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output a table containing the following:
|
The above example will output a table containing the following:
|
||||||
|
|
||||||
|
```
|
||||||
index id index_prev prev_id index_next next_id
|
index id index_prev prev_id index_next next_id
|
||||||
0 1001 -1 1 1002
|
0 1001 -1 1 1002
|
||||||
1 1002 0 1001 2 1003
|
1 1002 0 1001 2 1003
|
||||||
2 1003 1 1002 3 1004
|
2 1003 1 1002 3 1004
|
||||||
3 1004 2 1003 4 1005
|
3 1004 2 1003 4 1005
|
||||||
4 1005 3 1004 5
|
4 1005 3 1004 5
|
||||||
|
```
|
||||||
|
|
||||||
|
## .iteration
|
||||||
|
|
||||||
.iteration {#section.property.iteration}
|
|
||||||
----------
|
|
||||||
|
|
||||||
`iteration` contains the current loop iteration and starts at one.
|
`iteration` contains the current loop iteration and starts at one.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> This is not affected by the `{section}` properties `start`, `step` and
|
> This is not affected by the `{section}` properties `start`, `step` and
|
||||||
> `max`, unlike the [`index`](#section.property.index) property.
|
> `max`, unlike the [`index`](#index) property.
|
||||||
> `iteration` also starts with one instead of zero unlike `index`.
|
> `iteration` also starts with one instead of zero unlike `index`.
|
||||||
> [`rownum`](#section.property.rownum) is an alias to `iteration`, they
|
> [`rownum`](#rownum) is an alias to `iteration`, they
|
||||||
> are identical.
|
> are identical.
|
||||||
|
|
||||||
|
```php
|
||||||
<?php
|
<?php
|
||||||
// array of 3000 to 3015
|
// array of 3000 to 3015
|
||||||
$id = range(3000,3015);
|
$id = range(3000,3015);
|
||||||
$smarty->assign('arr',$id);
|
$smarty->assign('arr', $id);
|
||||||
?>
|
```
|
||||||
|
|
||||||
Template to output every other element of the `$arr` array as `step=2`
|
Template to output every other element of the `$arr` array as `step=2`
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=cu loop=$arr start=5 step=2}
|
{section name=cu loop=$arr start=5 step=2}
|
||||||
iteration={$smarty.section.cu.iteration}
|
iteration={$smarty.section.cu.iteration}
|
||||||
index={$smarty.section.cu.index}
|
index={$smarty.section.cu.index}
|
||||||
id={$custid[cu]}<br />
|
id={$custid[cu]}<br />
|
||||||
{/section}
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
iteration=1 index=5 id=3005<br />
|
iteration=1 index=5 id=3005<br />
|
||||||
iteration=2 index=7 id=3007<br />
|
iteration=2 index=7 id=3007<br />
|
||||||
iteration=3 index=9 id=3009<br />
|
iteration=3 index=9 id=3009<br />
|
||||||
iteration=4 index=11 id=3011<br />
|
iteration=4 index=11 id=3011<br />
|
||||||
iteration=5 index=13 id=3013<br />
|
iteration=5 index=13 id=3013<br />
|
||||||
iteration=6 index=15 id=3015<br />
|
iteration=6 index=15 id=3015<br />
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Another example that uses the `iteration` property to output a table
|
Another example that uses the `iteration` property to output a table
|
||||||
header block every five rows.
|
header block every five rows.
|
||||||
|
|
||||||
|
```smarty
|
||||||
<table>
|
<table>
|
||||||
{section name=co loop=$contacts}
|
{section name=co loop=$contacts}
|
||||||
{if $smarty.section.co.iteration is div by 5}
|
{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>
|
||||||
@ -495,150 +475,136 @@ header block every five rows.
|
|||||||
<td>{$contacts[co].email}</td>
|
<td>{$contacts[co].email}</td>
|
||||||
<tr>
|
<tr>
|
||||||
{/section}
|
{/section}
|
||||||
</table>
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
An example that uses the `iteration` property to alternate a text color every
|
||||||
|
|
||||||
An that uses the `iteration` property to alternate a text color every
|
|
||||||
third row.
|
third row.
|
||||||
|
|
||||||
|
```smarty
|
||||||
<table>
|
<table>
|
||||||
{section name=co loop=$contacts}
|
{section name=co loop=$contacts}
|
||||||
{if $smarty.section.co.iteration is even by 3}
|
{if $smarty.section.co.iteration is even by 3}
|
||||||
<span style="color: #ffffff">{$contacts[co].name}</span>
|
<span style="color: #ffffff">{$contacts[co].name}</span>
|
||||||
{else}
|
{else}
|
||||||
<span style="color: #dddddd">{$contacts[co].name}</span>
|
<span style="color: #dddddd">{$contacts[co].name}</span>
|
||||||
{/if}
|
{/if}
|
||||||
{/section}
|
{/section}
|
||||||
</table>
|
</table>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> The *\"is div by\"* syntax is a simpler alternative to the PHP mod
|
> The *"is div by"* syntax is a simpler alternative to the PHP mod
|
||||||
> operator syntax. The mod operator is allowed:
|
> operator syntax. The mod operator is allowed:
|
||||||
> `{if $smarty.section.co.iteration % 5 == 1}` will work just the same.
|
> `{if $smarty.section.co.iteration % 5 == 1}` will work just the same.
|
||||||
|
|
||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> You can also use *\"is odd by\"* to reverse the alternating.
|
> You can also use *"is odd by"* to reverse the alternating.
|
||||||
|
|
||||||
.first {#section.property.first}
|
## .first
|
||||||
------
|
|
||||||
|
|
||||||
`first` is set to TRUE if the current `{section}` iteration is the
|
`first` is set to TRUE if the current `{section}` iteration is the initial one.
|
||||||
initial one.
|
|
||||||
|
|
||||||
.last {#section.property.last}
|
## .last
|
||||||
-----
|
|
||||||
|
|
||||||
`last` is set to TRUE if the current section iteration is the final one.
|
`last` is set to TRUE if the current section iteration is the final one.
|
||||||
|
|
||||||
This example loops the `$customers` array, outputs a header block on the
|
This example loops the `$customers` array, outputs a header block on the
|
||||||
first iteration and on the last outputs the footer block. Also uses the
|
first iteration and on the last outputs the footer block. Also uses the
|
||||||
[`total`](#section.property.total) property.
|
[`total`](#total) property.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$customers}
|
||||||
|
{if $smarty.section.customer.first}
|
||||||
|
<table>
|
||||||
|
<tr><th>id</th><th>customer</th></tr>
|
||||||
|
{/if}
|
||||||
|
|
||||||
{section name=customer loop=$customers}
|
<tr>
|
||||||
{if $smarty.section.customer.first}
|
<td>{$customers[customer].id}}</td>
|
||||||
<table>
|
<td>{$customers[customer].name}</td>
|
||||||
<tr><th>id</th><th>customer</th></tr>
|
</tr>
|
||||||
{/if}
|
|
||||||
|
|
||||||
<tr>
|
{if $smarty.section.customer.last}
|
||||||
<td>{$customers[customer].id}}</td>
|
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
|
||||||
<td>{$customers[customer].name}</td>
|
</table>
|
||||||
</tr>
|
{/if}
|
||||||
|
{/section}
|
||||||
|
```
|
||||||
|
|
||||||
{if $smarty.section.customer.last}
|
## .rownum
|
||||||
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
|
|
||||||
</table>
|
|
||||||
{/if}
|
|
||||||
{/section}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.rownum {#section.property.rownum}
|
|
||||||
-------
|
|
||||||
|
|
||||||
`rownum` contains the current loop iteration, starting with one. It is
|
`rownum` contains the current loop iteration, starting with one. It is
|
||||||
an alias to [`iteration`](#section.property.iteration), they work
|
an alias to [`iteration`](#iteration), they work
|
||||||
identically.
|
identically.
|
||||||
|
|
||||||
.loop {#section.property.loop}
|
## .loop
|
||||||
-----
|
|
||||||
|
|
||||||
`loop` contains the last index number that this {section} looped. This
|
`loop` contains the last index number that this {section} looped. This
|
||||||
can be used inside or after the `{section}`.
|
can be used inside or after the `{section}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{section name=customer loop=$custid}
|
{section name=customer loop=$custid}
|
||||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||||
{/section}
|
{/section}
|
||||||
There are {$smarty.section.customer.loop} customers shown above.
|
There are {$smarty.section.customer.loop} customers shown above.
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
0 id: 1000<br />
|
||||||
|
1 id: 1001<br />
|
||||||
|
2 id: 1002<br />
|
||||||
|
There are 3 customers shown above.
|
||||||
|
```
|
||||||
|
|
||||||
0 id: 1000<br />
|
## .show
|
||||||
1 id: 1001<br />
|
|
||||||
2 id: 1002<br />
|
|
||||||
There are 3 customers shown above.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.show {#section.property.show}
|
|
||||||
-----
|
|
||||||
|
|
||||||
`show` is used as a parameter to section and is a boolean value. If
|
`show` is used as a parameter to section and is a boolean value. If
|
||||||
FALSE, the section will not be displayed. If there is a `{sectionelse}`
|
FALSE, the section will not be displayed. If there is a `{sectionelse}`
|
||||||
present, that will be alternately displayed.
|
present, that will be alternately displayed.
|
||||||
|
|
||||||
Boolean `$show_customer_info` has been passed from the PHP application,
|
Boolean `$show_customer_info` has been passed from the PHP application,
|
||||||
to regulate whether or not this section shows.
|
to regulate whether this section shows.
|
||||||
|
|
||||||
|
|
||||||
{section name=customer loop=$customers show=$show_customer_info}
|
|
||||||
{$smarty.section.customer.rownum} id: {$customers[customer]}<br />
|
|
||||||
{/section}
|
|
||||||
|
|
||||||
{if $smarty.section.customer.show}
|
|
||||||
the section was shown.
|
|
||||||
{else}
|
|
||||||
the section was not shown.
|
|
||||||
{/if}
|
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$customers show=$show_customer_info}
|
||||||
|
{$smarty.section.customer.rownum} id: {$customers[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
|
||||||
|
{if $smarty.section.customer.show}
|
||||||
|
the section was shown.
|
||||||
|
{else}
|
||||||
|
the section was not shown.
|
||||||
|
{/if}
|
||||||
|
```
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
|
1 id: 1000<br />
|
||||||
|
2 id: 1001<br />
|
||||||
|
3 id: 1002<br />
|
||||||
|
|
||||||
1 id: 1000<br />
|
the section was shown.
|
||||||
2 id: 1001<br />
|
```
|
||||||
3 id: 1002<br />
|
|
||||||
|
|
||||||
the section was shown.
|
|
||||||
|
|
||||||
|
|
||||||
|
## .total
|
||||||
.total {#section.property.total}
|
|
||||||
------
|
|
||||||
|
|
||||||
`total` contains the number of iterations that this `{section}` will
|
`total` contains the number of iterations that this `{section}` will
|
||||||
loop. This can be used inside or after a `{section}`.
|
loop. This can be used inside or after a `{section}`.
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
{section name=customer loop=$custid step=2}
|
||||||
|
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||||
|
{/section}
|
||||||
|
There are {$smarty.section.customer.total} customers shown above.
|
||||||
|
```
|
||||||
|
|
||||||
{section name=customer loop=$custid step=2}
|
See also [`{foreach}`](./language-function-foreach.md),
|
||||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
[`{for}`](./language-function-for.md), [`{while}`](./language-function-while.md)
|
||||||
{/section}
|
and [`$smarty.section`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops).
|
||||||
There are {$smarty.section.customer.total} customers shown above.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
See also [`{foreach}`](#language.function.foreach),
|
|
||||||
[`{for}`](#language.function.for), [`{while}`](#language.function.while)
|
|
||||||
and [`$smarty.section`](#language.variables.smarty.loops).
|
|
||||||
|
@ -1,29 +1,35 @@
|
|||||||
{setfilter} {#language.function.setfilter}
|
# {setfilter}
|
||||||
===========
|
|
||||||
|
|
||||||
The `{setfilter}...{/setfilter}` block tag allows the definition of
|
The `{setfilter}...{/setfilter}` block tag allows the definition of
|
||||||
template instance\'s variable filters.
|
template instance's variable filters.
|
||||||
|
|
||||||
SYNTAX: {setfilter filter1\|filter2\|filter3\....}\...{/setfilter}
|
SYNTAX: `{setfilter filter1\|filter2\|filter3\....}\...{/setfilter}`
|
||||||
|
|
||||||
The filter can be:
|
The filter can be:
|
||||||
|
|
||||||
- A variable filter plugin specified by it\'s name.
|
- A variable filter plugin specified by it's name.
|
||||||
|
|
||||||
- A modifier specified by it\'s name and optional additional
|
- A modifier specified by it's name and optional additional
|
||||||
parameter.
|
parameter.
|
||||||
|
|
||||||
`{setfilter}...{/setfilter}` blocks can be nested. The filter definition
|
`{setfilter}...{/setfilter}` blocks can be nested. The filter definition
|
||||||
of inner blocks does replace the definition of the outer block.
|
of inner blocks does replace the definition of the outer block.
|
||||||
|
|
||||||
Template instance filters run in addition to other modifiers and
|
Template instance filters run in addition to other modifiers and
|
||||||
filters. They run in the following order: modifier, default\_modifier,
|
filters. They run in the following order: modifier, default_modifier,
|
||||||
\$escape\_html, registered variable filters, autoloaded variable
|
$escape_html, registered variable filters, autoloaded variable
|
||||||
filters, template instance\'s variable filters. Everything after
|
filters, template instance's variable filters. Everything after
|
||||||
default\_modifier can be disabled with the `nofilter` flag.
|
default_modifier can be disabled with the `nofilter` flag.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> The setting of template instance filters does not affect the output of
|
||||||
|
> included subtemplates.
|
||||||
|
|
||||||
<script>
|
## Examples
|
||||||
|
|
||||||
|
```smarty
|
||||||
|
<script>
|
||||||
{setfilter filter1}
|
{setfilter filter1}
|
||||||
{$foo} {* filter1 runs on output of $foo *}
|
{$foo} {* filter1 runs on output of $foo *}
|
||||||
{setfilter filter2|mod:true}
|
{setfilter filter2|mod:true}
|
||||||
@ -32,11 +38,6 @@ default\_modifier can be disabled with the `nofilter` flag.
|
|||||||
{$buh} {* filter1 runs on output of $buh *}
|
{$buh} {* filter1 runs on output of $buh *}
|
||||||
{/setfilter}
|
{/setfilter}
|
||||||
{$blar} {* no template instance filter runs on output of $blar}
|
{$blar} {* no template instance filter runs on output of $blar}
|
||||||
</script>
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
> **Note**
|
|
||||||
>
|
|
||||||
> The setting of template instance filters does not effect the output of
|
|
||||||
> included subtemplates.
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
{strip} {#language.function.strip}
|
# {strip}
|
||||||
=======
|
|
||||||
|
|
||||||
Many times web designers run into the issue where white space and
|
Many times web designers run into the issue where white space and
|
||||||
carriage returns affect the output of the rendered HTML (browser
|
carriage returns affect the output of the rendered HTML (browser
|
||||||
\"features\"), so you must run all your tags together in the template to
|
"features"), so you must run all your tags together in the template to
|
||||||
get the desired results. This usually ends up in unreadable or
|
get the desired results. This usually ends up in unreadable or
|
||||||
unmanageable templates.
|
unmanageable templates.
|
||||||
|
|
||||||
@ -15,34 +14,32 @@ worry about extra white space causing problems.
|
|||||||
> **Note**
|
> **Note**
|
||||||
>
|
>
|
||||||
> `{strip}{/strip}` does not affect the contents of template variables,
|
> `{strip}{/strip}` does not affect the contents of template variables,
|
||||||
> see the [strip modifier](#language.modifier.strip) instead.
|
> see the [strip modifier](../language-modifiers/language-modifier-strip.md) instead.
|
||||||
|
|
||||||
|
```smarty
|
||||||
{* the following will be all run into one line upon output *}
|
{* the following will be all run into one line upon output *}
|
||||||
{strip}
|
{strip}
|
||||||
<table border='0'>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<a href="{$url}">
|
<a href="#">
|
||||||
<font color="red">This is a test</font>
|
This is a test
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
{/strip}
|
{/strip}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
The above example will output:
|
The above example will output:
|
||||||
|
|
||||||
|
```html
|
||||||
<table border='0'><tr><td><a href="http://. snipped...</a></td></tr></table>
|
<table><tr><td><a href="#">This is a test</a></td></tr></table>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Notice that in the above example, all the lines begin and end with HTML
|
Notice that in the above example, all the lines begin and end with HTML
|
||||||
tags. Be aware that all the lines are run together. If you have plain
|
tags. Be aware that all the lines are run together. If you have plain
|
||||||
text at the beginning or end of any line, they will be run together, and
|
text at the beginning or end of any line, they will be run together, and
|
||||||
may not be desired results.
|
may not be desired results.
|
||||||
|
|
||||||
See also the [`strip`](#language.modifier.strip) modifier.
|
See also the [`strip`](../language-modifiers/language-modifier-strip.md) modifier.
|
||||||
|
@ -1,43 +1,43 @@
|
|||||||
{while} {#language.function.while}
|
# {while}
|
||||||
=======
|
|
||||||
|
|
||||||
`{while}` loops in Smarty have much the same flexibility as PHP
|
`{while}` loops in Smarty have much the same flexibility as PHP
|
||||||
[while](https://www.php.net/while) statements, with a few added features for
|
[while](https://www.php.net/while) statements, with a few added features for
|
||||||
the template engine. Every `{while}` must be paired with a matching
|
the template engine. Every `{while}` must be paired with a matching
|
||||||
`{/while}`. All PHP conditionals and functions are recognized, such as
|
`{/while}`. All PHP conditionals and functions are recognized, such as
|
||||||
*\|\|*, *or*, *&&*, *and*, *is\_array()*, etc.
|
*\|\|*, *or*, *&&*, *and*, *is_array()*, etc.
|
||||||
|
|
||||||
The following is a list of recognized qualifiers, which must be
|
The following is a list of recognized qualifiers, which must be
|
||||||
separated from surrounding elements by spaces. Note that items listed in
|
separated from surrounding elements by spaces. Note that items listed in
|
||||||
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||||
|
|
||||||
Qualifier Alternates Syntax Example Meaning PHP Equivalent
|
## Qualifiers
|
||||||
-------------------- ------------ ------------------------ -------------------------------- ----------------------
|
|
||||||
== eq \$a eq \$b equals ==
|
|
||||||
!= ne, neq \$a neq \$b not equals !=
|
|
||||||
\> gt \$a gt \$b greater than \>
|
|
||||||
\< lt \$a lt \$b less than \<
|
|
||||||
\>= gte, ge \$a ge \$b greater than or equal \>=
|
|
||||||
\<= lte, le \$a le \$b less than or equal \<=
|
|
||||||
=== \$a === 0 check for identity ===
|
|
||||||
! not not \$a negation (unary) !
|
|
||||||
\% mod \$a mod \$b modulous \%
|
|
||||||
is \[not\] div by \$a is not div by 4 divisible by \$a % \$b == 0
|
|
||||||
is \[not\] even \$a is not even \[not\] an even number (unary) \$a % 2 == 0
|
|
||||||
is \[not\] even by \$a is not even by \$b grouping level \[not\] even (\$a / \$b) % 2 == 0
|
|
||||||
is \[not\] odd \$a is not odd \[not\] an odd number (unary) \$a % 2 != 0
|
|
||||||
is \[not\] odd by \$a is not odd by \$b \[not\] an odd grouping (\$a / \$b) % 2 != 0
|
|
||||||
|
|
||||||
|
| Qualifier | Alternates | Syntax Example | Meaning | PHP Equivalent |
|
||||||
|
|--------------------|------------|----------------------|--------------------------------|--------------------|
|
||||||
|
| == | eq | $a eq $b | equals | == |
|
||||||
|
| != | ne, neq | $a neq $b | not equals | != |
|
||||||
|
| > | gt | $a gt $b | greater than | > |
|
||||||
|
| < | lt | $a lt $b | less than | < |
|
||||||
|
| >= | gte, ge | $a ge $b | greater than or equal | >= |
|
||||||
|
| <= | lte, le | $a le $b | less than or equal | <= |
|
||||||
|
| === | | $a === 0 | check for identity | === |
|
||||||
|
| ! | not | not $a | negation (unary) | ! |
|
||||||
|
| % | mod | $a mod $b | modulo | % |
|
||||||
|
| is \[not\] div by | | $a is not div by 4 | divisible by | $a % $b == 0 |
|
||||||
|
| is \[not\] even | | $a is not even | \[not\] an even number (unary) | $a % 2 == 0 |
|
||||||
|
| is \[not\] even by | | $a is not even by $b | grouping level \[not\] even | ($a / $b) % 2 == 0 |
|
||||||
|
| is \[not\] odd | | $a is not odd | \[not\] an odd number (unary) | $a % 2 != 0 |
|
||||||
|
| is \[not\] odd by | | $a is not odd by $b | \[not\] an odd grouping | ($a / $b) % 2 != 0 |
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
```smarty
|
||||||
|
{while $foo > 0}
|
||||||
|
{$foo--}
|
||||||
|
{/while}
|
||||||
|
```
|
||||||
|
|
||||||
{while $foo > 0}
|
The above example will count down the value of $foo until 1 is reached.
|
||||||
{$foo--}
|
|
||||||
{/while}
|
|
||||||
|
|
||||||
|
See also [`{foreach}`](./language-function-foreach.md),
|
||||||
|
[`{for}`](./language-function-for.md) and
|
||||||
The above example will count down the value of \$foo until 1 is reached.
|
[`{section}`](./language-function-section.md).
|
||||||
|
|
||||||
See also [`{foreach}`](#language.function.foreach),
|
|
||||||
[`{for}`](#language.function.for) and
|
|
||||||
[`{section}`](#language.function.section).
|
|
||||||
|
@ -21,7 +21,7 @@ key
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
// add directory where config files are stored
|
// add directory where config files are stored
|
||||||
$smarty->addConigDir('./config_1');
|
$smarty->addConfigDir('./config_1');
|
||||||
|
|
||||||
// add directory where config files are stored and specify array-key
|
// add directory where config files are stored and specify array-key
|
||||||
$smarty->addConfigDir('./config_1', 'one');
|
$smarty->addConfigDir('./config_1', 'one');
|
||||||
|
@ -36,7 +36,7 @@ nav:
|
|||||||
- Attributes: 'designers/language-basic-syntax/language-syntax-attributes.md'
|
- Attributes: 'designers/language-basic-syntax/language-syntax-attributes.md'
|
||||||
- Quotes: 'designers/language-basic-syntax/language-syntax-quotes.md'
|
- Quotes: 'designers/language-basic-syntax/language-syntax-quotes.md'
|
||||||
- Math: 'designers/language-basic-syntax/language-math.md'
|
- Math: 'designers/language-basic-syntax/language-math.md'
|
||||||
- Escaping: 'designers/language-basic-syntax/language-escaping.md'
|
- 'Escaping Smarty Parsing': 'designers/language-basic-syntax/language-escaping.md'
|
||||||
- 'designers/language-variables.md'
|
- 'designers/language-variables.md'
|
||||||
- 'designers/language-modifiers.md'
|
- 'designers/language-modifiers.md'
|
||||||
- 'designers/language-combining-modifiers.md'
|
- 'designers/language-combining-modifiers.md'
|
||||||
|
Reference in New Issue
Block a user