mirror of
https://github.com/smarty-php/smarty.git
synced 2026-08-04 12:34:33 +02:00
Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| dbc86a956a | |||
| 7a58ca2517 | |||
| 9b9660881d | |||
| 052fee3a30 | |||
| 548a67031d | |||
| af54caa65a | |||
| 6c48c44be5 | |||
| 277dfda102 | |||
| 362104ef9f | |||
| 949f3185c4 | |||
| 8fd949ac5d | |||
| a3cbdc46fb | |||
| 1d9cda2be3 | |||
| edfd4c91da | |||
| 4434e128c6 | |||
| 19df91b692 | |||
| e28cb0915b | |||
| fe7817c301 | |||
| 685662466f | |||
| 71d113550c | |||
| 5512d64521 | |||
| 2038890f19 | |||
| e75165565e | |||
| 3d2a8dc5fd | |||
| 2764816407 | |||
| 801d186ea4 | |||
| 09d26579ce | |||
| badcae6e0c | |||
| 694ff1b733 | |||
| 1e0d25638e | |||
| 51ed0d6791 | |||
| c94d3ddafa | |||
| 5fdcb3c6fa | |||
| 5988116c81 | |||
| 73ff8fd3d0 | |||
| d900a0ef4a | |||
| a34ee98e21 | |||
| 4d1cf61bb8 | |||
| c0a6b641bf | |||
| 044647bd71 | |||
| c02e9e135e | |||
| 67ab8f6879 | |||
| 773b3b4b7c | |||
| 613c5d691c | |||
| c016895166 | |||
| f81720941c | |||
| 1ff79c6c38 | |||
| 254b5cabee | |||
| 1b556c7077 | |||
| 4550fc0339 | |||
| 4fc39d59a5 | |||
| 0fb29024e7 |
@@ -25,12 +25,12 @@ jobs:
|
||||
- ubuntu-latest
|
||||
|
||||
php-version:
|
||||
- "7.1"
|
||||
- "7.2"
|
||||
- "7.3"
|
||||
- "7.4"
|
||||
- "8.0"
|
||||
- "8.1"
|
||||
- "8.2"
|
||||
|
||||
compiler:
|
||||
- default
|
||||
@@ -42,10 +42,13 @@ jobs:
|
||||
- os: ubuntu-latest
|
||||
php-version: "8.1"
|
||||
compiler: jit
|
||||
- os: ubuntu-latest
|
||||
php-version: "8.2"
|
||||
compiler: jit
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Override PHP ini values for JIT compiler
|
||||
if: matrix.compiler == 'jit'
|
||||
@@ -59,17 +62,20 @@ jobs:
|
||||
extensions: ${{ env.PHP_EXTENSIONS }}
|
||||
ini-values: ${{ env.PHP_INI_VALUES }}
|
||||
|
||||
- name: Validate composer.json and composer.lock
|
||||
run: composer validate
|
||||
|
||||
- name: Cache Composer packages
|
||||
id: composer-cache
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: vendor
|
||||
key: ${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
|
||||
key: v5r2-${{ runner.os }}-php-${{ matrix.php-version }}-${{ hashFiles('**/composer.lock') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-php-${{ matrix.php-version }}-
|
||||
v5r1-${{ runner.os }}-php-${{ matrix.php-version }}-
|
||||
|
||||
- name: Install dependencies
|
||||
uses: php-actions/composer@v6
|
||||
|
||||
- name: Run make
|
||||
run: make -B
|
||||
|
||||
- name: Run tests with phpunit
|
||||
run: ./run-tests.sh
|
||||
run: php ./vendor/phpunit/phpunit/phpunit
|
||||
|
||||
+1
-5
@@ -1,12 +1,8 @@
|
||||
|
||||
.idea/
|
||||
|
||||
# Smarty
|
||||
lexer/*.php
|
||||
lexer/*.php.bak
|
||||
lexer/*.out
|
||||
/site
|
||||
|
||||
# Dev
|
||||
phpunit*
|
||||
.phpunit.result.cache
|
||||
vendor/*
|
||||
|
||||
+98
-3
@@ -6,9 +6,103 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
### Fixed
|
||||
- Registered output filters wouldn't run [#899](https://github.com/smarty-php/smarty/issues/899)
|
||||
- Use of negative numbers in {math} equations [#895](https://github.com/smarty-php/smarty/issues/895)
|
||||
|
||||
### Removed
|
||||
- Removed `$smarty->registered_filters` array
|
||||
|
||||
## [5.0.0-rc1] - 2023-08-08
|
||||
|
||||
### Added
|
||||
- Added support for PHP8.2
|
||||
- Added a new way to extend Smarty functionality using `Smarty::addExtension()` or `Smarty::setExtensions()`. Please see the docs for more information.
|
||||
- Custom tags can accept positional parameters, so you can write a block compiler that support this: `{trans "Jack" "dull boy"}All work and no play makes %s a %s.{/trans}` [#164](https://github.com/smarty-php/smarty/issues/164)
|
||||
- Full support for ternary operator: `{$test ? $a : $b}` and `{$var ?: $value_if_falsy}` [#881](https://github.com/smarty-php/smarty/issues/881)
|
||||
- Full support for null coalescing operator: `{$var ?? $value_if_null}` [#882](https://github.com/smarty-php/smarty/issues/882)
|
||||
|
||||
### Changed
|
||||
- All Smarty code is now in the \Smarty namespace. For simple use-cases, you only need to add
|
||||
`use \Smarty\Smarty;` to your script and everything will work. If you extend Smarty or use
|
||||
Smarty plug-ins, please review your code to see if they assume specific class or method names.
|
||||
E.g.: `Smarty_Internal_Template` is now `\Smarty\Template\`, `SmartyException` is now `\Smarty\Exception`.
|
||||
- Template variable scope bubbling has been simplified and made more consistent.
|
||||
The global scope now equals the Smarty scope in order to avoid global state side effects. Please read
|
||||
the documentation for more details.
|
||||
- Lexers and Parsers PHP files are reliably generated from sources (.y and .plex) using the make file
|
||||
- Smarty now always runs in multibyte mode, using `symfony/polyfill-mbstring` if required. Please use the
|
||||
multibyte extension for optimal performance.
|
||||
- Smarty no longer calls `mb_internal_encoding()` and doesn't check for deprecated `mbstring.func_overload` ini directive [#480](https://github.com/smarty-php/smarty/issues/480)
|
||||
- Generated `<script>` tags lo longer have deprecated `type="text/javascript"` or `language="Javascript"` attributes [#815](https://github.com/smarty-php/smarty/issues/815)
|
||||
- Smarty will throw a compiler exception insteadd of silently ignoring a modifier on a function call, like this: `{include|dot:"x-template-id" file="included.dot.tpl"}` [#526](https://github.com/smarty-php/smarty/issues/526)
|
||||
- The documentation was largely rewritten
|
||||
|
||||
### Deprecated
|
||||
- `$smarty->getPluginsDir()`
|
||||
- `$smarty->loadFilter()`
|
||||
- `$smarty->setPluginsDir()`
|
||||
- `$smarty->assignGlobal()`
|
||||
- Using `$smarty->registerFilter()` for registering variable filters will trigger a notice.
|
||||
|
||||
### Removed
|
||||
- Dropped support for PHP7.1
|
||||
- Removed `$smarty->left_delimiter` and `$smarty->right_delimiter`, use `$smarty->getLeftDelimiter()`/`$smarty->setLeftDelimiter()` and `$smarty->getRightDelimiter()`/`$smarty->setRightDelimiter()`
|
||||
- Removed support for the `$cache_attrs` parameter for registered plugins
|
||||
- Removed support for undocumented `{make_nocache}` tag
|
||||
- Removed support for deprecated `{insert}` tag, the 'insert' plugin type and the associated $smarty->trusted_dir variable
|
||||
- Removed the undocumented `{block_parent}` and `{parent}` alternatives to `{$smarty.block.parent}`
|
||||
- Removed the undocumented `{block_child}` and `{child}` alternatives to `{$smarty.block.child}`
|
||||
- Removed support for loading config files into a non-local scope using `{config_load}` from a template
|
||||
- Removed `$smarty->autoload_filters` in favor of `$smarty->registerFilter()`
|
||||
- Removed `$smarty->trusted_dir` and `$smarty->allow_php_templates` since support for executing php scripts from templates has been dropped
|
||||
- Removed `$smarty->php_functions` and `$smarty->php_modifiers`.
|
||||
- You can no longer use native PHP-functions or userland functions in your templates without registering them. If you need a function in your templates,
|
||||
register it first.
|
||||
- Removed support for `$smarty->getTags()`
|
||||
- Removed the abandoned `$smarty->direct_access_security` setting
|
||||
- Dropped support for `$smarty->plugins_dir` and `$smarty->use_include_path`. If you must, use `$smarty->addPluginsDir()` instead,
|
||||
but it's better to use Smarty::addExtension() to add an extension or Smarty::registerPlugin to
|
||||
quickly register a plugin using a callback function.
|
||||
- Removed constants such as SMARTY_DIR to prevent global side effects.
|
||||
- Removed direct access to `$smarty->template_dir`. Use `$smarty->setTemplateDir()`.
|
||||
- Removed direct access to `$smarty->cache_dir`. Use `$smarty->setCacheDir()`.
|
||||
- Removed `$smarty->loadPlugin()`, use `$smarty->registerPlugin()` instead.
|
||||
- Removed `$smarty->appendByRef()` and `$smarty->assignByRef()`.
|
||||
- Removed `$smarty->_current_file`
|
||||
- Removed `$smarty->allow_ambiguous_resources` (ambiguous resources handlers should still work)
|
||||
|
||||
### Fixed
|
||||
- `|strip_tags` does not work if the input is 0 [#890](https://github.com/smarty-php/smarty/issues/890)
|
||||
|
||||
## [4.3.2] - 2023-07-19
|
||||
|
||||
### Fixed
|
||||
- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP8 warnings for undefined properties
|
||||
|
||||
## [4.3.1] - 2023-03-28
|
||||
|
||||
### Security
|
||||
- Fixed Cross site scripting vulnerability in Javascript escaping. This addresses CVE-2023-28447.
|
||||
|
||||
### Fixed
|
||||
- `$smarty->muteUndefinedOrNullWarnings()` now also mutes PHP7 notices for undefined array indexes [#736](https://github.com/smarty-php/smarty/issues/736)
|
||||
- `$smarty->muteUndefinedOrNullWarnings()` now treats undefined vars and array access of a null or false variables
|
||||
equivalent across all supported PHP versions
|
||||
- `$smarty->muteUndefinedOrNullWarnings()` now allows dereferencing of non-objects across all supported PHP versions [#831](https://github.com/smarty-php/smarty/issues/831)
|
||||
- PHP 8.1 deprecation warnings on null strings in modifiers [#834](https://github.com/smarty-php/smarty/pull/834)
|
||||
|
||||
## [4.3.0] - 2022-11-22
|
||||
|
||||
### Added
|
||||
- PHP8.2 compatibility [#775](https://github.com/smarty-php/smarty/pull/775)
|
||||
|
||||
### Changed
|
||||
- Include docs and demo in the releases [#799](https://github.com/smarty-php/smarty/issues/799)
|
||||
|
||||
- Using PHP functions as modifiers now triggers a deprecation notice because we will drop support for this in the next major release [#813](https://github.com/smarty-php/smarty/issues/813)
|
||||
- Dropped remaining references to removed PHP-support in Smarty 4 from docs, lexer and security class. [#816](https://github.com/smarty-php/smarty/issues/816)
|
||||
- Support umask when writing (template) files and set dir permissions to 777 [#548](https://github.com/smarty-php/smarty/issues/548) [#819](https://github.com/smarty-php/smarty/issues/819)
|
||||
|
||||
### Fixed
|
||||
- Output buffer is now cleaned for internal PHP errors as well, not just for Exceptions [#514](https://github.com/smarty-php/smarty/issues/514)
|
||||
- Fixed recursion and out of memory errors when caching in complicated template set-ups using inheritance and includes [#801](https://github.com/smarty-php/smarty/pull/801)
|
||||
@@ -17,6 +111,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- Fixed PHP8.1 deprecation notices for strftime [#672](https://github.com/smarty-php/smarty/issues/672)
|
||||
- Fixed PHP8.1 deprecation errors passing null to parameter in trim [#807](https://github.com/smarty-php/smarty/pull/807)
|
||||
- Adapt Smarty upper/lower functions to be codesafe (e.g. for Turkish locale) [#586](https://github.com/smarty-php/smarty/pull/586)
|
||||
- Bug fix for underscore and limited length in template name in custom resources [#581](https://github.com/smarty-php/smarty/pull/581)
|
||||
|
||||
## [4.2.1] - 2022-09-14
|
||||
|
||||
@@ -1761,7 +1856,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
27.09.2011
|
||||
- bugfix possible warning "attempt to modify property of non-object" in {section} (issue #34)
|
||||
- added chaining to Smarty_Internal_Data so $smarty->assign('a',1)->assign('b',2); is possible now
|
||||
- added chaining to \Smarty\Data so $smarty->assign('a',1)->assign('b',2); is possible now
|
||||
- bugfix remove race condition when a custom resource did change timestamp during compilation
|
||||
- bugfix variable property did not work on objects variable in template
|
||||
- bugfix smarty_make_timestamp() failed to process DateTime objects properly
|
||||
@@ -2096,7 +2191,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- optimize smarty_modified_escape for hex, hexentity, decentity.
|
||||
|
||||
28/12/2010
|
||||
- changed $tpl_vars, $config_vars and $parent to belong to Smarty_Internal_Data
|
||||
- changed $tpl_vars, $config_vars and $parent to belong to \Smarty\Data
|
||||
- added Smarty::registerCacheResource() for dynamic cache resource object registration
|
||||
|
||||
27/12/2010
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
all: lexers parsers
|
||||
|
||||
lexers: src/Lexer/ConfigfileLexer.php src/Lexer/TemplateLexer.php
|
||||
parsers: src/Parser/ConfigfileParser.php src/Parser/TemplateParser.php
|
||||
|
||||
docs:
|
||||
mike deploy 5.x
|
||||
|
||||
test-docs:
|
||||
mkdocs serve
|
||||
|
||||
src/Lexer/ConfigfileLexer.php: src/Lexer/ConfigfileLexer.plex
|
||||
php ./utilities/make-lexer.php src/Lexer/ConfigfileLexer.plex src/Lexer/ConfigfileLexer.php
|
||||
|
||||
src/Lexer/TemplateLexer.php: src/Lexer/TemplateLexer.plex
|
||||
php ./utilities/make-lexer.php src/Lexer/TemplateLexer.plex src/Lexer/TemplateLexer.php
|
||||
|
||||
src/Parser/ConfigfileParser.php: src/Parser/ConfigfileParser.y
|
||||
php ./utilities/make-parser.php src/Parser/ConfigfileParser.y src/Parser/ConfigfileParser.php
|
||||
|
||||
src/Parser/TemplateParser.php: src/Parser/TemplateParser.y
|
||||
php ./utilities/make-parser.php src/Parser/TemplateParser.y src/Parser/TemplateParser.php
|
||||
|
||||
clean:
|
||||
rm -f src/Lexer/ConfigfileLexer.php src/Lexer/TemplateLexer.php src/Parser/ConfigfileParser.php src/Parser/TemplateParser.php
|
||||
@@ -7,7 +7,7 @@ Smarty is a template engine for PHP, facilitating the separation of presentation
|
||||
Read the [documentation](https://smarty-php.github.io/smarty/) to find out how to use it.
|
||||
|
||||
## Requirements
|
||||
Smarty can be run with PHP 7.1 to PHP 8.1.
|
||||
Smarty v5 can be run with PHP 7.2 to PHP 8.2.
|
||||
|
||||
## Installation
|
||||
Smarty versions 3.1.11 or later can be installed with [Composer](https://getcomposer.org/).
|
||||
|
||||
+8
-7
@@ -2,18 +2,19 @@
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Smarty currently supports the latest minor version of Smarty 3 and Smarty 4.
|
||||
Smarty currently supports the latest minor version of Smarty 4 and Smarty 5.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 4.0.x | :white_check_mark: |
|
||||
| 3.1.x | :white_check_mark: |
|
||||
| < 3.1 | :x: |
|
||||
|---------|--------------------|
|
||||
| 5.0.x | :white_check_mark: |
|
||||
| 4.3.x | :white_check_mark: |
|
||||
| < 4.3 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
|
||||
disclose your findings publicly and PLEASE PLEASE do not file an Issue.
|
||||
If you have discovered a security issue with Smarty, please contact us at mail [at] simonwisselink.nl. Do not
|
||||
disclose your findings publicly and **PLEASE** do not file an Issue (because that would disclose your findings
|
||||
publicly.)
|
||||
|
||||
We will try to confirm the vulnerability and develop a fix if appropriate. When we release the fix, we will publish
|
||||
a security release. Please let us know if you want to be credited.
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# @TODO
|
||||
|
||||
## CI-building optimization
|
||||
- compiled & cached templates should not contain references to local filesystem paths. Add an optional rootpath param
|
||||
to `(add|set)TemplateDir` or as a separate method. Make it default to `getcwd()`. If a relative path is passed to
|
||||
`(add|set)TemplateDir`, prefix it with the rootpath at runtime, but do not store the path.
|
||||
|
||||
## Review direct variable property access
|
||||
- review ->value{$index} in ForTag
|
||||
|
||||
## include inline
|
||||
- Re-introduce merge_compiled_includes and the {include inline} attribute?
|
||||
|
||||
## Output buffering
|
||||
- Fix ob_ output buffering commands being scattered around the codebase
|
||||
|
||||
## Review public static vars
|
||||
- such as _CHARSET and _IS_WINDOWS
|
||||
|
||||
## Block / inheritance
|
||||
- Consider phasing out $smarty.block.child as this reverses the inheritance hierarchy and might cause infinite loops
|
||||
when combined with $smarty.block.parent
|
||||
|
||||
## Plugin system
|
||||
- fix template security checks in one place in compiler
|
||||
|
||||
## Beatify output
|
||||
- compiled templates could be proper classes, possibly using [nette/php-generator](https://packagist.org/packages/nette/php-generator)
|
||||
|
||||
## Unrelated / other
|
||||
- review (and avoid) use of 'clone' keyword
|
||||
- compiler->has_code seems silly. Why not have proper return values?
|
||||
- what is 'user literal support', why are unit tests skipped?
|
||||
+9
-5
@@ -30,20 +30,24 @@
|
||||
"forum": "https://github.com/smarty-php/smarty/discussions"
|
||||
},
|
||||
"require": {
|
||||
"php": "^7.1 || ^8.0"
|
||||
"php": "^7.2 || ^8.0",
|
||||
"symfony/polyfill-mbstring": "^1.27"
|
||||
},
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"libs/"
|
||||
"psr-4" : {
|
||||
"Smarty\\" : "src/"
|
||||
},
|
||||
"files": [
|
||||
"src/functions.php"
|
||||
]
|
||||
},
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "4.0.x-dev"
|
||||
"dev-master": "5.0.x-dev"
|
||||
}
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^8.5 || ^7.5",
|
||||
"smarty/smarty-lexer": "^3.1"
|
||||
"smarty/smarty-lexer": "^4.0.2"
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -2,11 +2,11 @@
|
||||
/**
|
||||
* Example Application
|
||||
*
|
||||
* @package Example-application
|
||||
|
||||
*/
|
||||
require '../libs/Smarty.class.php';
|
||||
$smarty = new Smarty;
|
||||
//$smarty->force_compile = true;
|
||||
|
||||
$smarty = new \Smarty\Smarty;
|
||||
|
||||
$smarty->debugging = true;
|
||||
$smarty->caching = true;
|
||||
$smarty->cache_lifetime = 120;
|
||||
|
||||
@@ -1,101 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* MySQL Resource
|
||||
* Resource Implementation based on the Custom API to use
|
||||
* MySQL as the storage resource for Smarty's templates and configs.
|
||||
* Table definition:
|
||||
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
||||
* `name` varchar(100) NOT NULL,
|
||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
* `source` text,
|
||||
* PRIMARY KEY (`name`)
|
||||
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
||||
* Demo data:
|
||||
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
||||
* world"}{$x}');</pre>
|
||||
*
|
||||
*
|
||||
* @package Resource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_Resource_Mysql extends Smarty_Resource_Custom
|
||||
{
|
||||
/**
|
||||
* PDO instance
|
||||
*
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* prepared fetch() statement
|
||||
*
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $fetch;
|
||||
|
||||
/**
|
||||
* prepared fetchTimestamp() statement
|
||||
*
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $mtime;
|
||||
|
||||
/**
|
||||
* Smarty_Resource_Mysql constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
$this->mtime = $this->db->prepare('SELECT modified FROM templates WHERE name = :name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a template and its modification time from database
|
||||
*
|
||||
* @param string $name template name
|
||||
* @param string $source template source
|
||||
* @param integer $mtime template modification timestamp (epoch)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch($name, &$source, &$mtime)
|
||||
{
|
||||
$this->fetch->execute(array('name' => $name));
|
||||
$row = $this->fetch->fetch();
|
||||
$this->fetch->closeCursor();
|
||||
if ($row) {
|
||||
$source = $row[ 'source' ];
|
||||
$mtime = strtotime($row[ 'modified' ]);
|
||||
} else {
|
||||
$source = null;
|
||||
$mtime = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a template's modification time from database
|
||||
*
|
||||
* @note implementing this method is optional. Only implement it if modification times can be accessed faster than
|
||||
* loading the comple template source.
|
||||
*
|
||||
* @param string $name template name
|
||||
*
|
||||
* @return integer timestamp (epoch) the template was modified
|
||||
*/
|
||||
protected function fetchTimestamp($name)
|
||||
{
|
||||
$this->mtime->execute(array('name' => $name));
|
||||
$mtime = $this->mtime->fetchColumn();
|
||||
$this->mtime->closeCursor();
|
||||
return strtotime($mtime);
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* MySQL Resource
|
||||
* Resource Implementation based on the Custom API to use
|
||||
* MySQL as the storage resource for Smarty's templates and configs.
|
||||
* Note that this MySQL implementation fetches the source and timestamps in
|
||||
* a single database query, instead of two separate like resource.mysql.php does.
|
||||
* Table definition:
|
||||
* <pre>CREATE TABLE IF NOT EXISTS `templates` (
|
||||
* `name` varchar(100) NOT NULL,
|
||||
* `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
* `source` text,
|
||||
* PRIMARY KEY (`name`)
|
||||
* ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</pre>
|
||||
* Demo data:
|
||||
* <pre>INSERT INTO `templates` (`name`, `modified`, `source`) VALUES ('test.tpl', "2010-12-25 22:00:00", '{$x="hello
|
||||
* world"}{$x}');</pre>
|
||||
*
|
||||
*
|
||||
* @package Resource-examples
|
||||
* @author Rodney Rehm
|
||||
*/
|
||||
class Smarty_Resource_Mysqls extends Smarty_Resource_Custom
|
||||
{
|
||||
/**
|
||||
* PDO instance
|
||||
*
|
||||
* @var \PDO
|
||||
*/
|
||||
protected $db;
|
||||
|
||||
/**
|
||||
* prepared fetch() statement
|
||||
*
|
||||
* @var \PDOStatement
|
||||
*/
|
||||
protected $fetch;
|
||||
|
||||
/**
|
||||
* Smarty_Resource_Mysqls constructor.
|
||||
*
|
||||
* @throws \SmartyException
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
try {
|
||||
$this->db = new PDO("mysql:dbname=test;host=127.0.0.1", "smarty");
|
||||
} catch (PDOException $e) {
|
||||
throw new SmartyException('Mysql Resource failed: ' . $e->getMessage());
|
||||
}
|
||||
$this->fetch = $this->db->prepare('SELECT modified, source FROM templates WHERE name = :name');
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch a template and its modification time from database
|
||||
*
|
||||
* @param string $name template name
|
||||
* @param string $source template source
|
||||
* @param integer $mtime template modification timestamp (epoch)
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function fetch($name, &$source, &$mtime)
|
||||
{
|
||||
$this->fetch->execute(array('name' => $name));
|
||||
$row = $this->fetch->fetch();
|
||||
$this->fetch->closeCursor();
|
||||
if ($row) {
|
||||
$source = $row[ 'source' ];
|
||||
$mtime = strtotime($row[ 'modified' ]);
|
||||
} else {
|
||||
$source = null;
|
||||
$mtime = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -11,8 +11,6 @@
|
||||
|
||||
The current date and time is {$smarty.now|date_format:"%Y-%m-%d %H:%M:%S"}
|
||||
|
||||
The value of global assigned variable $SCRIPT_NAME is {$SCRIPT_NAME}
|
||||
|
||||
Example of accessing server environment variable SERVER_NAME: {$smarty.server.SERVER_NAME}
|
||||
|
||||
The value of {ldelim}$Name{rdelim} is <b>{$Name}</b>
|
||||
|
||||
+6
-7
@@ -3,16 +3,10 @@ services:
|
||||
base:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: ./utilities/testrunners/php71/Dockerfile
|
||||
dockerfile: ./utilities/testrunners/php72/Dockerfile
|
||||
volumes:
|
||||
- .:/app
|
||||
working_dir: /app
|
||||
entrypoint: sh ./run-tests.sh
|
||||
php71:
|
||||
extends:
|
||||
service: base
|
||||
build:
|
||||
dockerfile: ./utilities/testrunners/php71/Dockerfile
|
||||
php72:
|
||||
extends:
|
||||
service: base
|
||||
@@ -38,3 +32,8 @@ services:
|
||||
service: base
|
||||
build:
|
||||
dockerfile: ./utilities/testrunners/php81/Dockerfile
|
||||
php82:
|
||||
extends:
|
||||
service: base
|
||||
build:
|
||||
dockerfile: ./utilities/testrunners/php82/Dockerfile
|
||||
|
||||
@@ -0,0 +1,92 @@
|
||||
# Basics
|
||||
|
||||
## Installation
|
||||
For installation instructies, please see the [getting started section](../getting-started.md).
|
||||
|
||||
## Rendering a template
|
||||
Here's how you create an instance of Smarty in your PHP scripts:
|
||||
```php
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
```
|
||||
|
||||
You now have a Smarty object that you can use to render templates.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->display('string:The current smarty version is: {$smarty.version}.');
|
||||
// or
|
||||
echo $smarty->fetch('string:The current smarty version is: {$smarty.version}.');
|
||||
```
|
||||
|
||||
## Using file-based templates
|
||||
You probably want to manage your templates as files. Create a subdirectory called 'templates' and
|
||||
then configure Smarty to use that:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->setTemplateDir(__DIR__ . '/templates');
|
||||
```
|
||||
|
||||
Say you have a template file called 'version.tpl', stored in the 'templates' directory like this:
|
||||
```smarty
|
||||
<h1>Hi</h1>
|
||||
The current smarty version is: {$smarty.version|escape}.
|
||||
```
|
||||
|
||||
You can now render this, using:
|
||||
```php
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->setTemplateDir(__DIR__ . '/templates');
|
||||
$smarty->display('version.tpl');
|
||||
```
|
||||
|
||||
## Assigning variables
|
||||
|
||||
Templates start to become really useful once you add variables to the mix.
|
||||
|
||||
Create a template called 'footer.tpl' in the 'templates' directory like this:
|
||||
```smarty
|
||||
<small>Copyright {$companyName|escape}</small>
|
||||
```
|
||||
|
||||
Now assign a value to the 'companyName' variable and render your template like this:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require 'vendor/autoload.php';
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->setTemplateDir(__DIR__ . '/templates');
|
||||
$smarty->assign('companyName', 'AC & ME Corp.');
|
||||
$smarty->display('footer.tpl');
|
||||
```
|
||||
|
||||
Run this, and you will see:
|
||||
|
||||
```html
|
||||
<small>Copyright AC & ME Corp.</small>
|
||||
```
|
||||
|
||||
Note how the [escape modifier](../designers/language-modifiers/language-modifier-escape.md)
|
||||
translated the `&` character into the proper HTML syntax `&`.
|
||||
@@ -0,0 +1,184 @@
|
||||
# Caching
|
||||
|
||||
Caching is used to speed up the rendering of a template by saving and re-using the output.
|
||||
|
||||
If a cached version of the call is available, that is displayed instead of
|
||||
regenerating the output. Caching can speed things up tremendously,
|
||||
especially templates with longer computation times.
|
||||
|
||||
Since templates can include or extend other templates, one
|
||||
cache file could conceivably be made up of several template files,
|
||||
config files, etc.
|
||||
|
||||
> ** Note **
|
||||
>
|
||||
> Since templates are dynamic, it is important to be careful what you are
|
||||
> caching and for how long. For instance, if you are displaying the front
|
||||
> page of your website that does not change its content very often, it
|
||||
> might work well to cache this page for an hour or more. On the other
|
||||
> hand, if you are displaying a page with a timetable containing new
|
||||
> information by the minute, it would not make sense to cache this page.
|
||||
|
||||
## Setting Up Caching
|
||||
|
||||
The first thing to do is enable caching by calling `Smarty::setCaching()` with either
|
||||
`\Smarty\Smarty::CACHING_LIFETIME_CURRENT` or `\Smarty\Smarty::CACHING_LIFETIME_SAVED`.
|
||||
Or with `\Smarty\Smarty::CACHING_OFF` to disable caching again.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
// enable caching, using the current lifetime (see below)
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
// enable caching, using the lifetime set when the cache was saved (see below)
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
|
||||
|
||||
// disable caching
|
||||
$smarty->setCaching(Smarty::CACHING_OFF);
|
||||
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
With caching enabled, the function call to `$smarty->display('index.tpl')` will
|
||||
render the template as usual, but also saves a copy of its output. On the
|
||||
next call to `$smarty->display('index.tpl')`, the cached copy will be used
|
||||
instead of rendering the template again.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> By default, Smarty saved its caches as files in a dir called `cache` relative to the current
|
||||
> directory. The default directory can be changed using `$smarty->setCacheDir('/some/cache/dir');`
|
||||
> The files are named similar
|
||||
> to the template name. Although they end in the `.php` extension, they
|
||||
> are not intended to be directly executable. Do not edit these files!
|
||||
|
||||
## Cache lifetime
|
||||
|
||||
Each cached page has a limited lifetime. The default value is 3600
|
||||
seconds, or one hour. After that time expires, the cache is regenerated.
|
||||
|
||||
You can change the lifetime as follows:
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
// or $smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
|
||||
|
||||
// set the cache_lifetime to 5 minutes
|
||||
$smarty->setCacheLifetime(5 * 60);
|
||||
```
|
||||
|
||||
Setting caching to a value of `\Smarty\Smarty::CACHING_LIFETIME_CURRENT` tells Smarty to use
|
||||
the current lifetime to determine if the cache has expired.
|
||||
|
||||
A value of `\Smarty\Smarty::CACHING\_LIFETIME\_SAVED` tells Smarty to use the lifetime value at the time the
|
||||
cache was generated. This way you can set the just before rendering a template to have granular control over
|
||||
when that particular cache expires.
|
||||
|
||||
An example:
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
// retain current cache lifetime for each specific display call
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_SAVED);
|
||||
|
||||
// set the cache_lifetime for index.tpl to 5 minutes
|
||||
$smarty->setCacheLifetime(300);
|
||||
$smarty->display('index.tpl');
|
||||
|
||||
// set the cache_lifetime for home.tpl to 1 hour
|
||||
$smarty->setCacheLifetime(3600);
|
||||
$smarty->display('home.tpl');
|
||||
|
||||
// NOTE: the following $cache_lifetime setting will not work when $caching
|
||||
// is set to Smarty::CACHING_LIFETIME_SAVED.
|
||||
// The cache lifetime for home.tpl has already been set
|
||||
// to 1 hour, and will no longer respect the value of $cache_lifetime.
|
||||
// The home.tpl cache will still expire after 1 hour.
|
||||
$smarty->setCacheLifetime(30); // 30 seconds
|
||||
$smarty->display('home.tpl');
|
||||
```
|
||||
|
||||
## Compile check
|
||||
|
||||
By default, every template file and config file that is involved with the cache file
|
||||
is checked for modification. If any of the files have been modified
|
||||
since the cache was generated, the cache is immediately regenerated.
|
||||
|
||||
This is a computational overhead, so for optimum performance, disable this on a production environment:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
$smarty->setCompileCheck(Smarty::COMPILECHECK_OFF);
|
||||
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
## Checking if a template is cached
|
||||
|
||||
Smarty's `isCached() method can be used to test if a
|
||||
template has a valid cache or not. If you have a cached template that
|
||||
requires something like a database fetch, you can use this to skip that
|
||||
process.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
if (!$smarty->isCached('index.tpl')) {
|
||||
// No cache available, do variable assignments here.
|
||||
$smarty->assign('data', do_expensive_database_calls());
|
||||
}
|
||||
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
## Nocache-blocks
|
||||
You can keep parts of a page dynamic (disable caching) with the
|
||||
[`{nocache}{/nocache}`](../../designers/language-builtin-functions/language-function-nocache.md) block function,
|
||||
or by using the `nocache` parameter for most template functions.
|
||||
|
||||
Let's say the whole page can be cached except for a banner that is
|
||||
displayed down the side of the page. By using a [`{nocache}{/nocache}`](../../designers/language-builtin-functions/language-function-nocache.md)
|
||||
block for the banner, you can
|
||||
keep this element dynamic within the cached content.
|
||||
|
||||
## Clearing the cache
|
||||
You can clear all the cache files with Smarty's `clearAllCache()` method, or individual cache
|
||||
files with the `clearCache()` method.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
// clear only cache for index.tpl
|
||||
$smarty->clearCache('index.tpl');
|
||||
|
||||
// clear out all cache files
|
||||
$smarty->clearAllCache();
|
||||
|
||||
// clear out all cache files older than one hour
|
||||
$smarty->clearAllCache(3600);
|
||||
|
||||
// or, clear all expired caches
|
||||
$smarty->clearAllCache(Smarty::CLEAR_EXPIRED);
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
# Custom cache storage layers
|
||||
|
||||
As an alternative to using the default file-based caching mechanism, you
|
||||
can specify a custom cache implementation that will be used to read,
|
||||
write and clear cached files.
|
||||
|
||||
With a custom cache implementation you could replace the slow filesystem by a
|
||||
faster storage engine, centralize the cache to be accessible to multiple
|
||||
servers.
|
||||
|
||||
Smarty requires implementations to extend `\Smarty\Cacheresource\Base`, but encourages you to either extend
|
||||
`\Smarty\Cacheresource\Custom` or `\Smarty\Cacheresource\KeyValueStore`.
|
||||
|
||||
- `\Smarty\Cacheresource\Custom` is a simple API directing all read, write,
|
||||
clear calls to your implementation. This API allows you to store
|
||||
wherever and however you deem fit.
|
||||
- `\Smarty\Cacheresource\KeyValueStore` allows you to turn any
|
||||
KeyValue-Store (like APC or Memcache) into a full-featured
|
||||
CacheResource implementation. Everything around deep
|
||||
cache-groups like "a|b|c" is being handled for you in a way that
|
||||
guarantees clearing the cache-group "a" will clear all nested groups
|
||||
as well - even though KeyValue-Stores don't allow this kind of
|
||||
hierarchy by nature.
|
||||
|
||||
Custom CacheResources must be registered on
|
||||
runtime with `Smarty\Smarty::setCacheResource()`:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->setCacheResource(new My_CacheResource_Mysql());
|
||||
```
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
# Multiple caches per template
|
||||
|
||||
## Introduction
|
||||
|
||||
You can have multiple cache files for a single call to
|
||||
`display()` or `fetch()`.
|
||||
|
||||
Let's say that
|
||||
a call to `$smarty->display('index.tpl')` may have several different output
|
||||
contents depending on some condition, and you want separate caches for
|
||||
each one. You can do this by passing a `$cache_id` as the second
|
||||
parameter to the function call:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
$my_cache_id = (int) $_GET['article_id'];
|
||||
|
||||
$smarty->display('index.tpl', $my_cache_id);
|
||||
```
|
||||
|
||||
|
||||
Above, we are passing the variable `$my_cache_id` to
|
||||
[`display()`](#api.display) as the `$cache_id`. For each unique value of
|
||||
`$my_cache_id`, a separate cache will be generated for `index.tpl`. In
|
||||
this example, `article_id` was passed in the URL and is used as the
|
||||
`$cache_id`.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Be very cautious when passing values from a client (web browser) into
|
||||
> Smarty or any PHP application. Although the above example of using the
|
||||
> article_id from the URL looks handy, it could have bad consequences.
|
||||
> The `$cache_id` is used to create a directory on the file system, so
|
||||
> if the user decided to write a script that sends random article_id's at a rapid pace,
|
||||
> this could possibly cause problems at the server level.
|
||||
> Be sure to sanitize any data passed in before using it. In this example, you might want to check if
|
||||
> the article_id is a valid ID in the database.
|
||||
|
||||
Be sure to pass the same `$cache_id` as the second parameter to
|
||||
`isCached()` and `clearCache()`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
$my_cache_id = (int) $_GET['article_id'];
|
||||
|
||||
if (!$smarty->isCached('index.tpl', $my_cache_id)) {
|
||||
// ...
|
||||
}
|
||||
|
||||
$smarty->display('index.tpl', $my_cache_id);
|
||||
```
|
||||
|
||||
## Clearing specific caches
|
||||
|
||||
You can clear all caches for a particular `$cache_id` by passing NULL as
|
||||
the first parameter to `clearCache()`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
// clear all caches with "sports" as the $cache_id
|
||||
$smarty->clearCache(null, 'sports');
|
||||
|
||||
$smarty->display('index.tpl', 'sports');
|
||||
```
|
||||
|
||||
In this manner, you can "group" your caches together by giving them the
|
||||
same `$cache_id`.
|
||||
|
||||
## Advanced cache grouping
|
||||
|
||||
You can do more elaborate grouping by setting up `$cache_id` groups.
|
||||
This is accomplished by separating each sub-group with a vertical bar
|
||||
`|` in the `$cache_id` value. You can have as many sub-groups as you
|
||||
like.
|
||||
|
||||
- You can think of cache groups like a directory hierarchy. For
|
||||
instance, a cache group of `'a|b|c'` could be thought of as the
|
||||
directory structure `'/a/b/c/'`.
|
||||
|
||||
- `clearCache(null, 'a|b|c')` would be like removing the files
|
||||
`'/a/b/c/*'`. `clearCache(null, 'a|b')` would be like removing the
|
||||
files `'/a/b/*'`.
|
||||
|
||||
- If you specify a template name such as
|
||||
`clearCache('foo.tpl', 'a|b|c')` then Smarty will attempt to remove
|
||||
`'/a/b/c/foo.tpl'`.
|
||||
|
||||
- You CANNOT remove a specified template name under multiple cache
|
||||
groups such as `'/a/b/*/foo.tpl'`, the cache grouping works
|
||||
left-to-right ONLY. You will need to group your templates under a
|
||||
single cache group hierarchy to be able to clear them as a group.
|
||||
|
||||
Cache grouping should not be confused with your template directory
|
||||
hierarchy, the cache grouping has no knowledge of how your templates are
|
||||
structured. So for example, if you have a template structure like
|
||||
`themes/blue/index.tpl` and you want to be able to clear all the cache
|
||||
files for the "blue" theme, you will need to create a cache group
|
||||
structure that mimics your template file structure, such as
|
||||
`display('themes/blue/index.tpl', 'themes|blue')`, then clear them with
|
||||
`clearCache(null, 'themes|blue')`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty->setCaching(Smarty::CACHING_LIFETIME_CURRENT);
|
||||
|
||||
// clear all caches with 'sports|basketball' as the first two cache_id groups
|
||||
$smarty->clearCache(null, 'sports|basketball');
|
||||
|
||||
// clear all caches with "sports" as the first cache_id group. This would
|
||||
// include "sports|basketball", or "sports|(anything)|(anything)|(anything)|..."
|
||||
$smarty->clearCache(null, 'sports');
|
||||
|
||||
// clear the foo.tpl cache file with "sports|basketball" as the cache_id
|
||||
$smarty->clearCache('foo.tpl', 'sports|basketball');
|
||||
|
||||
$smarty->display('index.tpl', 'sports|basketball');
|
||||
```
|
||||
|
||||
|
||||
@@ -0,0 +1,175 @@
|
||||
# Configuring Smarty
|
||||
|
||||
## Setting the template path
|
||||
By default, Smarty looks for templates to render in `./templates`.
|
||||
|
||||
You can change this, or even use multiple paths to use when looking for templates.
|
||||
|
||||
If you need to change this, you can use `setTemplateDir()` or `addTemplateDir()`.
|
||||
Use `getTemplateDir()` to retrieve the configured paths.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// set a single directory where the config files are stored
|
||||
$smarty->setTemplateDir('./config');
|
||||
|
||||
// set multiple directories where config files are stored
|
||||
$smarty->setTemplateDir(['./config', './config_2', './config_3']);
|
||||
|
||||
// add directory where config files are stored to the current list of dirs
|
||||
$smarty->addTemplateDir('./config_1');
|
||||
|
||||
// add multiple directories to the current list of dirs
|
||||
$smarty->addTemplateDir([
|
||||
'./config_2',
|
||||
'./config_3',
|
||||
]);
|
||||
|
||||
// chaining of method calls
|
||||
$smarty->setTemplateDir('./config')
|
||||
->addTemplateDir('./config_1')
|
||||
->addTemplateDir('./config_2');
|
||||
|
||||
// get all directories where config files are stored
|
||||
$template_dirs = $smarty->getTemplateDir();
|
||||
var_dump($template_dirs); // array
|
||||
|
||||
// get directory identified by key
|
||||
$template_dir = $smarty->getTemplateDir(0);
|
||||
var_dump($template_dir); // string
|
||||
```
|
||||
|
||||
## Setting the path for compiled templates
|
||||
Smarty compiles templates to native PHP to be as fast as possible.
|
||||
The default path where these PHP-files are stored is `./templates_c`.
|
||||
|
||||
If you need to change this, you can use `setCompileDir()`.
|
||||
Use `getCompileDir()` to retrieve the configured path.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// set another path to store compiled templates
|
||||
$smarty->setCompileDir('/data/compiled_templates');
|
||||
|
||||
// get directory where compiled templates are stored
|
||||
$compileDir = $smarty->getCompileDir();
|
||||
```
|
||||
|
||||
|
||||
## Setting the config path
|
||||
Smarty can [load data from config files](./variables/config-files.md).
|
||||
By default, Smarty loads the config files from `./configs`.
|
||||
|
||||
You can change this, or even use multiple paths to use when looking for config files.
|
||||
|
||||
If you need to change this, you can use `setConfigDir()` or `addConfigDir()`.
|
||||
Use `getConfigDir()` to retrieve the configured paths.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// set a single directory where the config files are stored
|
||||
$smarty->setConfigDir('./config');
|
||||
|
||||
// set multiple directories where config files are stored
|
||||
$smarty->setConfigDir(['./config', './config_2', './config_3']);
|
||||
|
||||
// add directory where config files are stored to the current list of dirs
|
||||
$smarty->addConfigDir('./config_1');
|
||||
|
||||
// add multiple directories to the current list of dirs
|
||||
$smarty->addConfigDir([
|
||||
'./config_2',
|
||||
'./config_3',
|
||||
]);
|
||||
|
||||
// chaining of method calls
|
||||
$smarty->setConfigDir('./config')
|
||||
->addConfigDir('./config_1', 'one')
|
||||
->addConfigDir('./config_2', 'two');
|
||||
|
||||
// get all directories where config files are stored
|
||||
$config_dirs = $smarty->getConfigDir();
|
||||
var_dump($config_dirs); // array
|
||||
|
||||
// get directory identified by key
|
||||
$config_dir = $smarty->getConfigDir(0);
|
||||
var_dump($config_dir); // string
|
||||
```
|
||||
|
||||
## Setting the path for caches
|
||||
Even though Smarty runs templates as native PHP for maximum speed, it still needs to
|
||||
execute the PHP code on each call. If your data doesn't change all that often, you
|
||||
may be able to speed up your application even more by using output caching.
|
||||
|
||||
Output caching can be a tricky subject, so we devoted an entire [section to caching](./caching/basics.md).
|
||||
Be sure to read that if you want to use caching.
|
||||
|
||||
By default, Smarty stores caches to PHP-files in a subdirectory named `./cache`.
|
||||
|
||||
If you need to change this, you can use `setCacheDir()`.
|
||||
Use `getCacheDir()` to retrieve the configured path.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// set another path to store caches
|
||||
$smarty->setCacheDir('/data/caches');
|
||||
|
||||
// get directory where cached templates are stored
|
||||
$cacheDir = $smarty->getCacheDir();
|
||||
```
|
||||
|
||||
## Disabling compile check
|
||||
By default, Smarty tests to see if the
|
||||
current template has changed since the last time
|
||||
it was compiled. If it has changed, it recompiles that template.
|
||||
|
||||
Once an application is put into production, this compile-check step
|
||||
is usually no longer needed and the extra checks can significantly hurt performance.
|
||||
Be sure to disable compile checking on production for maximum performance.
|
||||
```php
|
||||
<?php
|
||||
$smarty->setCompileCheck(\Smarty\Smarty::COMPILECHECK_OFF);
|
||||
```
|
||||
|
||||
If [`caching`](./caching/basics.md) is enabled and compile-check is
|
||||
enabled, then the cache files will get regenerated if an involved
|
||||
template file or config file was updated.
|
||||
|
||||
## Charset encoding
|
||||
|
||||
There are a variety of encodings for textual data, ISO-8859-1 (Latin1)
|
||||
and UTF-8 being the most popular. Unless you change `\Smarty\Smarty::$_CHARSET`,
|
||||
Smarty recognizes `UTF-8` as the internal charset.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `ISO-8859-1` has been PHP\'s default internal charset since the
|
||||
> beginning. Unicode has been evolving since 1991. Since then, it has
|
||||
> become the one charset to conquer them all, as it is capable of
|
||||
> encoding most of the known characters even across different character
|
||||
> systems (latin, cyrillic, japanese, ...). `UTF-8` is unicode\'s most
|
||||
> used encoding, as it allows referencing the thousands of character
|
||||
> with the smallest size overhead possible.
|
||||
>
|
||||
> Since unicode and UTF-8 are very widespread nowadays, their use is
|
||||
> strongly encouraged.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Smarty\'s internals and core plugins are truly UTF-8 compatible since
|
||||
> Smarty 3.1.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// use japanese character encoding
|
||||
mb_internal_charset('EUC-JP');
|
||||
|
||||
\Smarty\Smarty::$_CHARSET = 'EUC-JP';
|
||||
$smarty = new \Smarty\Smarty();
|
||||
```
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
# Custom block tags
|
||||
|
||||
Block tags are tags of the form: `{func} .. {/func}`. In other
|
||||
words, they enclose a template block and operate on the contents of this
|
||||
block.
|
||||
|
||||
Block functions take precedence over normal tags of the same name, that is, you
|
||||
cannot have both custom tag `{func}` and block tag `{func}..{/func}`.
|
||||
|
||||
- By default, your function implementation is called twice by Smarty:
|
||||
once for the opening tag, and once for the closing tag. (See
|
||||
`$repeat` below on how to change this.)
|
||||
|
||||
- Only the opening tag of the block has attributes. All attributes are contained in the `$params`
|
||||
variable as an associative array. The opening tag attributes are
|
||||
also accessible to your function when processing the closing tag.
|
||||
|
||||
- The value of the `$content` variable depends on whether your
|
||||
function is called for the opening or closing tag. In case of the
|
||||
opening tag, it will be NULL, and in case of the closing tag it will
|
||||
be the contents of the template block. Note that the template block
|
||||
will have already been processed by Smarty, so all you will receive
|
||||
is the template output, not the template source.
|
||||
|
||||
- The parameter `$repeat` is passed by reference to the function
|
||||
implementation and provides a possibility for it to control how many
|
||||
times the block is displayed. By default `$repeat` is TRUE at the
|
||||
first call of the block function (the opening tag) and FALSE on all
|
||||
subsequent calls to the block function (the block's closing tag).
|
||||
Each time the function implementation returns with `$repeat` being
|
||||
TRUE, the contents between `{func}...{/func}` are evaluated and the
|
||||
function implementation is called again with the new block contents
|
||||
in the parameter `$content`.
|
||||
|
||||
Example:
|
||||
```php
|
||||
<?php
|
||||
|
||||
function smarty_block_translate($params, $content, \Smarty\Template $template, &$repeat) {
|
||||
// only output on the closing tag
|
||||
if (!$repeat){
|
||||
if (isset($content)) {
|
||||
$lang = $params['lang'];
|
||||
// do some intelligent translation thing here with $content
|
||||
return $translation;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$smarty->registerPlugin(Smarty\Smarty::PLUGIN_BLOCK, 'translate', 'smarty_block_translate');
|
||||
```
|
||||
|
||||
This can now be used in your templates as follows:
|
||||
|
||||
```smarty
|
||||
{translate lang='nl'}
|
||||
Quia omnis nulla omnis iusto est id et.
|
||||
{/translate}
|
||||
```
|
||||
@@ -0,0 +1,101 @@
|
||||
# Creating an extension
|
||||
|
||||
## Default extensions
|
||||
|
||||
In order to organize your custom tags and modifiers, you can create an Extension.
|
||||
In fact, most of Smarty itself is organized into two extensions:
|
||||
|
||||
- the core extension, which provides the basic language tags such as `{if}`, `{for}` and `{assign}`.
|
||||
- the default extension, which provides all default modifiers such as `|escape`, `|nl2br` and `|number_format`
|
||||
and tags such as `{html_image}`, `{mailto}` and `{textformat}` that are enabled by default, but not necessarily universal.
|
||||
|
||||
> ** Note **
|
||||
>
|
||||
> There is also the 'BCPluginsAdapter' extension, which does not add any new functionality, but
|
||||
> wraps calls to deprecated methods such as `Smarty\Smarty::addPluginsDir()` and `Smarty\Smarty::loadFilter()`.
|
||||
|
||||
## Writing your own extension
|
||||
|
||||
In order to write your own custom extension, you must write a class that implements `Smarty\Extension\ExtensionInterface`.
|
||||
However, it is usually easier to extend `Smarty\Extension\Base` which provides empty implementation for each of the methods
|
||||
required by `Smarty\Extension\ExtensionInterface`. This allows you to only override the method(s) you need.
|
||||
|
||||
Example:
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Extension\Base;
|
||||
|
||||
class MyExtension extends Base {
|
||||
|
||||
public function getModifierCompiler(string $modifier): ?\Smarty\Compile\Modifier\ModifierCompilerInterface {
|
||||
|
||||
switch ($modifier) {
|
||||
case 'array_escape': return new MyArrayEscapeModifierCompiler();
|
||||
case 'array_unescape': return new MyArrayUnescapeModifierCompiler();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
Another example, that would allow you to use any valid PHP callable as a modifier in your templates:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Extension\Base;
|
||||
|
||||
class MyCallablePassThroughExtension extends Base {
|
||||
|
||||
public function getModifierCallback(string $modifierName) {
|
||||
|
||||
if (is_callable($modifierName)) {
|
||||
return $modifierName;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
Writing an extension allows you to add a group of tags, block tags and modifiers to the Smarty language.
|
||||
It also allows you to register pre-, post- and output-filters in a structured way.
|
||||
The files in `src/Extension/` in the `smarty/smarty` dir should give you all the information you need to start
|
||||
writing your own extension.
|
||||
|
||||
## Registering an extension
|
||||
|
||||
When you have written your extension, add it to a Smarty instance as follows:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->addExtension(new MyCustomExtension());
|
||||
```
|
||||
|
||||
This will add `MyCustomExtension` to the end of the extension list, meaning that you cannot override tags or modifiers
|
||||
from one of Smarty's default extensions.
|
||||
|
||||
Should you wish to insert your extension at the top of the extension list, or create a very limited Smarty version that
|
||||
only contains the core extension, you can use `Smarty\Smarty::setExtensions()` to override the list of extensions.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->setExtensions([
|
||||
new Smarty\Extension\CoreExtension(),
|
||||
new MyCustomExtension(),
|
||||
new Smarty\Extension\DefaultExtension(),
|
||||
]);
|
||||
```
|
||||
@@ -0,0 +1,10 @@
|
||||
# Extending Smarty
|
||||
|
||||
By default, Smarty is already very complete and powerful. However, you can unlock its real potential by
|
||||
extending Smarty.
|
||||
|
||||
There are various ways to extend Smarty for it to suit your needs. You can create custom
|
||||
[tags](tags.md), [block tags](block-tags.md) and [modifiers](modifiers.md) by registering a method as a plugin.
|
||||
|
||||
If this becomes too messy, you can group your custom tags, modifiers, and more into an [Extension](extensions.md).
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
# Custom modifiers
|
||||
|
||||
Modifiers are little functions that are applied
|
||||
to a variable in the template before it is displayed or used in some
|
||||
other context. Smarty comes with a bunch of [modifiers](../../designers/language-modifiers/index.md), but you can
|
||||
easily add your own.
|
||||
|
||||
In order to do so, you must write a function that accepts as its first parameter the value on which the
|
||||
modifier is to operate. The rest of the parameters are optional, depending on what kind of operation is to be performed.
|
||||
|
||||
The modifier has to return the result of its processing.
|
||||
|
||||
For example:
|
||||
```php
|
||||
<?php
|
||||
|
||||
function smarty_modifier_substr($string, $offset, $length) {
|
||||
return substr($string, $offset, $length);
|
||||
}
|
||||
|
||||
$smarty->registerPlugin(Smarty\Smarty::PLUGIN_MODIFIER, 'substr', 'smarty_modifier_substr');
|
||||
```
|
||||
|
||||
You can now use this in your templates as follows:
|
||||
```smarty
|
||||
{$applicationName|substr:0:20}
|
||||
```
|
||||
@@ -0,0 +1,84 @@
|
||||
# Custom tags
|
||||
|
||||
You can add your own tags to the Smarty language.
|
||||
|
||||
## Runtime tags
|
||||
|
||||
Usually, you'll add a runtime tag. Adding a runtime tag requires you to provide a callback function that accepts
|
||||
two parameters:
|
||||
|
||||
- `$params`: all attributes from the template as an associative array.
|
||||
- `$template`: a `Smarty\Template` object representing the template where tag was used.
|
||||
|
||||
The output (return value) of the function will be substituted in place
|
||||
of the tag in the template.
|
||||
|
||||
If the function needs to assign some variables to the template or use
|
||||
some other Smarty-provided functionality, it can use the supplied
|
||||
`$template` object to do so.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
function smarty_tag_eightball($params, \Smarty\Template $template): string {
|
||||
$answers = [
|
||||
'Yes',
|
||||
'No',
|
||||
'No way',
|
||||
'Outlook not so good',
|
||||
'Ask again soon',
|
||||
'Maybe in your reality'
|
||||
];
|
||||
|
||||
$result = array_rand($answers);
|
||||
return $answers[$result];
|
||||
}
|
||||
|
||||
$smarty->registerPlugin(Smarty\Smarty::PLUGIN_FUNCTION, 'eightball', 'smarty_tag_eightball');
|
||||
```
|
||||
|
||||
Which can now be used in the template as:
|
||||
|
||||
```smarty
|
||||
Question: Will we ever have time travel?
|
||||
Answer: {eightball}.
|
||||
```
|
||||
|
||||
## Compiler tags
|
||||
|
||||
Compiler tags are called only during compilation of the template.
|
||||
|
||||
They are useful for injecting PHP code or time-sensitive static content
|
||||
into the template. If there is both a compiler function and a runtime tag registered under the same name,
|
||||
the compiler function has precedence.
|
||||
|
||||
The compiler function is passed two parameters: the params array which
|
||||
contains precompiled strings for the attribute values and the Smarty
|
||||
object. It's supposed to return the code to be injected into the
|
||||
compiled template including the surrounding PHP tags.
|
||||
|
||||
Example:
|
||||
```php
|
||||
<?php
|
||||
|
||||
function smarty_compiler_tplheader($params, Smarty $smarty) {
|
||||
return "<?php\necho '" . $smarty->_current_file . " compiled at " . date('Y-m-d H:M'). "';\n?>";
|
||||
}
|
||||
|
||||
$smarty->registerPlugin(Smarty\Smarty::PLUGIN_COMPILER, 'tplheader', 'smarty_compiler_tplheader');
|
||||
```
|
||||
|
||||
This function can be called from the template as:
|
||||
|
||||
```smarty
|
||||
{* this function gets executed at compile time only *}
|
||||
{tplheader}
|
||||
```
|
||||
|
||||
The resulting PHP code in the compiled template would be something like
|
||||
this:
|
||||
|
||||
```php
|
||||
<?php
|
||||
echo 'index.tpl compiled at 2023-02-20 20:02';
|
||||
```
|
||||
@@ -0,0 +1,35 @@
|
||||
# Output filters
|
||||
|
||||
When a template is rendered, its output can be sent through one or more
|
||||
output filters.
|
||||
|
||||
> **Note**
|
||||
> This differs from [`prefilters`](prefilters.md) and
|
||||
> [`postfilters`](postfilters.md) because, pre- and postfilters
|
||||
> operate on compiled templates before they are saved to the disk, whereas
|
||||
> output filters operate on the template output when it is executed.
|
||||
|
||||
Smarty will pass the template output as the first argument, and expect the function
|
||||
to return the result of the processing.
|
||||
|
||||
Output filters can be either added as part of an [Extension](../extending/extensions.md) or
|
||||
registered as shown below.
|
||||
|
||||
This will provide a rudimentary protection against spambots:
|
||||
```php
|
||||
<?php
|
||||
|
||||
function protect_email($tpl_output, \Smarty\Template\ $template)
|
||||
{
|
||||
return preg_replace(
|
||||
'!(\S+)@([a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,3}|[0-9]{1,3}))!',
|
||||
'$1%40$2',
|
||||
$tpl_output
|
||||
);
|
||||
}
|
||||
|
||||
// register the outputfilter
|
||||
$smarty->registerFilter("output", "protect_email");
|
||||
$smarty->display("index.tpl');
|
||||
|
||||
```
|
||||
@@ -0,0 +1,33 @@
|
||||
# Postfilters
|
||||
|
||||
Template postfilters are PHP functions that your templates are ran
|
||||
through *after they are compiled*.
|
||||
|
||||
Smarty will
|
||||
pass the compiled template code as the first argument, and expect the
|
||||
function to return the result of the processing, which must also be valid PHP code.
|
||||
|
||||
Prefilters can be either added as part of an [Extension](../extending/extensions.md) or
|
||||
registered as shown below.
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
function add_header_comment($tpl_source, \Smarty\Template\ $template)
|
||||
{
|
||||
return "<?php echo \"<!-- Created by Smarty! -->\n\"; ?>\n".$tpl_source;
|
||||
}
|
||||
|
||||
// register the postfilter
|
||||
$smarty->registerFilter('post', 'add_header_comment');
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
The postfilter above will make the compiled Smarty template `index.tpl`
|
||||
look like:
|
||||
|
||||
```smarty
|
||||
<!-- Created by Smarty! -->
|
||||
{* rest of template content... *}
|
||||
```
|
||||
@@ -0,0 +1,26 @@
|
||||
# Prefilters
|
||||
|
||||
Template prefilters are PHP functions that your templates are ran
|
||||
through *before they are compiled*. This is good for preprocessing your
|
||||
templates to remove unwanted comments, keeping an eye on what people are
|
||||
putting in their templates, etc.
|
||||
|
||||
Smarty will pass the template source code as the first argument, and
|
||||
expect the function to return the resulting template source code.
|
||||
|
||||
Prefilters can be either added as part of an [Extension](../extending/extensions.md) or
|
||||
registered as shown below.
|
||||
|
||||
This will remove all the html comments in the template source:
|
||||
```php
|
||||
<?php
|
||||
|
||||
function remove_dw_comments($tpl_source, \Smarty\Template\ $template)
|
||||
{
|
||||
return preg_replace("/<!--#.*-->/U",'',$tpl_source);
|
||||
}
|
||||
|
||||
// register the prefilter
|
||||
$smarty->registerFilter('pre', 'remove_dw_comments');
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
@@ -0,0 +1,130 @@
|
||||
# Template Inheritance
|
||||
|
||||
Inheritance allows you to define base templates that can
|
||||
be extended by child templates. Extending means that the child template
|
||||
can override all or some of the named block areas in the base template.
|
||||
|
||||
When you render the child template, the result will as if you rendered
|
||||
the base template, with only the block(s) that you have overridden in the
|
||||
child templates differing.
|
||||
|
||||
- The inheritance tree can be as deep as you want, meaning you can
|
||||
extend a file that extends another one that extends another one and
|
||||
so on.
|
||||
|
||||
- The child templates can not define any content besides what's
|
||||
inside [`{block}`](../designers/language-builtin-functions/language-function-block.md) tags they override.
|
||||
Anything outside of [`{block}`](../designers/language-builtin-functions/language-function-block.md) tags will
|
||||
be removed.
|
||||
|
||||
- Template inheritance is a compile time process which creates a
|
||||
single compiled template file. Compared to corresponding solutions
|
||||
based on subtemplates included with the
|
||||
[`{include}`](../designers/language-builtin-functions/language-function-include.md) tag it does have much
|
||||
better performance when rendering.
|
||||
|
||||
## Basic inheritance
|
||||
|
||||
First, create a base template with one or more [blocks](../designers/language-builtin-functions/language-function-block.md).
|
||||
Then, create a child template. The child template
|
||||
must have an [{extends} tag](../designers/language-builtin-functions/language-function-extends.md) on its first line.
|
||||
|
||||
The child template can redefine one or more blocks defined in the base template.
|
||||
|
||||
See below for a simple example.
|
||||
|
||||
layout.tpl (base)
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name=title}Default Page Title{/block}</title>
|
||||
{block name=head}{/block}
|
||||
</head>
|
||||
<body>
|
||||
{block name=body}{/block}
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
|
||||
myproject.tpl (child)
|
||||
|
||||
```smarty
|
||||
{extends file='layout.tpl'}
|
||||
{block name=head}
|
||||
<link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="/js/mypage.js"></script>
|
||||
{/block}
|
||||
```
|
||||
|
||||
mypage.tpl (grandchild)
|
||||
|
||||
```smarty
|
||||
{extends file='myproject.tpl'}
|
||||
{block name=title}My Page Title{/block}
|
||||
{block name=head}
|
||||
<link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="/js/mypage.js"></script>
|
||||
{/block}
|
||||
{block name=body}My HTML Page Body goes here{/block}
|
||||
```
|
||||
|
||||
|
||||
To render the above, you would use:
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->display('mypage.tpl');
|
||||
```
|
||||
|
||||
The resulting output is:
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>My Page Title</title>
|
||||
<link href="/css/mypage.css" rel="stylesheet" type="text/css"/>
|
||||
<script src="/js/mypage.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
My HTML Page Body goes here
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> When [compile-check](./configuring.md#disabling-compile-check) is enabled, all files
|
||||
> in the inheritance tree
|
||||
> are checked for modifications upon each invocation. You may want to
|
||||
> disable compile-check on production servers for this reason.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> If you have a subtemplate which is included with
|
||||
> [`{include}`](../designers/language-builtin-functions/language-function-include.md) and it contains
|
||||
> [`{block}`](../designers/language-builtin-functions/language-function-block.md) areas it works only if the
|
||||
> [`{include}`](../designers/language-builtin-functions/language-function-include.md) itself is called from within
|
||||
> a surrounding [`{block}`](../designers/language-builtin-functions/language-function-block.md). In the final
|
||||
> parent template you may need a dummy
|
||||
> [`{block}`](../designers/language-builtin-functions/language-function-block.md) for it.
|
||||
|
||||
|
||||
## Using append and prepend
|
||||
The content of [`{block}`](../designers/language-builtin-functions/language-function-block.md) tags from child
|
||||
and parent templates can be merged by the `append` or `prepend`
|
||||
[`{block}`](../designers/language-builtin-functions/language-function-block.md) tag option flags and
|
||||
`{$smarty.block.parent}` or `{$smarty.block.child}` placeholders.
|
||||
|
||||
## Extends resource type
|
||||
Instead of using [`{extends}`](../designers/language-builtin-functions/language-function-extends.md) tags in the
|
||||
template files you can define the inheritance tree in your PHP script by
|
||||
using the [`extends:` resource](resources.md#the-extends-resource) type.
|
||||
|
||||
The code below will return same result as the example above.
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->display('extends:layout.tpl|myproject.tpl|mypage.tpl');
|
||||
```
|
||||
@@ -0,0 +1,86 @@
|
||||
# Rendering templates
|
||||
|
||||
## Fetching or rendering templates directly
|
||||
As explained in [basics](basics.md), you can use `$smarty->fetch()` or `$smarty->display()`
|
||||
to render a template directly.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->display('homepage.tpl');
|
||||
|
||||
// or
|
||||
|
||||
$output = $smarty->fetch('homepage.tpl');
|
||||
```
|
||||
|
||||
When you use `display()`, Smarty renders the template to the standard output stream.
|
||||
`fetch()` returns the output instead of echoing it.
|
||||
|
||||
The example above uses simple filenames to load the template. Smarty also supports
|
||||
[loading templates from resources](resources.md).
|
||||
|
||||
## Creating a template object
|
||||
You can also create a template object which later can be prepared first,
|
||||
and rendered later. This can be useful, for example if you plan to re-use several
|
||||
templates.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
// create template object with its private variable scope
|
||||
$tpl = $smarty->createTemplate('index.tpl');
|
||||
|
||||
// assign a variable (available only to this template)
|
||||
$tpl->assign('title', 'My Homepage!');
|
||||
|
||||
// display the template
|
||||
$tpl->display();
|
||||
```
|
||||
|
||||
More on assigning variables in [using data in templates](variables/assigning.md).
|
||||
|
||||
|
||||
## Testing if a template exists
|
||||
You can use `templateExists()` to check whether a template exists before you attempt to use it.
|
||||
|
||||
It accepts either a path to the template on the filesystem or a
|
||||
resource string specifying the template.
|
||||
|
||||
This example uses `$_GET['page']` to
|
||||
[`{include}`](../designers/language-builtin-functions/language-function-include.md) a content template. If the
|
||||
template does not exist then an error page is displayed instead. First,
|
||||
the `page_container.tpl`
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title|escape}</title>
|
||||
</head>
|
||||
<body>
|
||||
{* include middle content page *}
|
||||
{include file=$content_template}
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
And the php script:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// set the filename eg index.inc.tpl
|
||||
$mid_template = $_GET['page'].'.inc.tpl';
|
||||
|
||||
if (!$smarty->templateExists($mid_template)){
|
||||
$mid_template = 'page_not_found.tpl';
|
||||
}
|
||||
$smarty->assign('content_template', $mid_template);
|
||||
|
||||
$smarty->display('page_container.tpl');
|
||||
```
|
||||
@@ -0,0 +1,322 @@
|
||||
# Template resources
|
||||
|
||||
## The filesystem resource
|
||||
|
||||
So far in our examples, we have used simple filenames or paths when loading a template.
|
||||
|
||||
For example, to load a template file called `homepage.tpl`, from the filesystem, you could write:
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->display('homepage.tpl');
|
||||
```
|
||||
|
||||
The filesystem is the default resource. Templates, however, may come
|
||||
from a variety of sources. When you render a template, or
|
||||
when you include a template from within another template, you supply a
|
||||
resource type, followed by `:` and the appropriate path and template name.
|
||||
|
||||
If a resource is not explicitly given, the default resource type is assumed.
|
||||
The resource type for the filesystem is `file`, which means that the previous example
|
||||
can be rewritten as follows:
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->display('file:homepage.tpl');
|
||||
```
|
||||
|
||||
The file resource pulls templates source files from the directories
|
||||
specified using `Smarty::setTemplateDir()` (see [Configuring Smarty](configuring.md)).
|
||||
|
||||
`setTemplateDir` accepts a single path, but can also ben called with an array of paths.
|
||||
In that case, the list of directories is traversed in the order they appear in the array. The
|
||||
first template found is the one to process.
|
||||
|
||||
### Templates from a specific directory
|
||||
|
||||
Smarty 3.1 introduced the bracket-syntax for specifying an element from
|
||||
`Smarty::setTemplateDir()`. This allows websites
|
||||
employing multiple sets of templates better control over which template
|
||||
to access.
|
||||
|
||||
The bracket-syntax can be used as follows:
|
||||
```php
|
||||
<?php
|
||||
|
||||
// setup template directories
|
||||
$smarty->setTemplateDir([
|
||||
'./templates', // element: 0, index: 0
|
||||
'./templates_2', // element: 1, index: 1
|
||||
'10' => 'templates_10', // element: 2, index: '10'
|
||||
'foo' => 'templates_foo', // element: 3, index: 'foo'
|
||||
]);
|
||||
|
||||
/*
|
||||
assume the template structure
|
||||
./templates/foo.tpl
|
||||
./templates_2/foo.tpl
|
||||
./templates_2/bar.tpl
|
||||
./templates_10/foo.tpl
|
||||
./templates_10/bar.tpl
|
||||
./templates_foo/foo.tpl
|
||||
*/
|
||||
|
||||
// regular access
|
||||
$smarty->display('file:foo.tpl');
|
||||
// will load ./templates/foo.tpl
|
||||
|
||||
// using numeric index
|
||||
$smarty->display('file:[1]foo.tpl');
|
||||
// will load ./templates_2/foo.tpl
|
||||
|
||||
// using numeric string index
|
||||
$smarty->display('file:[10]foo.tpl');
|
||||
// will load ./templates_10/foo.tpl
|
||||
|
||||
// using string index
|
||||
$smarty->display('file:[foo]foo.tpl');
|
||||
// will load ./templates_foo/foo.tpl
|
||||
|
||||
// using "unknown" numeric index (using element number)
|
||||
$smarty->display('file:[2]foo.tpl');
|
||||
// will load ./templates_10/foo.tpl
|
||||
```
|
||||
|
||||
And, from within a Smarty template:
|
||||
|
||||
```smarty
|
||||
{include file="file:foo.tpl"}
|
||||
{* will load ./templates/foo.tpl *}
|
||||
|
||||
{include file="file:[1]foo.tpl"}
|
||||
{* will load ./templates_2/foo.tpl *}
|
||||
|
||||
{include file="file:[foo]foo.tpl"}
|
||||
{* will load ./templates_foo/foo.tpl *}
|
||||
```
|
||||
|
||||
### Using absolute paths
|
||||
|
||||
Templates outside the specified template directories
|
||||
require the `file:` template resource type, followed by the absolute
|
||||
path to the template (with leading slash).
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->display('file:/export/templates/index.tpl');
|
||||
$smarty->display('file:/path/to/my/templates/menu.tpl');
|
||||
````
|
||||
|
||||
And from within a Smarty template:
|
||||
```smarty
|
||||
{include file='file:/usr/local/share/templates/navigation.tpl'}
|
||||
```
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> With [`Security`](security.md) enabled, access to
|
||||
> templates outside of the specified templates directories is
|
||||
> not allowed unless you whitelist those directories.
|
||||
|
||||
### Windows file paths
|
||||
If you are running on Windows, file paths usually include a drive
|
||||
letter (such as `C:`) at the beginning of the pathname. Be sure to use `file:` in
|
||||
the path to avoid namespace conflicts and get the desired results.
|
||||
```php
|
||||
<?php
|
||||
$smarty->display('file:C:/export/templates/index.tpl');
|
||||
$smarty->display('file:F:/path/to/my/templates/menu.tpl');
|
||||
```
|
||||
|
||||
And from within Smarty template:
|
||||
```smarty
|
||||
{include file='file:D:/usr/local/share/templates/navigation.tpl'}
|
||||
```
|
||||
|
||||
### Handling missing templates
|
||||
If the file resource cannot find the requested template, it will check if there is
|
||||
a default template handler to call. By default, there is none, and Smarty will return an error,
|
||||
but you can register a default template handler calling `Smarty::registerDefaultTemplateHandler`
|
||||
with any [callable](https://www.php.net/manual/en/language.types.callable.php).
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->registerDefaultTemplateHandler([$this, 'handleMissingTemplate']);
|
||||
|
||||
// ...
|
||||
|
||||
public function handleMissingTemplate($type, $name, &$content, &$modified, Smarty $smarty) {
|
||||
if (/* ... */) {
|
||||
// return corrected filepath
|
||||
return "/tmp/some/foobar.tpl";
|
||||
} elseif (/* ... */) {
|
||||
// return a template directly
|
||||
$content = "the template source";
|
||||
$modified = time();
|
||||
return true;
|
||||
} else {
|
||||
// tell smarty that we failed
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## The string and eval resources
|
||||
|
||||
Smarty can render templates from a string by using the `string:` or
|
||||
`eval:` resource.
|
||||
|
||||
- The `string:` resource behaves much the same as a template file. The
|
||||
template source is compiled from a string and stores the compiled
|
||||
template code for later reuse. Each unique template string will
|
||||
create a new compiled template file. If your template strings are
|
||||
accessed frequently, this is a good choice. If you have frequently
|
||||
changing template strings (or strings with low reuse value), the
|
||||
`eval:` resource may be a better choice, as it doesn\'t save
|
||||
compiled templates to disk.
|
||||
|
||||
- The `eval:` resource evaluates the template source every time a page
|
||||
is rendered. This is a good choice for strings with low reuse value.
|
||||
If the same string is accessed frequently, the `string:` resource
|
||||
may be a better choice.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> With a `string:` resource type, each unique string generates a
|
||||
> compiled file. Smarty cannot detect a string that has changed, and
|
||||
> therefore will generate a new compiled file for each unique string. It
|
||||
> is important to choose the correct resource so that you do not fill
|
||||
> your disk space with wasted compiled strings.
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('foo', 'value');
|
||||
$template_string = 'display {$foo} here';
|
||||
$smarty->display('string:' . $template_string); // compiles for later reuse
|
||||
$smarty->display('eval:' . $template_string); // compiles every time
|
||||
```
|
||||
From within a Smarty template:
|
||||
```smarty
|
||||
{include file="string:$template_string"} {* compiles for later reuse *}
|
||||
{include file="eval:$template_string"} {* compiles every time *}
|
||||
```
|
||||
|
||||
Both `string:` and `eval:` resources may be encoded with
|
||||
[`urlencode()`](https://www.php.net/urlencode) or
|
||||
[`base64_encode()`](https://www.php.net/urlencode). This is not necessary
|
||||
for the usual use of `string:` and `eval:`, but is required when using
|
||||
either of them in conjunction with the [`extends resource`](#the-extends-resource).
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('foo','value');
|
||||
$template_string_urlencode = urlencode('display {$foo} here');
|
||||
$template_string_base64 = base64_encode('display {$foo} here');
|
||||
$smarty->display('eval:urlencode:' . $template_string_urlencode); // will decode string using urldecode()
|
||||
$smarty->display('eval:base64:' . $template_string_base64); // will decode string using base64_decode()
|
||||
```
|
||||
|
||||
From within a Smarty template:
|
||||
```smarty
|
||||
{include file="string:urlencode:$template_string_urlencode"} {* will decode string using urldecode() *}
|
||||
{include file="eval:base64:$template_string_base64"} {* will decode string using base64_decode() *}
|
||||
```
|
||||
|
||||
## The extends resource
|
||||
|
||||
The `extends:` resource is used to define child/parent relationships. For details see section of
|
||||
[Template inheritance](inheritance.md).
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Using the extends resource is usually not necessary. If you have a choice, it is normally more flexible and
|
||||
> intuitive to handle inheritance chains from within the templates using the [{extends} tag](inheritance.md).
|
||||
|
||||
When `string:` and `eval:` templates are used, make sure they are properly url or base64 encoded.
|
||||
|
||||
The templates within an inheritance chain are not compiled separately. Only a single compiled template will be generated.
|
||||
(If an `eval:` resource is found within an inheritance chain, its "don't save a compile file" property is superseded by
|
||||
the `extends:` resource.)
|
||||
|
||||
Example:
|
||||
```php
|
||||
<?php
|
||||
$smarty->display('extends:parent.tpl|child.tpl|grandchild.tpl');
|
||||
|
||||
// inheritance from multiple template sources
|
||||
$smarty->display('extends:db:parent.tpl|file:child.tpl|grandchild.tpl|eval:{block name="fooBazVar_"}hello world{/block}');
|
||||
```
|
||||
|
||||
## The stream resource
|
||||
|
||||
Smarty allow you to use [PHP streams](https://www.php.net/manual/en/function.stream-wrapper-register.php)
|
||||
as a template resource. Smarty will first look for a registered template resource. If nothing is
|
||||
found, it will check if a PHP stream is available. If a stream is available, Smarty will use it
|
||||
to fetch the template.
|
||||
|
||||
For example,
|
||||
```php
|
||||
<?php
|
||||
stream_wrapper_register('myresource', MyResourceStream::class);
|
||||
$smarty->display('myresource:bar.tpl');
|
||||
```
|
||||
|
||||
Or, from within a template:
|
||||
```smarty
|
||||
{include file="myresource:bar.tpl"}
|
||||
```
|
||||
|
||||
## Adding your own resource type
|
||||
You can create a class that extends `Smarty\Resource\CustomPlugin` to add your own resource type,
|
||||
for example to load template from a database.
|
||||
|
||||
For example:
|
||||
```php
|
||||
<?php
|
||||
class HelloWorldResource extends Smarty\Resource\CustomPlugin {
|
||||
|
||||
protected function fetch($name, &$source, &$mtime) {
|
||||
$source = '{$x="hello world"}{$x}'; // load your template here based on $name
|
||||
$mtime = time();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// ..
|
||||
|
||||
$smarty->registerResource('helloworld', new HelloWorldResource());
|
||||
```
|
||||
|
||||
If a Resource's templates should not be run through the Smarty
|
||||
compiler, the Custom Resource may extend `\Smarty\Resource\UncompiledPlugin`.
|
||||
The Resource Handler must then implement the function
|
||||
`renderUncompiled(\Smarty\Template $_template)`. `$_template` is
|
||||
a reference to the current template and contains all assigned variables
|
||||
which the implementor can access via
|
||||
`$_template->getSmarty()->getTemplateVars()`. These Resources simply echo
|
||||
their rendered content to the output stream. The rendered output will be
|
||||
output-cached if the Smarty instance was configured accordingly. See
|
||||
`src/Resource/PhpPlugin.php` for an example.
|
||||
|
||||
If the Resource's compiled templates should not be cached on disk, the
|
||||
Custom Resource may extend `\Smarty\Resource\RecompiledPlugin`. These Resources
|
||||
are compiled every time they are accessed. This may be an expensive
|
||||
overhead. See `src/Resource/StringEval.php` for an
|
||||
example.
|
||||
|
||||
## Changing the default resource type
|
||||
The default resource type is `file`. If you want to change it, use `Smarty::setDefaultResourceType`.
|
||||
|
||||
The following example will change the default resource type to `mysql`:
|
||||
```php
|
||||
<?php
|
||||
$smarty->setDefaultResourceType('mysql');
|
||||
```
|
||||
@@ -0,0 +1,119 @@
|
||||
# Security
|
||||
|
||||
Security is good for situations when you have untrusted parties editing
|
||||
the templates, and you want to reduce the risk of system
|
||||
security compromises through the template language.
|
||||
|
||||
The settings of the security policy are defined by overriding public properties of an
|
||||
instance of the \Smarty\Security class. These are the possible settings:
|
||||
|
||||
- `$secure_dir` is an array of template directories that are
|
||||
considered secure. A directory configured using `$smarty->setTemplateDir()` is
|
||||
considered secure implicitly. The default is an empty array.
|
||||
- `$trusted_uri` is an array of regular expressions matching URIs that
|
||||
are considered trusted. This security directive is used by
|
||||
[`{fetch}`](../designers/language-custom-functions/language-function-fetch.md) and
|
||||
[`{html_image}`](../designers/language-custom-functions/language-function-html-image.md). URIs passed to
|
||||
these functions are reduced to `{$PROTOCOL}://{$HOSTNAME}` to allow
|
||||
simple regular expressions (without having to deal with edge cases
|
||||
like authentication-tokens).
|
||||
|
||||
The expression `'#https?://.*smarty.net$#i'` would allow accessing
|
||||
the following URIs:
|
||||
|
||||
- `http://smarty.net/foo`
|
||||
- `http://smarty.net/foo`
|
||||
- `http://www.smarty.net/foo`
|
||||
- `http://smarty.net/foo`
|
||||
- `https://foo.bar.www.smarty.net/foo/bla?blubb=1`
|
||||
|
||||
but deny access to these URIs:
|
||||
|
||||
- `http://smarty.com/foo` (not matching top-level domain \"com\")
|
||||
- `ftp://www.smarty.net/foo` (not matching protocol \"ftp\")
|
||||
- `http://www.smarty.net.otherdomain.com/foo` (not matching end of
|
||||
domain \"smarty.net\")
|
||||
|
||||
- `$static_classes` is an array of classes that are considered
|
||||
trusted. The default is an empty array which allows access to all
|
||||
static classes. To disable access to all static classes set
|
||||
$static_classes = null.
|
||||
|
||||
- `$streams` is an array of streams that are considered trusted and
|
||||
can be used from within template. To disable access to all streams
|
||||
set $streams = null. An empty array ( $streams = [] ) will
|
||||
allow all streams. The default is array('file').
|
||||
|
||||
- `$allowed_modifiers` is an array of (registered / autoloaded)
|
||||
modifiers that should be accessible to the template. If this array
|
||||
is non-empty, only the herein listed modifiers may be used. This is
|
||||
a whitelist.
|
||||
|
||||
- `$disabled_modifiers` is an array of (registered / autoloaded)
|
||||
modifiers that may not be accessible to the template.
|
||||
|
||||
- `$allowed_tags` is a boolean flag which controls if constants can
|
||||
function-, block and filter plugins that should be accessible to the
|
||||
template. If this array is non-empty, only the herein listed
|
||||
modifiers may be used. This is a whitelist.
|
||||
|
||||
- `$disabled_tags` is an array of (registered / autoloaded) function-,
|
||||
block and filter plugins that may not be accessible to the template.
|
||||
|
||||
- `$allow_constants` is a boolean flag which controls if constants can
|
||||
be accessed by the template. The default is "true".
|
||||
|
||||
- `$allow_super_globals` is a boolean flag which controls if the PHP
|
||||
super globals can be accessed by the template. The default is
|
||||
"true".
|
||||
|
||||
If security is enabled, no private methods, functions or properties of
|
||||
static classes or assigned objects can be accessed (beginning with
|
||||
'_') by the template.
|
||||
|
||||
To customize the security policy settings you can extend the
|
||||
\Smarty\Security class or create an instance of it.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
|
||||
class My_Security_Policy extends \Smarty\Security {
|
||||
public $allow_constants = false;
|
||||
}
|
||||
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->enableSecurity('My_Security_Policy');
|
||||
```
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
|
||||
$smarty = new Smarty();
|
||||
|
||||
$my_security_policy = new \Smarty\Security($smarty);
|
||||
$my_security_policy->allow_constants = false;
|
||||
|
||||
$smarty->enableSecurity($my_security_policy);
|
||||
```
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
|
||||
$smarty = new Smarty();
|
||||
|
||||
// enable default security
|
||||
$smarty->enableSecurity();
|
||||
```
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Most security policy settings are only checked when the template gets
|
||||
> compiled. For that reason you should delete all cached and compiled
|
||||
> template files when you change your security settings.
|
||||
@@ -0,0 +1,139 @@
|
||||
# Assigning variables
|
||||
|
||||
Templates start to become really useful once you know how to use variables.
|
||||
|
||||
## Basic assigning
|
||||
Let's revisit the example from the [basics section](../basics.md). The following script assigns a value to
|
||||
the 'companyName' variable and renders the template:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$smarty->assign('companyName', 'AC & ME Corp.');
|
||||
|
||||
$smarty->display('footer.tpl');
|
||||
```
|
||||
|
||||
footer.tpl:
|
||||
```smarty
|
||||
<small>Copyright {$companyName|escape}</small>
|
||||
```
|
||||
|
||||
Smarty will apply the [escape modifier](../../designers/language-modifiers/language-modifier-escape.md)
|
||||
to the value assigned to the variable
|
||||
`companyName` and replace `{$companyName|escape}` with the result.
|
||||
|
||||
```html
|
||||
<small>Copyright AC & ME Corp.</small>
|
||||
```
|
||||
|
||||
Using `$smarty->assign()` is the most common way of assigning data to templates, but there are several other methods.
|
||||
|
||||
## Appending data to an existing variable
|
||||
Using `append()`, you can add data to an existing variable, usually an array.
|
||||
|
||||
If you append to a string value, it is converted to an array value and
|
||||
then appended to. You can explicitly pass name/value pairs, or
|
||||
associative arrays containing the name/value pairs. If you pass the
|
||||
optional third parameter of TRUE, the value will be merged with the
|
||||
current array instead of appended.
|
||||
|
||||
Examples:
|
||||
|
||||
```php
|
||||
<?php
|
||||
// This is effectively the same as assign()
|
||||
$smarty->append('foo', 'Fred');
|
||||
// After this line, foo will now be seen as an array in the template
|
||||
$smarty->append('foo', 'Albert');
|
||||
|
||||
$array = [1 => 'one', 2 => 'two'];
|
||||
$smarty->append('X', $array);
|
||||
$array2 = [3 => 'three', 4 => 'four'];
|
||||
// The following line will add a second element to the X array
|
||||
$smarty->append('X', $array2);
|
||||
|
||||
// passing an associative array
|
||||
$smarty->append(['city' => 'Lincoln', 'state' => 'Nebraska']);
|
||||
```
|
||||
|
||||
## Assigning to template objects
|
||||
When you use a template objects, as explained in [rendering a template](../rendering.md#creating-a-template-object),
|
||||
you can assign data to the template objects directly instead of assigning it to Smarty. This way, you can use different
|
||||
sets of data for different templates.
|
||||
|
||||
For example:
|
||||
```php
|
||||
<?php
|
||||
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty();
|
||||
|
||||
$tplBlue = $smarty->createTemplate('blue.tpl');
|
||||
$tplBlue->assign('name', 'The one');
|
||||
$tplBlue->display();
|
||||
|
||||
$tplRed = $smarty->createTemplate('red.tpl');
|
||||
$tplRed->assign('name', 'Neo');
|
||||
$tplRed->display();
|
||||
```
|
||||
|
||||
## Using data objects
|
||||
For more complex use cases, Smarty supports the concept of data objects.
|
||||
Data objects are containers to hold data. Data objects can be attached to templates when creating them.
|
||||
This allows for fine-grained re-use of data.
|
||||
|
||||
For example:
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
$smarty = new Smarty;
|
||||
|
||||
// create a data object
|
||||
$data = $smarty->createData();
|
||||
|
||||
// assign variable to the data object
|
||||
$data->assign('name', 'Neo');
|
||||
|
||||
// create template object which will use variables from the data object
|
||||
$tpl = $smarty->createTemplate('index.tpl', $data);
|
||||
|
||||
// display the template
|
||||
$tpl->display();
|
||||
```
|
||||
|
||||
## Clearing assigned data
|
||||
When re-using templates, you may need to clear data assigned in a previous run. Use `clearAllAssign()` to
|
||||
clear the values of all assigned variables on data objects, template objects or the Smarty object.
|
||||
|
||||
Examples:
|
||||
```php
|
||||
<?php
|
||||
// assigning data to the Smarty object
|
||||
$smarty->assign('Name', 'Fred');
|
||||
// ...
|
||||
$smarty->clearAllAssign();
|
||||
|
||||
// using a data object
|
||||
$data = $smarty->createData();
|
||||
$data->assign('name', 'Neo');
|
||||
// ...
|
||||
$data->clearAllAssign();
|
||||
|
||||
// using a template
|
||||
$tplBlue = $smarty->createTemplate('blue.tpl');
|
||||
$tplBlue->assign('name', 'The one');
|
||||
// ...
|
||||
$tplBlue->clearAllAssign();
|
||||
```
|
||||
|
||||
Note that there it's only useful to clear assigned data if you:
|
||||
|
||||
1. repeatedly re-use templates, and
|
||||
2. the variables used may change on each repetition
|
||||
|
||||
If your script simply runs once and then ends, or you always assign the same variables, clearing assigned data
|
||||
is of no use.
|
||||
@@ -0,0 +1,88 @@
|
||||
# Loading data from config files
|
||||
|
||||
Instead of [assigning data to templates from PHP](assigning.md), you can also
|
||||
use a config file.
|
||||
|
||||
## Example config file
|
||||
Config files are best suited to manage template settings
|
||||
from one file. One example is a multi-language application.
|
||||
Instead of writing multiple templates to support different languages,
|
||||
you can write a single template file and load your language dependent strings
|
||||
from config files.
|
||||
|
||||
Example `lang.en.ini`:
|
||||
```ini
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
|
||||
[Login]
|
||||
pageTitle = "Login"
|
||||
focus = "username"
|
||||
Intro = """This is a value that spans more
|
||||
than one line. you must enclose
|
||||
it in triple quotes."""
|
||||
|
||||
```
|
||||
|
||||
Values of [config file variables](../../designers/language-variables/language-config-variables.md) can be in
|
||||
quotes, but not necessary. You can use either single or double quotes.
|
||||
If you have a value that spans more than one line, enclose the entire
|
||||
value with triple quotes \("""\). You can put comments into config
|
||||
files by any syntax that is not a valid config file syntax. We recommend
|
||||
using a `#` (hash) at the beginning of the line.
|
||||
|
||||
The example config file above has two sections. Section names are
|
||||
enclosed in \[brackets\]. Section names can be arbitrary strings not
|
||||
containing `[` or `]` symbols. The variable at the top is a global
|
||||
variable. Global variables are always
|
||||
loaded from the config file. If a particular section is loaded, then the
|
||||
global variables and the variables from that section are also loaded. If
|
||||
a variable exists both as a global and in a section, the section
|
||||
variable is used.
|
||||
|
||||
## Loading a config file
|
||||
|
||||
Config files are loaded into templates with the built-in template
|
||||
function [`{config_load}`](../../designers/language-builtin-functions/language-function-config-load.md) or by calling
|
||||
`configLoad()` from PHP:
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->configLoad('lang.en.ini');
|
||||
```
|
||||
|
||||
Load a specific section with:
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->configLoad('lang.en.ini', 'Customer');
|
||||
```
|
||||
|
||||
Note that the global section will always be loaded.
|
||||
|
||||
## Retrieving config variables in PHP
|
||||
|
||||
|
||||
## Loading from a resource
|
||||
Config files (or resources) are loaded by the same resource facilities
|
||||
as templates. That means that a config file can also be loaded from a db. See [resources](../resources.md)
|
||||
for more information.
|
||||
|
||||
## Config overwrite
|
||||
If you name two variables the same within a section,
|
||||
the last one will be used unless you call:
|
||||
```php
|
||||
<?php
|
||||
$smarty->setConfigOverwrite(false);
|
||||
```
|
||||
When config overwrite is disabled, Smarty will create arrays of config file variables when it encounters
|
||||
multiple entries with the same name.
|
||||
|
||||
See also [`{config_load}`](../../designers/language-builtin-functions/language-function-config-load.md),
|
||||
[`$default_config_handler_func`](../../programmers/api-variables/variable-default-config-handler-func.md),
|
||||
[`getConfigVars()`](../../programmers/api-functions/api-get-config-vars.md),
|
||||
[`clearConfig()`](../../programmers/api-functions/api-clear-config.md) and
|
||||
[`configLoad()`](../../programmers/api-functions/api-config-load.md)
|
||||
@@ -0,0 +1,106 @@
|
||||
# Objects
|
||||
|
||||
Smarty allows access to PHP [objects](https://www.php.net/object) through
|
||||
the templates.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> When you assign/register objects to templates, be sure that all
|
||||
> properties and methods accessed from the template are for presentation
|
||||
> purposes only. It is very easy to inject application logic through
|
||||
> objects, and this leads to poor designs that are difficult to manage.
|
||||
> See the Best Practices section of the Smarty website.
|
||||
|
||||
There are two ways to access them.
|
||||
|
||||
## Assign the object
|
||||
You can assign objects to a template and access them much like any other assigned variable.
|
||||
|
||||
Example:
|
||||
```php
|
||||
<?php
|
||||
// the object
|
||||
|
||||
class My_Object {
|
||||
public function meth1($params, $smarty_obj) {
|
||||
return 'this is my meth1';
|
||||
}
|
||||
}
|
||||
|
||||
// We can also assign objects. assign_by_ref when possible.
|
||||
$smarty->assign('myobj', new My_Object());
|
||||
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
And here's how to access your object in `index.tpl`:
|
||||
|
||||
```smarty
|
||||
{$myobj->meth1('foo',$bar)}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Register the object
|
||||
Registerd objects use a different template syntax. Also, a registered object
|
||||
can be restricted to certain methods or
|
||||
properties. However, **a registered object cannot be looped over or
|
||||
assigned in arrays of objects**, etc.
|
||||
|
||||
If security is enabled, no private methods or functions can be accessed
|
||||
(beginning with '_'). If a method and property of the same name exist,
|
||||
the method will be used.
|
||||
|
||||
You can restrict the methods and properties that can be accessed by
|
||||
listing them in an array as the third registration parameter.
|
||||
|
||||
By default, parameters passed to objects through the templates are
|
||||
passed the same way [custom tags](../../designers/language-custom-functions/index.md) get
|
||||
them. An associative array is passed as the first parameter, and the
|
||||
smarty object as the second. If you want the parameters passed one at a
|
||||
time for each argument like traditional object parameter passing, set
|
||||
the fourth registration parameter to FALSE.
|
||||
|
||||
The optional fifth parameter has only effect with `format` being TRUE
|
||||
and contains a list of methods that should be treated as blocks. That
|
||||
means these methods have a closing tag in the template
|
||||
(`{foobar->meth2}...{/foobar->meth2}`) and the parameters to the methods
|
||||
have the same synopsis as the parameters for
|
||||
[`block tags`](../extending/block-tags.md): They get the four
|
||||
parameters `$params`, `$content`, `$smarty` and `&$repeat` and they also
|
||||
behave like block tags.
|
||||
|
||||
```php
|
||||
<?php
|
||||
// the object
|
||||
|
||||
class My_Object {
|
||||
function meth1($params, $smarty_obj) {
|
||||
return 'this is my meth1';
|
||||
}
|
||||
}
|
||||
|
||||
$myobj = new My_Object;
|
||||
|
||||
// registering the object
|
||||
$smarty->registerObject('foobar', $myobj);
|
||||
|
||||
// if we want to restrict access to certain methods or properties, list them
|
||||
$smarty->registerObject('foobar', $myobj, array('meth1','meth2','prop1'));
|
||||
|
||||
// if you want to use the traditional object parameter format, pass a boolean of false
|
||||
$smarty->registerObject('foobar', $myobj, null, false);
|
||||
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
And here's how to access your objects in `index.tpl`:
|
||||
|
||||
```smarty
|
||||
{* access our registered object *}
|
||||
{foobar->meth1 p1='foo' p2=$bar}
|
||||
|
||||
{* you can also assign the output *}
|
||||
{foobar->meth1 p1='foo' p2=$bar assign='output'}
|
||||
the output was {$output}
|
||||
```
|
||||
@@ -0,0 +1,39 @@
|
||||
# Static Classes
|
||||
|
||||
You can directly access static classes. The syntax is roughly the same as in
|
||||
PHP.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Direct access to PHP classes is not recommended. This ties the
|
||||
> underlying application code structure directly to the presentation,
|
||||
> and also complicates template syntax. It is recommended to register
|
||||
> plugins which insulate templates from PHP classes/objects. Use at your
|
||||
> own discretion.
|
||||
|
||||
## Examples
|
||||
|
||||
**class constant BAR**
|
||||
```smarty
|
||||
{assign var=foo value=myclass::BAR}
|
||||
```
|
||||
|
||||
**method result**
|
||||
```smarty
|
||||
{assign var=foo value=myclass::method()}
|
||||
```
|
||||
|
||||
**method chaining**
|
||||
```smarty
|
||||
{assign var=foo value=myclass::method1()->method2}
|
||||
```
|
||||
|
||||
**property bar of class myclass**
|
||||
```smarty
|
||||
{assign var=foo value=myclass::$bar}
|
||||
```
|
||||
|
||||
**using Smarty variable bar as class name**
|
||||
```smarty
|
||||
{assign var=foo value=$bar::method}
|
||||
```
|
||||
@@ -0,0 +1,13 @@
|
||||
# Streams
|
||||
|
||||
You can also use streams to call variables. *{$foo:bar}* will use the
|
||||
*foo://bar* stream to get the template variable.
|
||||
|
||||
Using a PHP stream for a template variable resource from within a
|
||||
template.
|
||||
|
||||
```smarty
|
||||
{$foo:bar}
|
||||
```
|
||||
|
||||
See also [`Template Resources`](../resources.md)
|
||||
+120
-179
@@ -1,23 +1,22 @@
|
||||
Tips & Tricks {#tips}
|
||||
=============
|
||||
# Tips & Tricks
|
||||
|
||||
Blank Variable Handling {#tips.blank.var.handling}
|
||||
=======================
|
||||
## Blank Variable Handling
|
||||
|
||||
There may be times when you want to print a default value for an empty
|
||||
variable instead of printing nothing, such as printing ` ` so that
|
||||
html table backgrounds work properly. Many would use an
|
||||
[`{if}`](#language.function.if) statement to handle this, but there is a
|
||||
[`{if}`](../designers/language-builtin-functions/language-function-if.md) statement to handle this, but there is a
|
||||
shorthand way with Smarty, using the
|
||||
[`default`](#language.modifier.default) variable modifier.
|
||||
[`default`](../designers/language-modifiers/language-modifier-default.md) variable modifier.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> "Undefined variable" errors will show an E\_NOTICE if not disabled in
|
||||
> PHP\'s [`error_reporting()`](&url.php-manual;error_reporting) level or
|
||||
> Smarty\'s [`$error_reporting`](#variable.error.reporting) property and
|
||||
> PHP's [`error_reporting()`](https://www.php.net/error_reporting) level or
|
||||
> Smarty's [`$error_reporting`](../programmers/api-variables/variable-error-reporting.md) property and
|
||||
> a variable had not been assigned to Smarty.
|
||||
|
||||
```smarty
|
||||
|
||||
{* the long way *}
|
||||
{if $title eq ''}
|
||||
@@ -29,19 +28,18 @@ shorthand way with Smarty, using the
|
||||
{* the short way *}
|
||||
{$title|default:' '}
|
||||
|
||||
|
||||
```
|
||||
|
||||
See also [`default`](#language.modifier.default) modifier and [default
|
||||
variable handling](#tips.default.var.handling).
|
||||
See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [default
|
||||
variable handling](#default-variable-handling).
|
||||
|
||||
Default Variable Handling {#tips.default.var.handling}
|
||||
=========================
|
||||
## Default Variable Handling
|
||||
|
||||
If a variable is used frequently throughout your templates, applying the
|
||||
[`default`](#language.modifier.default) modifier every time it is
|
||||
[`default`](../designers/language-modifiers/language-modifier-default.md) modifier every time it is
|
||||
mentioned can get a bit ugly. You can remedy this by assigning the
|
||||
variable its default value with the
|
||||
[`{assign}`](#language.function.assign) function.
|
||||
[`{assign}`](../designers/language-builtin-functions/language-function-assign.md) function.
|
||||
|
||||
|
||||
{* do this somewhere at the top of your template *}
|
||||
@@ -52,275 +50,218 @@ variable its default value with the
|
||||
|
||||
|
||||
|
||||
See also [`default`](#language.modifier.default) modifier and [blank
|
||||
variable handling](#tips.blank.var.handling).
|
||||
See also [`default`](../designers/language-modifiers/language-modifier-default.md) modifier and [blank
|
||||
variable handling](#blank-variable-handling).
|
||||
|
||||
Passing variable title to header template {#tips.passing.vars}
|
||||
=========================================
|
||||
## Passing variable title to header template
|
||||
|
||||
When the majority of your templates use the same headers and footers, it
|
||||
is common to split those out into their own templates and
|
||||
[`{include}`](#language.function.include) them. But what if the header
|
||||
[`{include}`](../designers/language-builtin-functions/language-function-include.md) them. But what if the header
|
||||
needs to have a different title, depending on what page you are coming
|
||||
from? You can pass the title to the header as an
|
||||
[attribute](#language.syntax.attributes) when it is included.
|
||||
[attribute](../designers/language-basic-syntax/language-syntax-attributes.md) when it is included.
|
||||
|
||||
`mainpage.tpl` - When the main page is drawn, the title of "Main Page"
|
||||
is passed to the `header.tpl`, and will subsequently be used as the
|
||||
title.
|
||||
|
||||
```smarty
|
||||
|
||||
{include file='header.tpl' title='Main Page'}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
{include file='header.tpl' title='Main Page'}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
|
||||
|
||||
```
|
||||
|
||||
`archives.tpl` - When the archives page is drawn, the title will be
|
||||
"Archives". Notice in the archive example, we are using a variable from
|
||||
the `archives_page.conf` file instead of a hard coded variable.
|
||||
|
||||
```smarty
|
||||
|
||||
{config_load file='archive_page.conf'}
|
||||
{config_load file='archive_page.conf'}
|
||||
|
||||
{include file='header.tpl' title=#archivePageTitle#}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
{include file='header.tpl' title=#archivePageTitle#}
|
||||
{* template body goes here *}
|
||||
{include file='footer.tpl'}
|
||||
|
||||
```
|
||||
|
||||
|
||||
`header.tpl` - Notice that "Smarty News" is printed if the `$title`
|
||||
variable is not set, using the [`default`](#language.modifier.default)
|
||||
variable is not set, using the [`default`](../designers/language-modifiers/language-modifier-default.md)
|
||||
variable modifier.
|
||||
|
||||
```smarty
|
||||
|
||||
<html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title|default:'Smarty News'}</title>
|
||||
<title>{$title|default:'Smarty News'}</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<body>
|
||||
|
||||
```
|
||||
|
||||
|
||||
`footer.tpl`
|
||||
|
||||
```smarty
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
Dates {#tips.dates}
|
||||
=====
|
||||
## Dates
|
||||
|
||||
As a rule of thumb, always pass dates to Smarty as
|
||||
[timestamps](&url.php-manual;time). This allows template designers to
|
||||
use the [`date_format`](#language.modifier.date.format) modifier for
|
||||
[timestamps](https://www.php.net/time). This allows template designers to
|
||||
use the [`date_format`](../designers/language-modifiers/language-modifier-date-format.md) modifier for
|
||||
full control over date formatting, and also makes it easy to compare
|
||||
dates if necessary.
|
||||
|
||||
|
||||
{$startDate|date_format}
|
||||
|
||||
```smarty
|
||||
{$startDate|date_format}
|
||||
```
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
```
|
||||
Jan 4, 2009
|
||||
```
|
||||
|
||||
Jan 4, 2009
|
||||
```smarty
|
||||
|
||||
|
||||
|
||||
|
||||
{$startDate|date_format:"%Y/%m/%d"}
|
||||
{$startDate|date_format:"%Y/%m/%d"}
|
||||
|
||||
```
|
||||
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
2009/01/04
|
||||
|
||||
|
||||
```
|
||||
2009/01/04
|
||||
```
|
||||
|
||||
Dates can be compared in the template by timestamps with:
|
||||
|
||||
```smarty
|
||||
|
||||
{if $order_date < $invoice_date}
|
||||
...do something..
|
||||
{/if}
|
||||
{if $order_date < $invoice_date}
|
||||
...do something..
|
||||
{/if}
|
||||
|
||||
|
||||
```
|
||||
|
||||
When using [`{html_select_date}`](#language.function.html.select.date)
|
||||
When using [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md)
|
||||
in a template, the programmer will most likely want to convert the
|
||||
output from the form back into timestamp format. Here is a function to
|
||||
help you with that.
|
||||
|
||||
```php
|
||||
|
||||
<?php
|
||||
<?php
|
||||
|
||||
// this assumes your form elements are named
|
||||
// startDate_Day, startDate_Month, startDate_Year
|
||||
// this assumes your form elements are named
|
||||
// startDate_Day, startDate_Month, startDate_Year
|
||||
|
||||
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
|
||||
$startDate = makeTimeStamp($startDate_Year, $startDate_Month, $startDate_Day);
|
||||
|
||||
function makeTimeStamp($year='', $month='', $day='')
|
||||
{
|
||||
if(empty($year)) {
|
||||
$year = strftime('%Y');
|
||||
}
|
||||
if(empty($month)) {
|
||||
$month = strftime('%m');
|
||||
}
|
||||
if(empty($day)) {
|
||||
$day = strftime('%d');
|
||||
}
|
||||
function makeTimeStamp($year='', $month='', $day='')
|
||||
{
|
||||
if(empty($year)) {
|
||||
$year = strftime('%Y');
|
||||
}
|
||||
if(empty($month)) {
|
||||
$month = strftime('%m');
|
||||
}
|
||||
if(empty($day)) {
|
||||
$day = strftime('%d');
|
||||
}
|
||||
|
||||
return mktime(0, 0, 0, $month, $day, $year);
|
||||
}
|
||||
?>
|
||||
return mktime(0, 0, 0, $month, $day, $year);
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
See also [`{html_select_date}`](#language.function.html.select.date),
|
||||
[`{html_select_time}`](#language.function.html.select.time),
|
||||
[`date_format`](#language.modifier.date.format) and
|
||||
[`$smarty.now`](#language.variables.smarty.now),
|
||||
See also [`{html_select_date}`](../designers/language-custom-functions/language-function-html-select-date.md),
|
||||
[`{html_select_time}`](../designers/language-custom-functions/language-function-html-select-time.md),
|
||||
[`date_format`](../designers/language-modifiers/language-modifier-date-format.md) and
|
||||
[`$smarty.now`](../designers/language-variables/language-variables-smarty.md#smarty-now),
|
||||
|
||||
WAP/WML {#tips.wap}
|
||||
=======
|
||||
|
||||
WAP/WML templates require a php [Content-Type
|
||||
header](&url.php-manual;header) to be passed along with the template.
|
||||
The easist way to do this would be to write a custom function that
|
||||
prints the header. If you are using [caching](#caching), that won\'t
|
||||
work so we\'ll do it using the [`{insert}`](#language.function.insert)
|
||||
tag; remember `{insert}` tags are not cached! Be sure that there is
|
||||
nothing output to the browser before the template, or else the header
|
||||
may fail.
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
// be sure apache is configure for the .wml extensions!
|
||||
// put this function somewhere in your application, or in Smarty.addons.php
|
||||
function insert_header($params)
|
||||
{
|
||||
// this function expects $content argument
|
||||
if (empty($params['content'])) {
|
||||
return;
|
||||
}
|
||||
header($params['content']);
|
||||
return;
|
||||
}
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
your Smarty template *must* begin with the insert tag :
|
||||
|
||||
|
||||
{insert name=header content="Content-Type: text/vnd.wap.wml"}
|
||||
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
|
||||
|
||||
<!-- begin new wml deck -->
|
||||
<wml>
|
||||
<!-- begin first card -->
|
||||
<card>
|
||||
<do type="accept">
|
||||
<go href="#two"/>
|
||||
</do>
|
||||
<p>
|
||||
Welcome to WAP with Smarty!
|
||||
Press OK to continue...
|
||||
</p>
|
||||
</card>
|
||||
<!-- begin second card -->
|
||||
<card id="two">
|
||||
<p>
|
||||
Pretty easy isn't it?
|
||||
</p>
|
||||
</card>
|
||||
</wml>
|
||||
|
||||
|
||||
|
||||
Componentized Templates {#tips.componentized.templates}
|
||||
=======================
|
||||
## Componentized Templates
|
||||
|
||||
Traditionally, programming templates into your applications goes as
|
||||
follows: First, you accumulate your variables within your PHP
|
||||
application, (maybe with database queries.) Then, you instantiate your
|
||||
Smarty object, [`assign()`](#api.assign) the variables and
|
||||
[`display()`](#api.display) the template. So lets say for example we
|
||||
Smarty object, [`assign()`](../programmers/api-functions/api-assign.md) the variables and
|
||||
[`display()`](../programmers/api-functions/api-display.md) the template. So lets say for example we
|
||||
have a stock ticker on our template. We would collect the stock data in
|
||||
our application, then assign these variables in the template and display
|
||||
it. Now wouldn\'t it be nice if you could add this stock ticker to any
|
||||
it. Now wouldn't it be nice if you could add this stock ticker to any
|
||||
application by merely including the template, and not worry about
|
||||
fetching the data up front?
|
||||
|
||||
You can do this by writing a custom plugin for fetching the content and
|
||||
assigning it to a template variable.
|
||||
|
||||
`function.load_ticker.php` - drop file in
|
||||
[`$plugins directory`](#variable.plugins.dir)
|
||||
`function.load_ticker.php`
|
||||
|
||||
```php
|
||||
|
||||
<?php
|
||||
<?php
|
||||
|
||||
// setup our function for fetching stock data
|
||||
function fetch_ticker($symbol)
|
||||
{
|
||||
// put logic here that fetches $ticker_info
|
||||
// from some ticker resource
|
||||
return $ticker_info;
|
||||
}
|
||||
// setup our function for fetching stock data
|
||||
function fetch_ticker($symbol)
|
||||
{
|
||||
// put logic here that fetches $ticker_info
|
||||
// from some ticker resource
|
||||
return $ticker_info;
|
||||
}
|
||||
|
||||
function smarty_function_load_ticker($params, $smarty)
|
||||
{
|
||||
// call the function
|
||||
$ticker_info = fetch_ticker($params['symbol']);
|
||||
function smarty_function_load_ticker($params, $smarty)
|
||||
{
|
||||
// call the function
|
||||
$ticker_info = fetch_ticker($params['symbol']);
|
||||
|
||||
// assign template variable
|
||||
$smarty->assign($params['assign'], $ticker_info);
|
||||
}
|
||||
?>
|
||||
// assign template variable
|
||||
$smarty->assign($params['assign'], $ticker_info);
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
`index.tpl`
|
||||
|
||||
```smarty
|
||||
|
||||
{load_ticker symbol='SMARTY' assign='ticker'}
|
||||
{load_ticker symbol='SMARTY' assign='ticker'}
|
||||
|
||||
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||
Stock Name: {$ticker.name} Stock Price: {$ticker.price}
|
||||
|
||||
|
||||
```
|
||||
|
||||
See also [`{include_php}`](#language.function.include.php),
|
||||
[`{include}`](#language.function.include) and
|
||||
[`{php}`](#language.function.php).
|
||||
See also: [`{include}`](../designers/language-builtin-functions/language-function-include.md).
|
||||
|
||||
Obfuscating E-mail Addresses {#tips.obfuscating.email}
|
||||
============================
|
||||
## Obfuscating E-mail Addresses
|
||||
|
||||
Do you ever wonder how your email address gets on so many spam mailing
|
||||
lists? One way spammers collect email addresses is from web pages. To
|
||||
help combat this problem, you can make your email address show up in
|
||||
scrambled javascript in the HTML source, yet it it will look and work
|
||||
correctly in the browser. This is done with the
|
||||
[`{mailto}`](#language.function.mailto) plugin.
|
||||
[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md) plugin.
|
||||
|
||||
```smarty
|
||||
|
||||
<div id="contact">Send inquiries to
|
||||
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
||||
</div>
|
||||
<div id="contact">Send inquiries to
|
||||
{mailto address=$EmailAddress encode='javascript' subject='Hello'}
|
||||
</div>
|
||||
|
||||
|
||||
```
|
||||
|
||||
> **Note**
|
||||
>
|
||||
@@ -328,5 +269,5 @@ correctly in the browser. This is done with the
|
||||
> his e-mail collector to decode these values, but not likely\....
|
||||
> hopefully..yet \... wheres that quantum computer :-?.
|
||||
|
||||
See also [`escape`](#language.modifier.escape) modifier and
|
||||
[`{mailto}`](#language.function.mailto).
|
||||
See also [`escape`](../designers/language-modifiers/language-modifier-escape.md) modifier and
|
||||
[`{mailto}`](../designers/language-custom-functions/language-function-mailto.md).
|
||||
|
||||
@@ -1,20 +1,18 @@
|
||||
Troubleshooting
|
||||
===============
|
||||
# Troubleshooting
|
||||
|
||||
Smarty/PHP errors {#smarty.php.errors}
|
||||
=================
|
||||
## Smarty/PHP errors
|
||||
|
||||
Smarty can catch many errors such as missing tag attributes or malformed
|
||||
variable names. If this happens, you will see an error similar to the
|
||||
following:
|
||||
|
||||
```
|
||||
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
|
||||
Warning: Smarty: [in index.tpl line 4]: syntax error: unknown tag - '%blah'
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
|
||||
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
|
||||
Fatal error: Smarty: [in index.tpl line 28]: syntax error: missing section name
|
||||
in /path/to/smarty/Smarty.class.php on line 1041
|
||||
```
|
||||
|
||||
|
||||
Smarty shows you the template name, the line number and the error. After
|
||||
@@ -25,96 +23,82 @@ There are certain errors that Smarty cannot catch, such as missing close
|
||||
tags. These types of errors usually end up in PHP compile-time parsing
|
||||
errors.
|
||||
|
||||
|
||||
Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75
|
||||
|
||||
|
||||
|
||||
`Parse error: parse error in /path/to/smarty/templates_c/index.tpl.php on line 75`
|
||||
|
||||
When you encounter a PHP parsing error, the error line number will
|
||||
correspond to the compiled PHP script, NOT the template itself. Usually
|
||||
you can look at the template and spot the syntax error. Here are some
|
||||
common things to look for: missing close tags for
|
||||
[`{if}{/if}`](#language.function.if) or
|
||||
[`{section}{/section}`](#language.function.if), or syntax of logic
|
||||
within an `{if}` tag. If you can\'t find the error, you might have to
|
||||
[`{if}{/if}`](../designers/language-builtin-functions/language-function-if.md) or
|
||||
[`{section}{/section}`](../designers/language-builtin-functions/language-function-section.md),
|
||||
or syntax of logic within an `{if}` tag. If you can\'t find the error, you might have to
|
||||
open the compiled PHP file and go to the line number to figure out where
|
||||
the corresponding error is in the template.
|
||||
|
||||
```
|
||||
Warning: Smarty error: unable to read resource: "index.tpl" in...
|
||||
```
|
||||
or
|
||||
```
|
||||
Warning: Smarty error: unable to read resource: "site.conf" in...
|
||||
```
|
||||
|
||||
Warning: Smarty error: unable to read resource: "index.tpl" in...
|
||||
or
|
||||
Warning: Smarty error: unable to read resource: "site.conf" in...
|
||||
|
||||
- The [`$template_dir`](#variable.template.dir) is incorrect, doesn\'t
|
||||
- The [`$template_dir`](../programmers/api-variables/variable-template-dir.md) is incorrect, doesn't
|
||||
exist or the file `index.tpl` is not in the `templates/` directory
|
||||
|
||||
- A [`{config_load}`](#language.function.config.load) function is
|
||||
within a template (or [`configLoad()`](#api.config.load) has been
|
||||
called) and either [`$config_dir`](#variable.config.dir) is
|
||||
- A [`{config_load}`](../designers/language-builtin-functions/language-function-config-load.md) function is
|
||||
within a template (or [`configLoad()`](../programmers/api-functions/api-config-load.md) has been
|
||||
called) and either [`$config_dir`](../programmers/api-variables/variable-config-dir.md) is
|
||||
incorrect, does not exist or `site.conf` is not in the directory.
|
||||
|
||||
<!-- -->
|
||||
```
|
||||
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
|
||||
or is not a directory...
|
||||
```
|
||||
|
||||
|
||||
Fatal error: Smarty error: the $compile_dir 'templates_c' does not exist,
|
||||
or is not a directory...
|
||||
|
||||
|
||||
|
||||
- Either the [`$compile_dir`](#variable.compile.dir)is incorrectly
|
||||
- Either the [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md)is incorrectly
|
||||
set, the directory does not exist, or `templates_c` is a file and
|
||||
not a directory.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
Fatal error: Smarty error: unable to write to $compile_dir '....
|
||||
|
||||
```
|
||||
Fatal error: Smarty error: unable to write to $compile_dir '....
|
||||
```
|
||||
|
||||
|
||||
- The [`$compile_dir`](#variable.compile.dir) is not writable by the
|
||||
- The [`$compile_dir`](../programmers/api-variables/variable-compile-dir.md) is not writable by the
|
||||
web server. See the bottom of the [installing
|
||||
smarty](#installing.smarty.basic) page for more about permissions.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
|
||||
or is not a directory. in /..
|
||||
smarty](../getting-started.md#installation) page for more about permissions.
|
||||
|
||||
```
|
||||
Fatal error: Smarty error: the $cache_dir 'cache' does not exist,
|
||||
or is not a directory. in /..
|
||||
```
|
||||
|
||||
|
||||
- This means that [`$caching`](#variable.caching) is enabled and
|
||||
either; the [`$cache_dir`](#variable.cache.dir) is incorrectly set,
|
||||
- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and
|
||||
either; the [`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is incorrectly set,
|
||||
the directory does not exist, or `cache/` is a file and not a
|
||||
directory.
|
||||
|
||||
<!-- -->
|
||||
```
|
||||
Fatal error: Smarty error: unable to write to $cache_dir '/...
|
||||
```
|
||||
|
||||
|
||||
Fatal error: Smarty error: unable to write to $cache_dir '/...
|
||||
|
||||
|
||||
|
||||
- This means that [`$caching`](#variable.caching) is enabled and the
|
||||
[`$cache_dir`](#variable.cache.dir) is not writable by the web
|
||||
- This means that [`$caching`](../programmers/api-variables/variable-caching.md) is enabled and the
|
||||
[`$cache_dir`](../programmers/api-variables/variable-cache-dir.md) is not writable by the web
|
||||
server. See the bottom of the [installing
|
||||
smarty](#installing.smarty.basic) page for permissions.
|
||||
smarty](../getting-started.md#installation) page for permissions.
|
||||
|
||||
<!-- -->
|
||||
```
|
||||
Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
|
||||
in /path/to/smarty/libs/sysplugins/smarty_resource.php
|
||||
```
|
||||
|
||||
|
||||
Warning: filemtime(): stat failed for /path/to/smarty/cache/3ab50a623e65185c49bf17c63c90cc56070ea85c.one.tpl.php
|
||||
in /path/to/smarty/libs/sysplugins/smarty_resource.php
|
||||
|
||||
|
||||
|
||||
- This means that your application registered a custom error hander
|
||||
(using [set\_error\_handler()](&url.php-manual;set_error_handler))
|
||||
- This means that your application registered a custom error handler
|
||||
(using [set_error_handler()](https://www.php.net/set_error_handler))
|
||||
which is not respecting the given `$errno` as it should. If, for
|
||||
whatever reason, this is the desired behaviour of your custom error
|
||||
handler, please call
|
||||
[`muteExpectedErrors()`](#api.mute.expected.errors) after you\'ve
|
||||
[`muteExpectedErrors()`](../programmers/api-functions/api-mute-expected-errors.md) after you've
|
||||
registered your custom error handler.
|
||||
|
||||
See also [debugging](#chapter.debugging.console).
|
||||
See also [debugging](../designers/chapter-debugging-console.md).
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
Debugging Console {#chapter.debugging.console}
|
||||
=================
|
||||
# Debugging Console
|
||||
|
||||
There is a debugging console included with Smarty. The console informs
|
||||
you of all the [included](./language-builtin-functions/language-function-include.md) templates,
|
||||
@@ -11,8 +10,7 @@ of the console.
|
||||
|
||||
Set [`$debugging`](../programmers/api-variables/variable-debugging.md) to TRUE in Smarty, and if needed
|
||||
set [`$debug_tpl`](../programmers/api-variables/variable-debug-template.md) to the template resource
|
||||
path to `debug.tpl` (this is in [`SMARTY_DIR`](../programmers/smarty-constants.md) by
|
||||
default). When you load the page, a Javascript console window will pop
|
||||
path to `debug.tpl`. When you load the page, a Javascript console window will pop
|
||||
up and give you the names of all the included templates and assigned
|
||||
variables for the current page.
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
Config Files {#config.files}
|
||||
============
|
||||
# Config Files
|
||||
|
||||
Config files are handy for designers to manage global template variables
|
||||
from one file. One example is template colors. Normally if you wanted to
|
||||
@@ -8,39 +7,38 @@ each and every template file and change the colors. With a config file,
|
||||
the colors can be kept in one place, and only one file needs to be
|
||||
updated.
|
||||
|
||||
```ini
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
bodyBgColor = #000000
|
||||
tableBgColor = #000000
|
||||
rowBgColor = #00ff00
|
||||
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
bodyBgColor = #000000
|
||||
tableBgColor = #000000
|
||||
rowBgColor = #00ff00
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
|
||||
[Login]
|
||||
pageTitle = "Login"
|
||||
focus = "username"
|
||||
Intro = """This is a value that spans more
|
||||
than one line. you must enclose
|
||||
it in triple quotes."""
|
||||
|
||||
# hidden section
|
||||
[.Database]
|
||||
host=my.example.com
|
||||
db=ADDRESSBOOK
|
||||
user=php-user
|
||||
pass=foobar
|
||||
[Login]
|
||||
pageTitle = "Login"
|
||||
focus = "username"
|
||||
Intro = """This is a value that spans more
|
||||
than one line. you must enclose
|
||||
it in triple quotes."""
|
||||
|
||||
# hidden section
|
||||
[.Database]
|
||||
host=my.example.com
|
||||
db=ADDRESSBOOK
|
||||
user=php-user
|
||||
pass=foobar
|
||||
```
|
||||
|
||||
|
||||
Values of [config file variables](./language-variables/language-config-variables.md) can be in
|
||||
quotes, but not necessary. You can use either single or double quotes.
|
||||
If you have a value that spans more than one line, enclose the entire
|
||||
value with triple quotes (\"\"\"). You can put comments into config
|
||||
value with triple quotes \("""\). You can put comments into config
|
||||
files by any syntax that is not a valid config file syntax. We recommend
|
||||
using a `
|
||||
#` (hash) at the beginning of the line.
|
||||
using a `#` (hash) at the beginning of the line.
|
||||
|
||||
The example config file above has two sections. Section names are
|
||||
enclosed in \[brackets\]. Section names can be arbitrary strings not
|
||||
@@ -54,8 +52,7 @@ the last one will be used unless
|
||||
[`$config_overwrite`](../programmers/api-variables/variable-config-overwrite.md) is disabled.
|
||||
|
||||
Config files are loaded into templates with the built-in template
|
||||
function [`
|
||||
{config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
|
||||
function [`{config_load}`](./language-builtin-functions/language-function-config-load.md) or the API
|
||||
[`configLoad()`](../programmers/api-functions/api-config-load.md) function.
|
||||
|
||||
You can hide variables or entire sections by prepending the variable
|
||||
|
||||
+12
-12
@@ -1,8 +1,7 @@
|
||||
Basic Syntax
|
||||
============
|
||||
# Basic Syntax
|
||||
|
||||
A simple Smarty template could look like this:
|
||||
```html
|
||||
```smarty
|
||||
<h1>{$title|escape}</h1>
|
||||
<ul>
|
||||
{foreach $cities as $city}
|
||||
@@ -15,7 +14,7 @@ A simple Smarty template could look like this:
|
||||
|
||||
All Smarty template tags are enclosed within delimiters. By default
|
||||
these are `{` and `}`, but they can be
|
||||
[changed](../programmers/api-variables/variable-left-delimiter.md).
|
||||
[changed](../../designers/language-basic-syntax/language-escaping.md).
|
||||
|
||||
For the examples in this manual, we will assume that you are using the
|
||||
default delimiters. In Smarty, all content outside of delimiters is
|
||||
@@ -23,11 +22,12 @@ displayed as static content, or unchanged. When Smarty encounters
|
||||
template tags, it attempts to interpret them, and displays the
|
||||
appropriate output in their place.
|
||||
|
||||
The basis components of the Smarty syntax are:
|
||||
- [Comments](./language-basic-syntax/language-syntax-comments.md)
|
||||
- [Variables](./language-basic-syntax/language-syntax-variables.md)
|
||||
- [Functions](./language-basic-syntax/language-syntax-functions.md)
|
||||
- [Attributes](./language-basic-syntax/language-syntax-attributes.md)
|
||||
- [Quotes](./language-basic-syntax/language-syntax-quotes.md)
|
||||
- [Math](./language-basic-syntax/language-math.md)
|
||||
- [Escaping](./language-basic-syntax/language-escaping.md)
|
||||
The basic components of the Smarty syntax are:
|
||||
|
||||
- [Comments](language-syntax-comments.md)
|
||||
- [Variables](language-syntax-variables.md)
|
||||
- [Operators](language-syntax-operators.md)
|
||||
- [Tags](language-syntax-tags.md)
|
||||
- [Attributes](language-syntax-attributes.md)
|
||||
- [Quotes](language-syntax-quotes.md)
|
||||
- [Escaping](language-escaping.md)
|
||||
@@ -1,11 +1,10 @@
|
||||
Escaping Smarty Parsing {#language.escaping}
|
||||
=======================
|
||||
# Escaping Smarty parsing
|
||||
|
||||
It is sometimes desirable or even necessary to have Smarty ignore
|
||||
sections it would otherwise parse. A classic example is embedding
|
||||
Javascript or CSS code in a template. The problem arises as those
|
||||
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**
|
||||
>
|
||||
@@ -17,37 +16,36 @@ languages use the { and } characters which are also the default
|
||||
|
||||
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
|
||||
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.
|
||||
|
||||
## Examples
|
||||
|
||||
<script>
|
||||
// the following braces are ignored by Smarty
|
||||
// since they are surrounded by whitespace
|
||||
function foobar {
|
||||
alert('foobar!');
|
||||
}
|
||||
// this one will need literal escapement
|
||||
{literal}
|
||||
function bazzy {alert('foobar!');}
|
||||
{/literal}
|
||||
</script>
|
||||
|
||||
```smarty
|
||||
<script>
|
||||
// the following braces are ignored by Smarty
|
||||
// since they are surrounded by whitespace
|
||||
function foobar {
|
||||
alert('foobar!');
|
||||
}
|
||||
// this one will need literal escapement
|
||||
{literal}
|
||||
function bazzy {alert('foobar!');}
|
||||
{/literal}
|
||||
</script>
|
||||
```
|
||||
|
||||
|
||||
[`{literal}..{/literal}`](#language.function.literal) blocks are used
|
||||
[`{literal}..{/literal}`](../language-builtin-functions/language-function-literal.md) blocks are used
|
||||
for escaping blocks of template logic. You can also escape the braces
|
||||
individually with
|
||||
[`{ldelim}`](#language.function.ldelim),[`{rdelim}`](#language.function.ldelim)
|
||||
tags or
|
||||
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](#language.variables.smarty.ldelim)
|
||||
[`{ldelim}`, `{rdelim}`](../language-builtin-functions/language-function-ldelim.md) tags or
|
||||
[`{$smarty.ldelim}`,`{$smarty.rdelim}`](../language-variables/language-variables-smarty.md#smartyldelim-smartyrdelim-languagevariablessmartyldelim)
|
||||
variables.
|
||||
|
||||
Smarty\'s default delimiters { and } cleanly represent presentational
|
||||
content. However if another set of delimiters suit your needs better,
|
||||
you can change them with Smarty\'s
|
||||
[`$left_delimiter`](#variable.left.delimiter) and
|
||||
[`$right_delimiter`](#variable.right.delimiter) values.
|
||||
Smarty's default delimiters { and } cleanly represent presentational
|
||||
content. However, if another set of delimiters suit your needs better,
|
||||
you can change them with Smarty's
|
||||
`setLeftDelimiter()` and `setRightDelimiter()` methods.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
@@ -55,30 +53,26 @@ you can change them with Smarty\'s
|
||||
> sure to clear out cache and compiled files if you decide to change
|
||||
> them.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
<?php
|
||||
$smarty->setLeftDelimiter('<!--{');
|
||||
$smarty->setRightDelimiter('}-->');
|
||||
|
||||
$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:
|
||||
|
||||
|
||||
Welcome <!--{$name}--> to Smarty
|
||||
<script language="javascript">
|
||||
var foo = <!--{$foo}-->;
|
||||
function dosomething() {
|
||||
alert("foo is " + foo);
|
||||
}
|
||||
dosomething();
|
||||
</script>
|
||||
|
||||
|
||||
```smarty
|
||||
Welcome <!--{$name}--> to Smarty
|
||||
<script>
|
||||
var foo = <!--{$foo}-->;
|
||||
function dosomething() {
|
||||
alert("foo is " + foo);
|
||||
}
|
||||
dosomething();
|
||||
</script>
|
||||
```
|
||||
|
||||
@@ -1,29 +0,0 @@
|
||||
Math {#language.math}
|
||||
====
|
||||
|
||||
Math can be applied directly to variable values.
|
||||
|
||||
|
||||
{$foo+1}
|
||||
|
||||
{$foo*$bar}
|
||||
|
||||
{* some more complicated examples *}
|
||||
|
||||
{$foo->bar-$bar[1]*$baz->foo->bar()-3*7}
|
||||
|
||||
{if ($foo+$bar.test%$baz*134232+10+$b+10)}
|
||||
|
||||
{$foo|truncate:"`$fooTruncCount/$barTruncFactor-1`"}
|
||||
|
||||
{assign var="foo" value="`$foo+$bar`"}
|
||||
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
> it is a good rule of thumb to keep the template syntax minimal and
|
||||
> focused on presentation. If you find your template syntax getting too
|
||||
> 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.
|
||||
@@ -1,9 +1,8 @@
|
||||
Attributes {#language.syntax.attributes}
|
||||
==========
|
||||
# Attributes
|
||||
|
||||
Most of the [functions](#language.syntax.functions) take attributes that
|
||||
Most of the [tags](./language-syntax-tags.md) take attributes that
|
||||
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
|
||||
without modifiers may also be used, and should not be in quotes. You can
|
||||
even use PHP function results, plugin results and complex expressions.
|
||||
@@ -12,35 +11,35 @@ Some attributes require boolean values (TRUE or FALSE). These can be
|
||||
specified as `true` and `false`. If an attribute has no value assigned
|
||||
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**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
|
||||
@@ -1,27 +1,25 @@
|
||||
Comments {#language.syntax.comments}
|
||||
========
|
||||
# Comments
|
||||
|
||||
Template comments are surrounded by asterisks, and that is surrounded by
|
||||
the [delimiter](#variable.left.delimiter) tags like so:
|
||||
the [delimiter](../../designers/language-basic-syntax/language-escaping.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,
|
||||
unlike `<!-- HTML comments -->`. These are useful for making internal
|
||||
notes in the templates which no one will see ;-)
|
||||
|
||||
|
||||
{* I am a Smarty comment, I don't exist in the compiled output *}
|
||||
<html>
|
||||
```smarty
|
||||
{* I am a Smarty comment, I don't exist in the compiled output *}
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title}</title>
|
||||
<title>{$title}</title>
|
||||
</head>
|
||||
<body>
|
||||
<body>
|
||||
|
||||
{* another single line smarty comment *}
|
||||
<!-- HTML comment that is sent to the browser -->
|
||||
@@ -66,6 +64,6 @@ notes in the templates which no one will see ;-)
|
||||
*}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
```
|
||||
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
Functions {#language.syntax.functions}
|
||||
=========
|
||||
|
||||
Every Smarty tag either prints a [variable](#language.variables) or
|
||||
invokes some sort of function. These are processed and displayed by
|
||||
enclosing the function and its [attributes](#language.syntax.attributes)
|
||||
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
|
||||
|
||||
|
||||
{config_load file="colors.conf"}
|
||||
|
||||
{include file="header.tpl"}
|
||||
{insert file="banner_ads.tpl" title="My Site"}
|
||||
|
||||
{if $logged_in}
|
||||
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
|
||||
{else}
|
||||
hi, {$name}
|
||||
{/if}
|
||||
|
||||
{include file="footer.tpl"}
|
||||
|
||||
|
||||
|
||||
- Both [built-in functions](#language.builtin.functions) and [custom
|
||||
functions](#language.custom.functions) have the same syntax within
|
||||
templates.
|
||||
|
||||
- Built-in functions are the **inner** workings of Smarty, such as
|
||||
[`{if}`](#language.function.if),
|
||||
[`{section}`](#language.function.section) and
|
||||
[`{strip}`](#language.function.strip). There should be no need to
|
||||
change or modify them.
|
||||
|
||||
- Custom functions are **additional** functions implemented via
|
||||
[plugins](#plugins). They can be modified to your liking, or you can
|
||||
create new ones. [`{html_options}`](#language.function.html.options)
|
||||
is an example of a custom function.
|
||||
|
||||
See also [`registerPlugin()`](#api.register.plugin)
|
||||
@@ -0,0 +1,64 @@
|
||||
# Operators
|
||||
|
||||
## Basic
|
||||
|
||||
Various basic operators can be applied directly to variable values.
|
||||
|
||||
## Examples
|
||||
```smarty
|
||||
{$foo + 1}
|
||||
|
||||
{$foo * $bar}
|
||||
|
||||
{$foo->bar - $bar[1] * $baz->foo->bar() -3 * 7}
|
||||
|
||||
{if ($foo + $bar.test % $baz * 134232 + 10 + $b + 10)}
|
||||
...
|
||||
{/if}
|
||||
|
||||
{$foo = $foo + $bar}
|
||||
```
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
> it is a good rule of thumb to keep the template syntax minimal and
|
||||
> focused on presentation. If you find your template syntax getting too
|
||||
> 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.
|
||||
|
||||
## Ternary
|
||||
You can use the `?:` (or ternary) operator to test one expression and present the value
|
||||
of the second or third expression, based on the result of the test.
|
||||
|
||||
In other words:
|
||||
```smarty
|
||||
{$test ? "OK" : "FAIL"}
|
||||
```
|
||||
will result in OK if `$test` is set to true, and in FAIL otherwise.
|
||||
|
||||
There is also a shorthand `?:` operator:
|
||||
```smarty
|
||||
{$myVar ?: "empty"}
|
||||
```
|
||||
will result in 'empty' if `$myVar` is not set or set to something that evaluates to false, such as an empty string.
|
||||
If `$myVar` is set to something that evaluates to true, the value of `$myVar` is returned. So, the following will
|
||||
return 'hello':
|
||||
```smarty
|
||||
{$myVar="hello"}
|
||||
{$myVar ?: "empty"}
|
||||
```
|
||||
|
||||
## Testing for null
|
||||
If "something that evaluates to false" is to broad a test for you, you can use the `??` (or null coalescing) operator
|
||||
to trigger only if the tested value is undefined or set to null.
|
||||
```smarty
|
||||
{$myVar ?? "empty"}
|
||||
```
|
||||
will result in 'empty' if `$myVar` is not set or set to null.
|
||||
If `$myVar` is set to something that evaluates to anything else, the value of `$myVar` is returned. So, the following will
|
||||
return an empty string (''):
|
||||
```smarty
|
||||
{$myVar=""}
|
||||
{$myVar ?: "this is not shown"}
|
||||
```
|
||||
@@ -1,55 +1,48 @@
|
||||
Embedding Vars in Double Quotes {#language.syntax.quotes}
|
||||
===============================
|
||||
# Embedding Vars in Double Quotes
|
||||
|
||||
- Smarty will recognize [assigned](#api.assign)
|
||||
[variables](#language.syntax.variables) embedded in \"double
|
||||
quotes\" so long as the variable name contains only numbers, letters
|
||||
and under\_scores. See [naming](&url.php-manual;language.variables)
|
||||
- Smarty will recognize [assigned](../../programmers/api-functions/api-assign.md)
|
||||
[variables](./language-syntax-variables.md) embedded in "double
|
||||
quotes" so long as the variable name contains only numbers, letters
|
||||
and under_scores. See [naming](https://www.php.net/language.variables)
|
||||
for more detail.
|
||||
|
||||
- With any other characters, for example a period(.) or
|
||||
`$object->reference`, then the variable must be surrounded by
|
||||
`` `backticks` ``.
|
||||
`$object->reference`, then the variable must be surrounded by `` `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
|
||||
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
|
||||
{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
|
||||
{* 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"}
|
||||
```
|
||||
|
||||
|
||||
|
||||
{* will replace $tpl_name with value *}
|
||||
{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**
|
||||
>
|
||||
> Although Smarty can handle some very complex expressions and syntax,
|
||||
@@ -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
|
||||
> 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).
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# Tags
|
||||
|
||||
Every Smarty tag either prints a [variable](./language-syntax-variables.md) or
|
||||
invokes some sort of function. These are processed and displayed by
|
||||
enclosing the function and its [attributes](./language-syntax-attributes.md)
|
||||
within delimiters like so: `{funcname attr1="val1" attr2="val2"}`.
|
||||
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{config_load file="colors.conf"}
|
||||
|
||||
{include file="header.tpl"}
|
||||
|
||||
{if $logged_in}
|
||||
Welcome, <span style="color:{#fontColor#}">{$name}!</span>
|
||||
{else}
|
||||
hi, {$name}
|
||||
{/if}
|
||||
|
||||
{include file="footer.tpl"}
|
||||
```
|
||||
|
||||
- Both [built-in functions](../language-builtin-functions/index.md) and [custom
|
||||
functions](../language-custom-functions/index.md) have the same syntax within
|
||||
templates.
|
||||
|
||||
- Built-in functions are the **inner** workings of Smarty, such as
|
||||
[`{if}`](../language-builtin-functions/language-function-if.md),
|
||||
[`{section}`](../language-builtin-functions/language-function-section.md) and
|
||||
[`{strip}`](../language-builtin-functions/language-function-strip.md). There should be no need to
|
||||
change or modify them.
|
||||
|
||||
- Custom tags are **additional** tags implemented via
|
||||
[plugins](../../api/extending/introduction.md). They can be modified to your liking, or you can
|
||||
create new ones. [`{html_options}`](../language-custom-functions/language-function-html-options.md)
|
||||
is an example of a custom function.
|
||||
|
||||
See also [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.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
|
||||
variable](&url.php-manual;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
|
||||
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
|
||||
\#hashmarks\#, or via the
|
||||
[`$smarty.config`](#language.variables.smarty.config) variable.
|
||||
\#hashmarks\#, or via the [`$smarty.config`](../language-variables/language-variables-smarty.md#smartyconfig-languagevariablessmartyconfig) variable.
|
||||
|
||||
## Examples
|
||||
|
||||
{$foo} <-- displaying a simple variable (non array/object)
|
||||
{$foo[4]} <-- display the 5th element of a zero-indexed array
|
||||
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
|
||||
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
|
||||
{$foo->bar} <-- display the object property "bar"
|
||||
{$foo->bar()} <-- display the return value of object method "bar"
|
||||
{#foo#} <-- display the config file variable "foo"
|
||||
{$smarty.config.foo} <-- synonym for {#foo#}
|
||||
{$foo[bar]} <-- syntax only valid in a section loop, see {section}
|
||||
{assign var=foo value='baa'}{$foo} <-- displays "baa", see {assign}
|
||||
```smarty
|
||||
{$foo} <-- displaying a simple variable (non array/object)
|
||||
{$foo[4]} <-- display the 5th element of a zero-indexed array
|
||||
{$foo.bar} <-- display the "bar" key value of an array, similar to PHP $foo['bar']
|
||||
{$foo.$bar} <-- display variable key value of an array, similar to PHP $foo[$bar]
|
||||
{$foo->bar} <-- display the object property "bar"
|
||||
{$foo->bar()} <-- display the return value of object method "bar"
|
||||
{#foo#} <-- display the config file variable "foo"
|
||||
{$smarty.config.foo} <-- synonym for {#foo#}
|
||||
{$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[4].baz}
|
||||
{$foo[4].$baz}
|
||||
{$foo.bar.baz[4]}
|
||||
{$foo->bar($baz,2,$bar)} <-- passing parameters
|
||||
{"foo"} <-- static values are allowed
|
||||
{$foo.bar.baz}
|
||||
{$foo.$bar.$baz}
|
||||
{$foo[4].baz}
|
||||
{$foo[4].$baz}
|
||||
{$foo.bar.baz[4]}
|
||||
{$foo->bar($baz,2,$bar)} <-- passing parameters
|
||||
{"foo"} <-- static values are allowed
|
||||
|
||||
{* display the server variable "SERVER_NAME" ($_SERVER['SERVER_NAME'])*}
|
||||
{$smarty.server.SERVER_NAME}
|
||||
{* display the server variable "SERVER_NAME" ($_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.
|
||||
{assign var=foo value=$x+$y} // in attributes
|
||||
{$foo[$x+3]} // as array index
|
||||
{$foo={counter}+3} // tags within tags
|
||||
{$foo="this is message {counter}"} // tags within double quoted strings
|
||||
{$x+$y} // will output the sum of x and y.
|
||||
{assign var=foo value=$x+$y} // in attributes
|
||||
{$foo[$x+3]} // as array index
|
||||
{$foo={counter}+3} // tags within tags
|
||||
{$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=['y'=>'yellow','b'=>'blue']}
|
||||
{assign var=foo value=[1,[9,8],3]} // can be nested
|
||||
{assign var=foo value=[1,2,3]}
|
||||
{assign var=foo value=['y'=>'yellow','b'=>'blue']}
|
||||
{assign var=foo value=[1,[9,8],3]} // can be nested
|
||||
|
||||
Short variable assignment:
|
||||
Short variable assignment:
|
||||
|
||||
{$foo=$bar+2}
|
||||
{$foo = strlen($bar)} // function in assignment
|
||||
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
|
||||
{$foo.bar=1} // assign to specific array element
|
||||
{$foo.bar.baz=1}
|
||||
{$foo[]=1} // appending to an array
|
||||
{$foo=$bar+2}
|
||||
{$foo = strlen($bar)} // function in assignment
|
||||
{$foo = myfunct( ($x+$y)*3 )} // as function parameter
|
||||
{$foo.bar=1} // assign to specific array element
|
||||
{$foo.bar.baz=1}
|
||||
{$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'] // with variable 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']
|
||||
{$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.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['bar']}
|
||||
{$foo['bar'][1]}
|
||||
{$foo[$x+$x]} // index may contain any expression
|
||||
{$foo[$bar[1]]} // nested index
|
||||
{$foo[section_name]} // smarty {section} access, not array access!
|
||||
{$foo[1]} // normal access
|
||||
{$foo['bar']}
|
||||
{$foo['bar'][1]}
|
||||
{$foo[$x+$x]} // index may contain any expression
|
||||
{$foo[$bar[1]]} // nested index
|
||||
{$foo[section_name]} // smarty {section} access, not array access!
|
||||
|
||||
Variable variables:
|
||||
Variable variables:
|
||||
|
||||
$foo // normal variable
|
||||
$foo_{$bar} // variable name containing other variable
|
||||
$foo_{$x+$y} // variable name containing expressions
|
||||
$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 // normal variable
|
||||
$foo_{$bar} // variable name containing other variable
|
||||
$foo_{$x+$y} // variable name containing expressions
|
||||
$foo_{$bar}_buh_{$blar} // variable name with multiple segments
|
||||
{$foo_{$x}} // will output the variable $foo_1 if $x has a value of 1.
|
||||
|
||||
Object chaining:
|
||||
Object chaining:
|
||||
|
||||
{$object->method1($x)->method2($y)}
|
||||
{$object->method1($x)->method2($y)}
|
||||
|
||||
Direct PHP function access:
|
||||
Direct PHP function access:
|
||||
|
||||
{time()}
|
||||
|
||||
|
||||
|
||||
{time()}
|
||||
```
|
||||
|
||||
> **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.
|
||||
|
||||
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
|
||||
variables](#language.config.variables)
|
||||
[`{assign}`](#language.function.assign) and [`assign()`](#api.assign).
|
||||
See also [`$smarty`](../language-variables/language-variables-smarty.md), [config
|
||||
variables](../language-variables/language-config-variables.md)
|
||||
[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`assign()`](../../programmers/api-functions/api-assign.md).
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
Built-in Functions {#language.builtin.functions}
|
||||
==================
|
||||
|
||||
## Table of contents
|
||||
- [{$var=...}](./language-builtin-functions/language-function-shortform-assign.md)
|
||||
- [{append}](./language-builtin-functions/language-function-append.md)
|
||||
- [{assign}](./language-builtin-functions/language-function-assign.md)
|
||||
- [{block}](./language-builtin-functions/language-function-block.md)
|
||||
- [{call}](./language-builtin-functions/language-function-call.md)
|
||||
- [{capture}](./language-builtin-functions/language-function-capture.md)
|
||||
- [{config_load}](./language-builtin-functions/language-function-config.load)
|
||||
- [{debug}](./language-builtin-functions/language-function-debug.md)
|
||||
- [{extends}](./language-builtin-functions/language-function-extends.md)
|
||||
- [{for}](./language-builtin-functions/language-function-for.md)
|
||||
- [{foreach},{foreachelse}](./language-builtin-functions/language-function-foreach.md)
|
||||
- [{function}](./language-builtin-functions/language-function-function.md)
|
||||
- [{if},{elseif},{else}](./language-builtin-functions/language-function-if.md)
|
||||
- [{include}](./language-builtin-functions/language-function-include.md)
|
||||
- [{include_php}](./language-builtin-functions/language-function-include.php)
|
||||
- [{insert}](./language-builtin-functions/language-function-insert.md)
|
||||
- [{ldelim},{rdelim}](./language-builtin-functions/language-function-ldelim.md)
|
||||
- [{literal}](./language-builtin-functions/language-function-literal.md)
|
||||
- [{nocache}](./language-builtin-functions/language-function-nocache.md)
|
||||
- [{section},{sectionelse}](./language-builtin-functions/language-function-section.md)
|
||||
- [{setfilter}](./language-builtin-functions/language-function-setfilter.md)
|
||||
- [{strip}](./language-builtin-functions/language-function-strip.md)
|
||||
- [{while}](./language-builtin-functions/language-function-while.md)
|
||||
|
||||
Smarty comes with several built-in functions. These built-in functions
|
||||
are the integral part of the smarty template engine. They are compiled
|
||||
into corresponding inline PHP code for maximum performance.
|
||||
|
||||
You cannot create your own [custom
|
||||
functions](./language-custom-functions.md) with the same name; and you
|
||||
should not need to modify the built-in functions.
|
||||
|
||||
A few of these functions have an `assign` attribute which collects the
|
||||
result the function to a named template variable instead of being
|
||||
output; much like the [`{assign}`](./language-builtin-functions/language-function-assign.md) function.
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
# Built-in Functions
|
||||
|
||||
Smarty comes with several built-in functions. These built-in functions
|
||||
are the integral part of the smarty template engine. They are compiled
|
||||
into corresponding inline PHP code for maximum performance.
|
||||
|
||||
You cannot create your own [custom tags](../language-custom-functions/index.md) with the same name; and you
|
||||
should not need to modify the built-in functions.
|
||||
|
||||
A few of these functions have an `assign` attribute which collects the
|
||||
result the function to a named template variable instead of being
|
||||
output; much like the [`{assign}`](language-function-assign.md) function.
|
||||
|
||||
- [{append}](language-function-append.md)
|
||||
- [{assign} or {$var=...}](language-function-assign.md)
|
||||
- [{block}](language-function-block.md)
|
||||
- [{call}](language-function-call.md)
|
||||
- [{capture}](language-function-capture.md)
|
||||
- [{config_load}](language-function-config-load.md)
|
||||
- [{debug}](language-function-debug.md)
|
||||
- [{extends}](language-function-extends.md)
|
||||
- [{for}](language-function-for.md)
|
||||
- [{foreach}, {foreachelse}](language-function-foreach.md)
|
||||
- [{function}](language-function-function.md)
|
||||
- [{if}, {elseif}, {else}](language-function-if.md)
|
||||
- [{include}](language-function-include.md)
|
||||
- [{insert}](language-function-insert.md)
|
||||
- [{ldelim}, {rdelim}](language-function-ldelim.md)
|
||||
- [{literal}](language-function-literal.md)
|
||||
- [{nocache}](language-function-nocache.md)
|
||||
- [{section}, {sectionelse}](language-function-section.md)
|
||||
- [{setfilter}](language-function-setfilter.md)
|
||||
- [{strip}](language-function-strip.md)
|
||||
- [{while}](language-function-while.md)
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
{append} {#language.function.append}
|
||||
========
|
||||
# {append}
|
||||
|
||||
`{append}` is used for creating or appending template variable arrays
|
||||
**during the execution of a template**.
|
||||
|
||||
## Attributes
|
||||
|
||||
| Attribute | Required | Description |
|
||||
|-----------|------------|----------------------------------------------------------------------------------------------------|
|
||||
| var | | The name of the variable being assigned |
|
||||
| value | | The value being assigned |
|
||||
| index | (optional) | The index for the new array element. If not specified the value is append to the end of the array. |
|
||||
| scope | (optional) | The scope of the assigned variable: parent, root or global. Defaults to local if omitted. |
|
||||
|
||||
## Option Flags
|
||||
|
||||
| Name | Description |
|
||||
|---------|-----------------------------------------------------|
|
||||
| nocache | Assigns the variable with the 'nocache' attribute |
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assignment of variables in-template is essentially placing application
|
||||
> logic into the presentation that may be better handled in PHP. Use at
|
||||
> your own discretion.
|
||||
|
||||
**Attributes:**
|
||||
## Examples
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ----------------------------------------------------------------------------------------------------
|
||||
var string Yes *n/a* The name of the variable being assigned
|
||||
value string Yes *n/a* The value being assigned
|
||||
index string No *n/a* The index for the new array element. If not specified the value is append to the end of the array.
|
||||
scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------------------
|
||||
nocache Assigns the variable with the \'nocache\' attribute
|
||||
|
||||
|
||||
{append var='name' value='Bob' index='first'}
|
||||
{append var='name' value='Meyer' index='last'}
|
||||
// or
|
||||
{append 'name' 'Bob' index='first'} {* short-hand *}
|
||||
{append 'name' 'Meyer' index='last'} {* short-hand *}
|
||||
|
||||
The first name is {$name.first}.<br>
|
||||
The last name is {$name.last}.
|
||||
```smarty
|
||||
{append var='name' value='Bob' index='first'}
|
||||
{append var='name' value='Meyer' index='last'}
|
||||
// or
|
||||
{append 'name' 'Bob' index='first'} {* short-hand *}
|
||||
{append 'name' 'Meyer' index='last'} {* short-hand *}
|
||||
|
||||
The first name is {$name.first}.<br>
|
||||
The last name is {$name.last}.
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
@@ -1,149 +1,146 @@
|
||||
{assign} {#language.function.assign}
|
||||
========
|
||||
# {assign}, {$var=...}
|
||||
|
||||
`{assign}` is used for assigning template variables **during the
|
||||
`{assign}` or `{$var=...}` is used for assigning template variables **during the
|
||||
execution of a template**.
|
||||
|
||||
## Attributes of the {assign} syntax
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|------------|-----------------------------------------------------------------------|
|
||||
| var | | The name of the variable being assigned |
|
||||
| value | | The value being assigned |
|
||||
| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
|
||||
|
||||
## Attributes of the {$var=...} syntax
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|------------|-----------------------------------------------------------------------|
|
||||
| scope | (optional) | The scope of the assigned variable: \'parent\',\'root\' or \'global\' |
|
||||
|
||||
## Option Flags
|
||||
| Name | Description |
|
||||
|---------|---------------------------------------------------|
|
||||
| nocache | Assigns the variable with the 'nocache' attribute |
|
||||
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assignment of variables in-template is essentially placing application
|
||||
> logic into the presentation that may be better handled in PHP. Use at
|
||||
> your own discretion.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> See also the [`short-form`](#language.function.shortform.assign)
|
||||
> method of assigning template vars.
|
||||
## Examples
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- -----------------------------------------------------------------------
|
||||
var string Yes *n/a* The name of the variable being assigned
|
||||
value string Yes *n/a* The value being assigned
|
||||
scope string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------------------
|
||||
nocache Assigns the variable with the \'nocache\' attribute
|
||||
|
||||
|
||||
{assign var="name" value="Bob"}
|
||||
{assign "name" "Bob"} {* short-hand *}
|
||||
|
||||
The value of $name is {$name}.
|
||||
```smarty
|
||||
{assign var="name" value="Bob"} {* or *}
|
||||
{assign "name" "Bob"} {* short-hand, or *}
|
||||
{$name='Bob'}
|
||||
|
||||
The value of $name is {$name}.
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
The value of $name is Bob.
|
||||
|
||||
|
||||
```
|
||||
The value of $name is Bob.
|
||||
```
|
||||
|
||||
|
||||
{assign var="name" value="Bob" nocache}
|
||||
{assign "name" "Bob" nocache} {* short-hand *}
|
||||
|
||||
The value of $name is {$name}.
|
||||
|
||||
|
||||
```smarty
|
||||
{assign var="name" value="Bob" nocache} {* or *}
|
||||
{assign "name" "Bob" nocache} {* short-hand, or *}
|
||||
{$name='Bob' nocache}
|
||||
|
||||
The value of $name is {$name}.
|
||||
```
|
||||
The above example will output:
|
||||
|
||||
|
||||
The value of $name is Bob.
|
||||
|
||||
```
|
||||
The value of $name is Bob.
|
||||
```
|
||||
|
||||
|
||||
|
||||
{assign var=running_total value=$running_total+$some_array[$row].some_value}
|
||||
|
||||
|
||||
```smarty
|
||||
{assign var=running_total value=$running_total+$some_array[$row].some_value} {* or *}
|
||||
{$running_total=$running_total+$some_array[row].some_value}
|
||||
```
|
||||
|
||||
Variables assigned in the included template will be seen in the
|
||||
including template.
|
||||
|
||||
```smarty
|
||||
{include file="sub_template.tpl"}
|
||||
|
||||
{include file="sub_template.tpl"}
|
||||
...
|
||||
{* display variable assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
...
|
||||
{* display variable assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
```
|
||||
|
||||
|
||||
The template above includes the example `sub_template.tpl` below:
|
||||
|
||||
The template above includes the example `sub_template.tpl` below
|
||||
```smarty
|
||||
|
||||
{* foo will be known also in the including template *}
|
||||
{assign var="foo" value="something" scope=parent}
|
||||
{$foo="something" scope=parent}
|
||||
|
||||
...
|
||||
{* foo will be known also in the including template *}
|
||||
{assign var="foo" value="something" scope=parent}
|
||||
{* bar is assigned only local in the including template *}
|
||||
{assign var="bar" value="value"}
|
||||
...
|
||||
{* bar is assigned only local in the including template *}
|
||||
{assign var="bar" value="value"} {* or *}
|
||||
{$var="value"}
|
||||
|
||||
```
|
||||
|
||||
You can assign a variable to root of the current root tree. The variable
|
||||
is seen by all templates using the same root tree.
|
||||
|
||||
|
||||
{assign var=foo value="bar" scope="root"}
|
||||
|
||||
```smarty
|
||||
{assign var=foo value="bar" scope="root"}
|
||||
```
|
||||
|
||||
|
||||
A global variable is seen by all templates.
|
||||
|
||||
|
||||
{assign var=foo value="bar" scope="global"}
|
||||
{assign "foo" "bar" scope="global"} {* short-hand *}
|
||||
|
||||
|
||||
|
||||
```smarty
|
||||
{assign var=foo value="bar" scope="global"} {* or *}
|
||||
{assign "foo" "bar" scope="global"} {* short-hand, or *}
|
||||
{$foo="bar" scope="global"}
|
||||
```
|
||||
|
||||
To access `{assign}` variables from a php script use
|
||||
[`getTemplateVars()`](#api.get.template.vars). Here\'s the template that
|
||||
creates the variable `$foo`.
|
||||
[`getTemplateVars()`](../../programmers/api-functions/api-get-template-vars.md).
|
||||
Here's the template that creates the variable `$foo`.
|
||||
|
||||
|
||||
{assign var="foo" value="Smarty"}
|
||||
```smarty
|
||||
{assign var="foo" value="Smarty"} {* or *}
|
||||
{$foo="Smarty"}
|
||||
```
|
||||
|
||||
The template variables are only available after/during template
|
||||
execution as in the following script.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
<?php
|
||||
// this will output nothing as the template has not been executed
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
|
||||
// this will output nothing as the template has not been executed
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
// fetch the template to a variable
|
||||
$whole_page = $smarty->fetch('index.tpl');
|
||||
|
||||
// fetch the template to a variable
|
||||
$whole_page = $smarty->fetch('index.tpl');
|
||||
// this will output 'smarty' as the template has been executed
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
|
||||
// this will output 'smarty' as the template has been executed
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
$smarty->assign('foo','Even smarter');
|
||||
|
||||
$smarty->assign('foo','Even smarter');
|
||||
// this will output 'Even smarter'
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
```
|
||||
|
||||
// this will output 'Even smarter'
|
||||
echo $smarty->getTemplateVars('foo');
|
||||
|
||||
?>
|
||||
|
||||
The following functions can also *optionally* assign template variables.
|
||||
|
||||
[`{capture}`](#language.function.capture),
|
||||
The following functions can also *optionally* assign template variables: [`{capture}`](#language.function.capture),
|
||||
[`{include}`](#language.function.include),
|
||||
[`{include_php}`](#language.function.include.php),
|
||||
[`{insert}`](#language.function.insert),
|
||||
[`{counter}`](#language.function.counter),
|
||||
[`{cycle}`](#language.function.cycle),
|
||||
[`{eval}`](#language.function.eval),
|
||||
[`{fetch}`](#language.function.fetch),
|
||||
[`{math}`](#language.function.math),
|
||||
[`{textformat}`](#language.function.textformat)
|
||||
[`{math}`](#language.function.math) and
|
||||
[`{textformat}`](#language.function.textformat).
|
||||
|
||||
See also [`{$var=...}`](#language.function.shortform.assign),
|
||||
See also [`{append}`](./language-function-append.md),
|
||||
[`assign()`](#api.assign) and
|
||||
[`getTemplateVars()`](#api.get.template.vars).
|
||||
|
||||
@@ -1,191 +1,201 @@
|
||||
{block} {#language.function.block}
|
||||
=======
|
||||
# {block}
|
||||
|
||||
`{block}` is used to define a named area of template source for template
|
||||
inheritance. For details see section of [Template
|
||||
Interitance](#advanced.features.template.inheritance).
|
||||
Inheritance](../../api/inheritance.md).
|
||||
|
||||
The `{block}` template source area of a child template will replace the
|
||||
correponding areas in the parent template(s).
|
||||
corresponding areas in the parent template(s).
|
||||
|
||||
Optionally `{block}` areas of child and parent templates can be merged
|
||||
into each other. You can append or prepend the parent `{block}` content
|
||||
by using the `append` or `prepend` option flag with the childs `{block}`
|
||||
definition. With the {\$smarty.block.parent} the `{block}` content of
|
||||
by using the `append` or `prepend` option flag with the child's `{block}`
|
||||
definition. With `{$smarty.block.parent}` the `{block}` content of
|
||||
the parent template can be inserted at any location of the child
|
||||
`{block}` content. {\$smarty.block.child} inserts the `{block}` content
|
||||
`{block}` content. `{$smarty.block.child}` inserts the `{block}` content
|
||||
of the child template at any location of the parent `{block}`.
|
||||
|
||||
`{blocks}'s` can be nested.
|
||||
|
||||
**Attributes:**
|
||||
## Attributes
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ---------------------------------------
|
||||
name string Yes *n/a* The name of the template source block
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|----------------------------------------------------------------------------------------------------------------------|
|
||||
| name | yes | The name of the template source block |
|
||||
| assign | no | The name of variable to assign the output of the block to. |
|
||||
|
||||
**Option Flags (in child templates only):**
|
||||
> **Note**
|
||||
>
|
||||
> The assign attribute only works on the block that actually gets executed, so you may need
|
||||
> to add it to each child block as well.
|
||||
|
||||
Name Description
|
||||
--------- -------------------------------------------------------------------------------------------
|
||||
append The `{block}` content will be be appended to the content of the parent template `{block}`
|
||||
prepend The `{block}` content will be prepended to the content of the parent template `{block}`
|
||||
hide Ignore the block content if no child block of same name is existing.
|
||||
nocache Disables caching of the `{block}` content
|
||||
|
||||
## Option Flags (in child templates only):
|
||||
|
||||
| Name | Description |
|
||||
|---------|-----------------------------------------------------------------------------------------|
|
||||
| append | The `{block}` content will be appended to the content of the parent template `{block}` |
|
||||
| prepend | The `{block}` content will be prepended to the content of the parent template `{block}` |
|
||||
| hide | Ignore the block content if no child block of same name is existing. |
|
||||
| nocache | Disables caching of the `{block}` content |
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}Default Title{/block}</title>
|
||||
<title>{block "title"}Default Title{/block}</title> {* short-hand *}
|
||||
</head>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title"}
|
||||
Page Title
|
||||
{/block}
|
||||
|
||||
```
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>Page Title</title>
|
||||
</head>
|
||||
</html>
|
||||
```
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}Title - {/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title" prepend}
|
||||
Page Title
|
||||
{block name="title" append}
|
||||
Page Title
|
||||
{/block}
|
||||
|
||||
```
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>Title - Page Title</title>
|
||||
</head>
|
||||
</html>
|
||||
```
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"} is my title{/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title" append}
|
||||
{block name="title" prepend}
|
||||
Page Title
|
||||
{/block}
|
||||
|
||||
```
|
||||
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>Page title is my titel</title>
|
||||
</head>
|
||||
</html>
|
||||
```
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}The {$smarty.block.child} was inserted here{/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title"}
|
||||
Child Title
|
||||
Child Title
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>The Child Title was inserted here</title>
|
||||
</head>
|
||||
</html>
|
||||
```
|
||||
|
||||
parent.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{block name="title"}Parent Title{/block}</title>
|
||||
</head>
|
||||
</html>
|
||||
|
||||
```
|
||||
|
||||
|
||||
child.tpl
|
||||
|
||||
|
||||
```smarty
|
||||
{extends file="parent.tpl"}
|
||||
{block name="title"}
|
||||
You will see now - {$smarty.block.parent} - here
|
||||
You will see now - {$smarty.block.parent} - here
|
||||
{/block}
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
The result would look like
|
||||
|
||||
|
||||
```html
|
||||
<html>
|
||||
<head>
|
||||
<title>You will see now - Parent Title - here</title>
|
||||
</head>
|
||||
</html>
|
||||
```
|
||||
|
||||
See also [Template
|
||||
Inheritance](#advanced.features.template.inheritance),
|
||||
[`$smarty.block.parent`](#language.variables.smarty.block.parent),
|
||||
[`$smarty.block.child`](#language.variables.smarty.block.child), and
|
||||
[`{extends}`](#language.function.extends)
|
||||
Inheritance](../../api/inheritance.md),
|
||||
[`$smarty.block.parent`](../language-variables/language-variables-smarty.md#smartyblockparent-languagevariablessmartyblockparent),
|
||||
[`$smarty.block.child`](../language-variables/language-variables-smarty.md#smartyblockchild-languagevariablessmartyblockchild), and
|
||||
[`{extends}`](./language-function-extends.md)
|
||||
|
||||
@@ -1,39 +1,41 @@
|
||||
{call} {#language.function.call}
|
||||
======
|
||||
# {call}
|
||||
|
||||
`{call}` is used to call a template function defined by the
|
||||
[`{function}`](#language.function.function) tag just like a plugin
|
||||
[`{function}`](./language-function-function.md) tag just like a plugin
|
||||
function.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> 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}` tag must
|
||||
> be used to call a template function defined externally from the given
|
||||
> template. Otherwise you can directly use the function as
|
||||
> `{funcname ...}` in the template.
|
||||
|
||||
- The `{call}` tag must have the `name` attribute which contains the
|
||||
the name of the template function.
|
||||
name of the template function.
|
||||
|
||||
- Values for variables can be passed to the template function as
|
||||
[attributes](#language.syntax.attributes).
|
||||
[attributes](../language-basic-syntax/language-syntax-attributes.md).
|
||||
|
||||
**Attributes:**
|
||||
## Attributes
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------------- ---------- --------- ------------------------------------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the template function
|
||||
assign string No *n/a* The name of the variable that the output of called template function will be assigned to
|
||||
\[var \...\] \[var type\] No *n/a* variable to pass local to template function
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|------------------------------------------------------------------------------------------|
|
||||
| name | Yes | The name of the template function |
|
||||
| assign | No | The name of the variable that the output of called template function will be assigned to |
|
||||
| [var ...] | No | variable to pass local to template function |
|
||||
|
||||
**Option Flags:**
|
||||
## Option Flags
|
||||
|
||||
Name Description
|
||||
--------- --------------------------------------------
|
||||
nocache Call the template function in nocache mode
|
||||
| Name | Description |
|
||||
|---------|--------------------------------------------|
|
||||
| nocache | Call the template function in nocache mode |
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{* define the function *}
|
||||
{function name=menu level=0}
|
||||
<ul class="level{$level}">
|
||||
@@ -55,12 +57,12 @@ function.
|
||||
{* run the array through the function *}
|
||||
{call name=menu data=$menu}
|
||||
{call menu data=$menu} {* short-hand *}
|
||||
|
||||
|
||||
```
|
||||
|
||||
|
||||
Will generate the following output
|
||||
|
||||
|
||||
```
|
||||
* item1
|
||||
* item2
|
||||
* item3
|
||||
@@ -70,7 +72,6 @@ Will generate the following output
|
||||
+ item3-3-1
|
||||
+ item3-3-2
|
||||
* item4
|
||||
```
|
||||
|
||||
|
||||
|
||||
See also [`{function}`](#language.function.function)
|
||||
See also [`{function}`](./language-function-function.md).
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{capture} {#language.function.capture}
|
||||
=========
|
||||
# {capture}
|
||||
|
||||
`{capture}` is used to collect the output of the template between the
|
||||
tags into a variable instead of displaying it. Any content between
|
||||
@@ -7,76 +6,70 @@ tags into a variable instead of displaying it. Any content between
|
||||
specified in the `name` attribute.
|
||||
|
||||
The captured content can be used in the template from the variable
|
||||
[`$smarty.capture.foo`](#language.variables.smarty.capture) where "foo"
|
||||
[`$smarty.capture.foo`](../language-variables/language-variables-smarty.md#smartycapture-languagevariablessmartycapture) where "foo"
|
||||
is the value passed in the `name` attribute. If you do not supply the
|
||||
`name` attribute, then "default" will be used as the name ie
|
||||
`$smarty.capture.default`.
|
||||
|
||||
`{capture}'s` can be nested.
|
||||
|
||||
**Attributes:**
|
||||
## Attributes
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ----------------------------------------------------------------------
|
||||
name string Yes *n/a* The name of the captured block
|
||||
assign string No *n/a* The variable name where to assign the captured output to
|
||||
append string No *n/a* The name of an array variable where to append the captured output to
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|----------------------------------------------------------------------|
|
||||
| name | Yes | The name of the captured block |
|
||||
| assign | No | The variable name where to assign the captured output to |
|
||||
| append | No | The name of an array variable where to append the captured output to |
|
||||
|
||||
**Option Flags:**
|
||||
## Option Flags
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------
|
||||
nocache Disables caching of this captured block
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Be careful when capturing [`{insert}`](#language.function.insert)
|
||||
> output. If you have [`$caching`](#caching) enabled and you have
|
||||
> [`{insert}`](#language.function.insert) commands that you expect to
|
||||
> run within cached content, do not capture this content.
|
||||
| Name | Description |
|
||||
|---------|-----------------------------------------|
|
||||
| nocache | Disables caching of this captured block |
|
||||
|
||||
|
||||
{* we don't want to print a div tag unless content is displayed *}
|
||||
{capture name="banner"}
|
||||
{capture "banner"} {* short-hand *}
|
||||
{include file="get_banner.tpl"}
|
||||
{/capture}
|
||||
## Examples
|
||||
|
||||
{if $smarty.capture.banner ne ""}
|
||||
<div id="banner">{$smarty.capture.banner}</div>
|
||||
{/if}
|
||||
|
||||
|
||||
```smarty
|
||||
{* we don't want to print a div tag unless content is displayed *}
|
||||
{capture name="banner"}
|
||||
{capture "banner"} {* short-hand *}
|
||||
{include file="get_banner.tpl"}
|
||||
{/capture}
|
||||
|
||||
{if $smarty.capture.banner ne ""}
|
||||
<div id="banner">{$smarty.capture.banner}</div>
|
||||
{/if}
|
||||
```
|
||||
|
||||
This example demonstrates the capture function.
|
||||
```smarty
|
||||
|
||||
|
||||
{capture name=some_content assign=popText}
|
||||
{capture some_content assign=popText} {* short-hand *}
|
||||
The server is {$my_server_name|upper} at {$my_server_addr}<br>
|
||||
Your ip is {$my_ip}.
|
||||
{/capture}
|
||||
<a href="#">{$popText}</a>
|
||||
|
||||
{capture name=some_content assign=popText}
|
||||
{capture some_content assign=popText} {* short-hand *}
|
||||
The server is {$my_server_name|upper} at {$my_server_addr}<br>
|
||||
Your ip is {$my_ip}.
|
||||
{/capture}
|
||||
<a href="#">{$popText}</a>
|
||||
```
|
||||
|
||||
|
||||
This example also demonstrates how multiple calls of capture can be used
|
||||
to create an array with captured content.
|
||||
|
||||
|
||||
{capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
|
||||
{foreach $foo as $text}{$text} {/foreach}
|
||||
|
||||
|
||||
```smarty
|
||||
{capture append="foo"}hello{/capture}I say just {capture append="foo"}world{/capture}
|
||||
{foreach $foo as $text}{$text} {/foreach}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
I say just hello world
|
||||
|
||||
```
|
||||
I say just hello world
|
||||
```
|
||||
|
||||
|
||||
See also [`$smarty.capture`](#language.variables.smarty.capture),
|
||||
[`{eval}`](#language.function.eval),
|
||||
[`{fetch}`](#language.function.fetch), [`fetch()`](#api.fetch) and
|
||||
[`{assign}`](#language.function.assign).
|
||||
See also [`$smarty.capture`](../language-variables/language-variables-smarty.md#smartycapture-languagevariablessmartycapture),
|
||||
[`{eval}`](../language-custom-functions/language-function-eval.md),
|
||||
[`{fetch}`](../language-custom-functions/language-function-fetch.md), [`fetch()`](../../programmers/api-functions/api-fetch.md) and
|
||||
[`{assign}`](./language-function-assign.md).
|
||||
|
||||
@@ -1,56 +1,55 @@
|
||||
{config\_load} {#language.function.config.load}
|
||||
==============
|
||||
# {config_load}
|
||||
|
||||
`{config_load}` is used for loading config
|
||||
[`#variables#`](#language.config.variables) from a [configuration
|
||||
file](#config.files) into the template.
|
||||
[`#variables#`](#language.config.variables) from a [configuration file](#config.files) into the template.
|
||||
|
||||
**Attributes:**
|
||||
## Attributes
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
file string Yes *n/a* The name of the config file to include
|
||||
section string No *n/a* The name of the section to load
|
||||
scope string no *local* 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.
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| file | Yes | The name of the config file to include |
|
||||
| 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. |
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
The `example.conf` file.
|
||||
|
||||
```ini
|
||||
#this is config file comment
|
||||
|
||||
#this is config file comment
|
||||
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
bodyBgColor = #000000
|
||||
tableBgColor = #000000
|
||||
rowBgColor = #00ff00
|
||||
|
||||
#customer variables section
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
# global variables
|
||||
pageTitle = "Main Menu"
|
||||
bodyBgColor = #000000
|
||||
tableBgColor = #000000
|
||||
rowBgColor = #00ff00
|
||||
|
||||
#customer variables section
|
||||
[Customer]
|
||||
pageTitle = "Customer Info"
|
||||
```
|
||||
|
||||
|
||||
and the template
|
||||
|
||||
```smarty
|
||||
{config_load file="example.conf"}
|
||||
{config_load "example.conf"} {* short-hand *}
|
||||
|
||||
{config_load file="example.conf"}
|
||||
{config_load "example.conf"} {* short-hand *}
|
||||
|
||||
<html>
|
||||
<html>
|
||||
<title>{#pageTitle#|default:"No title"}</title>
|
||||
<body bgcolor="{#bodyBgColor#}">
|
||||
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||
<tr bgcolor="{#rowBgColor#}">
|
||||
<td>First</td>
|
||||
<td>Last</td>
|
||||
<td>Address</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||
<tr bgcolor="{#rowBgColor#}">
|
||||
<td>First</td>
|
||||
<td>Last</td>
|
||||
<td>Address</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
```
|
||||
|
||||
|
||||
[Config Files](#config.files) may also contain sections. You can load
|
||||
variables from within a section with the added attribute `section`. Note
|
||||
that global config variables are always loaded along with section
|
||||
@@ -59,33 +58,31 @@ variables, and same-named section variables overwrite the globals.
|
||||
> **Note**
|
||||
>
|
||||
> Config file *sections* and the built-in template function called
|
||||
> [`{section}`](#language.function.section) have nothing to do with each
|
||||
> [`{section}`](../language-builtin-functions/language-function-section.md) have nothing to do with each
|
||||
> other, they just happen to share a common naming convention.
|
||||
|
||||
```smarty
|
||||
{config_load file='example.conf' section='Customer'}
|
||||
{config_load 'example.conf' 'Customer'} {* short-hand *}
|
||||
|
||||
{config_load file='example.conf' section='Customer'}
|
||||
{config_load 'example.conf' 'Customer'} {* short-hand *}
|
||||
|
||||
<html>
|
||||
<html>
|
||||
<title>{#pageTitle#}</title>
|
||||
<body bgcolor="{#bodyBgColor#}">
|
||||
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||
<tr bgcolor="{#rowBgColor#}">
|
||||
<td>First</td>
|
||||
<td>Last</td>
|
||||
<td>Address</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table border="{#tableBorderSize#}" bgcolor="{#tableBgColor#}">
|
||||
<tr bgcolor="{#rowBgColor#}">
|
||||
<td>First</td>
|
||||
<td>Last</td>
|
||||
<td>Address</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
```
|
||||
|
||||
|
||||
|
||||
See [`$config_overwrite`](#variable.config.overwrite) to create arrays
|
||||
See [`$config_overwrite`](../../programmers/api-variables/variable-config-overwrite.md) to create arrays
|
||||
of config file variables.
|
||||
|
||||
See also the [config files](#config.files) page, [config
|
||||
variables](#language.config.variables) page,
|
||||
[`$config_dir`](#variable.config.dir),
|
||||
[`getConfigVars()`](#api.get.config.vars) and
|
||||
[`configLoad()`](#api.config.load).
|
||||
See also the [config files](../config-files.md) page, [config variables](../language-variables/language-config-variables.md) page,
|
||||
[`$config_dir`](../../programmers/api-variables/variable-config-dir.md),
|
||||
[`getConfigVars()`](../../programmers/api-functions/api-get-config-vars.md) and
|
||||
[`configLoad()`](../../programmers/api-functions/api-config-load.md).
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
{debug} {#language.function.debug}
|
||||
=======
|
||||
# {debug}
|
||||
|
||||
`{debug}` dumps the debug console to the page. This works regardless of
|
||||
the [debug](#chapter.debugging.console) settings in the php script.
|
||||
the [debug](../chapter-debugging-console.md) settings in the php script.
|
||||
Since this gets executed at runtime, this is only able to show the
|
||||
[assigned](#api.assign) variables; not the templates that are in use.
|
||||
[assigned](../../programmers/api-functions/api-assign.md) variables; not the templates that are in use.
|
||||
However, you can see all the currently available variables within the
|
||||
scope of a template.
|
||||
|
||||
@@ -15,4 +14,4 @@ In order to see also the variables which have been locally assigned
|
||||
within the template it does make sense to place the `{debug}` tag at the
|
||||
end of the template.
|
||||
|
||||
See also the [debugging console page](#chapter.debugging.console).
|
||||
See also the [debugging console page](../chapter-debugging-console.md).
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
{extends} {#language.function.extends}
|
||||
=========
|
||||
# {extends}
|
||||
|
||||
`{extends}` tags are used in child templates in template inheritance for
|
||||
extending parent templates. For details see section of [Template
|
||||
Interitance](#advanced.features.template.inheritance).
|
||||
Inheritance](../../api/inheritance.md).
|
||||
|
||||
- The `{extends}` tag must be on the first line of the template.
|
||||
|
||||
@@ -11,27 +10,28 @@ Interitance](#advanced.features.template.inheritance).
|
||||
tag it may contain only `{block}` tags. Any other template content
|
||||
is ignored.
|
||||
|
||||
- Use the syntax for [template resources](#resources) to extend files
|
||||
outside of the [`$template_dir`](#variable.template.dir) directory.
|
||||
- Use the syntax for [template resources](../../api/resources.md) to extend files
|
||||
outside the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md) directory.
|
||||
|
||||
## Attributes
|
||||
|
||||
| Attribute | Required | Description |
|
||||
|-----------|----------|-------------------------------------------------|
|
||||
| file | Yes | The name of the template file which is extended |
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> When extending a variable parent like `{extends file=$parent_file}`,
|
||||
> make sure you include `$parent_file` in the
|
||||
> [`$compile_id`](#variable.compile.id). Otherwise Smarty cannot
|
||||
> [`$compile_id`](../../programmers/api-variables/variable-compile-id.md). Otherwise, Smarty cannot
|
||||
> distinguish between different `$parent_file`s.
|
||||
|
||||
**Attributes:**
|
||||
## Examples
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- -------------------------------------------------
|
||||
file string Yes *n/a* The name of the template file which is extended
|
||||
```smarty
|
||||
{extends file='parent.tpl'}
|
||||
{extends 'parent.tpl'} {* short-hand *}
|
||||
```
|
||||
|
||||
|
||||
{extends file='parent.tpl'}
|
||||
{extends 'parent.tpl'} {* short-hand *}
|
||||
|
||||
|
||||
|
||||
See also [Template Interitance](#advanced.features.template.inheritance)
|
||||
and [`{block}`](#language.function.block).
|
||||
See also [Template Inheritance](../../api/inheritance.md)
|
||||
and [`{block}`](./language-function-block.md).
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
{for} {#language.function.for}
|
||||
=====
|
||||
# {for}
|
||||
|
||||
The `{for}{forelse}` tag is used to create simple loops. The following
|
||||
different formarts are supported:
|
||||
The `{for}{forelse}` tag is used to create simple loops. The following different formats are supported:
|
||||
|
||||
- `{for $var=$start to $end}` simple loop with step size of 1.
|
||||
|
||||
@@ -11,87 +9,83 @@ different formarts are supported:
|
||||
|
||||
`{forelse}` is executed when the loop is not iterated.
|
||||
|
||||
**Attributes:**
|
||||
## Attributes
|
||||
|
||||
Attribute Name Shorthand Type Required Default Description
|
||||
---------------- ----------- --------- ---------- --------- --------------------------------
|
||||
max n/a integer No *n/a* Limit the number of iterations
|
||||
| Attribute | Required | Description |
|
||||
|-----------|----------|--------------------------------|
|
||||
| max | No | Limit the number of iterations |
|
||||
|
||||
**Option Flags:**
|
||||
## Option Flags
|
||||
|
||||
Name Description
|
||||
--------- --------------------------------------
|
||||
nocache Disables caching of the `{for}` loop
|
||||
| Name | Description |
|
||||
|---------|--------------------------------------|
|
||||
| nocache | Disables caching of the `{for}` loop |
|
||||
|
||||
## Examples
|
||||
|
||||
<ul>
|
||||
```smarty
|
||||
<ul>
|
||||
{for $foo=1 to 3}
|
||||
<li>{$foo}</li>
|
||||
{/for}
|
||||
</ul>
|
||||
|
||||
</ul>
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<ul>
|
||||
<li>1</li>
|
||||
<li>2</li>
|
||||
<li>3</li>
|
||||
</ul>
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li>1</li>
|
||||
<li>2</li>
|
||||
<li>3</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
|
||||
|
||||
$smarty->assign('to',10);
|
||||
|
||||
|
||||
|
||||
|
||||
<ul>
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('to',10);
|
||||
```
|
||||
|
||||
```smarty
|
||||
<ul>
|
||||
{for $foo=3 to $to max=3}
|
||||
<li>{$foo}</li>
|
||||
{/for}
|
||||
</ul>
|
||||
|
||||
|
||||
</ul>
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li>3</li>
|
||||
<li>4</li>
|
||||
<li>5</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
<ul>
|
||||
<li>3</li>
|
||||
<li>4</li>
|
||||
<li>5</li>
|
||||
</ul>
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('start',10);
|
||||
$smarty->assign('to',5);
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
$smarty->assign('start',10);
|
||||
$smarty->assign('to',5);
|
||||
|
||||
|
||||
|
||||
|
||||
<ul>
|
||||
```smarty
|
||||
<ul>
|
||||
{for $foo=$start to $to}
|
||||
<li>{$foo}</li>
|
||||
{forelse}
|
||||
no iteration
|
||||
{/for}
|
||||
</ul>
|
||||
|
||||
|
||||
</ul>
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
no iteration
|
||||
|
||||
```
|
||||
no iteration
|
||||
```
|
||||
|
||||
|
||||
See also [`{foreach}`](#language.function.foreach),
|
||||
[`{section}`](#language.function.section) and
|
||||
[`{while}`](#language.function.while)
|
||||
See also [`{foreach}`](./language-function-foreach.md),
|
||||
[`{section}`](./language-function-section.md) and
|
||||
[`{while}`](./language-function-while.md)
|
||||
|
||||
@@ -1,15 +1,30 @@
|
||||
{foreach},{foreachelse} {#language.function.foreach}
|
||||
=======================
|
||||
# {foreach},{foreachelse}
|
||||
|
||||
`{foreach}` is used for looping over arrays of data. `{foreach}` has a
|
||||
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.
|
||||
|
||||
`{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**
|
||||
>
|
||||
> 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`
|
||||
variable.
|
||||
|
||||
- `{foreach}` properties are [`@index`](#foreach.property.index),
|
||||
[`@iteration`](#foreach.property.iteration),
|
||||
[`@first`](#foreach.property.first),
|
||||
[`@last`](#foreach.property.last),
|
||||
[`@show`](#foreach.property.show),
|
||||
[`@total`](#foreach.property.total).
|
||||
- `{foreach}` properties are [`@index`](#index),
|
||||
[`@iteration`](#iteration),
|
||||
[`@first`](#first),
|
||||
[`@last`](#last),
|
||||
[`@show`](#show),
|
||||
[`@total`](#total).
|
||||
|
||||
- `{foreach}` constructs are [`{break}`](#foreach.construct.break),
|
||||
[`{continue}`](#foreach.construct.continue).
|
||||
- `{foreach}` constructs are [`{break}`](#break),
|
||||
[`{continue}`](#continue).
|
||||
|
||||
- Instead of specifying the `key` variable you can access the current
|
||||
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
|
||||
> available as `$myValue@key` within the foreach loop.
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- ------------------------------------------
|
||||
nocache Disables caching of the `{foreach}` loop
|
||||
|
||||
|
||||
<?php
|
||||
$arr = array('red', 'green', 'blue');
|
||||
$smarty->assign('myColors', $arr);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$arr = array('red', 'green', 'blue');
|
||||
$smarty->assign('myColors', $arr);
|
||||
```
|
||||
|
||||
Template to output `$myColors` in an un-ordered list
|
||||
|
||||
|
||||
<ul>
|
||||
```smarty
|
||||
<ul>
|
||||
{foreach $myColors as $color}
|
||||
<li>{$color}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
|
||||
</ul>
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li>red</li>
|
||||
<li>green</li>
|
||||
<li>blue</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
<ul>
|
||||
<li>red</li>
|
||||
<li>green</li>
|
||||
<li>blue</li>
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
|
||||
$smarty->assign('myPeople', $people);
|
||||
?>
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$people = array('fname' => 'John', 'lname' => 'Doe', 'email' => 'j.doe@example.com');
|
||||
$smarty->assign('myPeople', $people);
|
||||
```
|
||||
|
||||
Template to output `$myArray` as key/value pairs.
|
||||
|
||||
|
||||
<ul>
|
||||
```smarty
|
||||
<ul>
|
||||
{foreach $myPeople as $value}
|
||||
<li>{$value@key}: {$value}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<ul>
|
||||
<li>fname: John</li>
|
||||
<li>lname: Doe</li>
|
||||
<li>email: j.doe@example.com</li>
|
||||
</ul>
|
||||
|
||||
```html
|
||||
<ul>
|
||||
<li>fname: John</li>
|
||||
<li>lname: Doe</li>
|
||||
<li>email: j.doe@example.com</li>
|
||||
</ul>
|
||||
```
|
||||
|
||||
|
||||
Assign an array to Smarty, the key contains the key for each looped
|
||||
value.
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign('contacts', array(
|
||||
array('phone' => '555-555-1234',
|
||||
'fax' => '555-555-5678',
|
||||
'cell' => '555-555-0357'),
|
||||
array('phone' => '800-555-4444',
|
||||
'fax' => '800-555-3333',
|
||||
'cell' => '800-555-2222')
|
||||
));
|
||||
?>
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign(
|
||||
'contacts',
|
||||
[
|
||||
['phone' => '555-555-1234', 'fax' => '555-555-5678', 'cell' => '555-555-0357'],
|
||||
['phone' => '800-555-4444', 'fax' => '800-555-3333', 'cell' => '800-555-2222'],
|
||||
]
|
||||
);
|
||||
```
|
||||
|
||||
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 *}
|
||||
{foreach $contacts as $contact}
|
||||
{foreach $contact as $value}
|
||||
{$value@key}: {$value}
|
||||
{/foreach}
|
||||
{/foreach}
|
||||
|
||||
{* accessing key the PHP syntax alternate *}
|
||||
{foreach $contacts as $contact}
|
||||
{foreach $contact as $key => $value}
|
||||
{$key}: {$value}
|
||||
{/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:
|
||||
|
||||
|
||||
phone: 555-555-1234
|
||||
fax: 555-555-5678
|
||||
cell: 555-555-0357
|
||||
phone: 800-555-4444
|
||||
fax: 800-555-3333
|
||||
cell: 800-555-2222
|
||||
|
||||
```
|
||||
phone: 555-555-1234
|
||||
fax: 555-555-5678
|
||||
cell: 555-555-0357
|
||||
phone: 800-555-4444
|
||||
fax: 800-555-3333
|
||||
cell: 800-555-2222
|
||||
```
|
||||
|
||||
|
||||
A database (PDO) example of looping over search results. This example is
|
||||
looping over a PHP iterator instead of an array().
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Smarty\Smarty;
|
||||
|
||||
<?php
|
||||
include('Smarty.class.php');
|
||||
$smarty = new Smarty;
|
||||
|
||||
$smarty = new Smarty;
|
||||
$dsn = 'mysql:host=localhost;dbname=test';
|
||||
$login = 'test';
|
||||
$passwd = 'test';
|
||||
|
||||
$dsn = 'mysql:host=localhost;dbname=test';
|
||||
$login = 'test';
|
||||
$passwd = 'test';
|
||||
// setting PDO to use buffered queries in mysql is
|
||||
// important if you plan on using multiple result cursors
|
||||
// in the template.
|
||||
|
||||
// setting PDO to use buffered queries in mysql is
|
||||
// important if you plan on using multiple result cursors
|
||||
// in the template.
|
||||
$db = new PDO($dsn, $login, $passwd, array(
|
||||
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
|
||||
|
||||
$db = new PDO($dsn, $login, $passwd, array(
|
||||
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true));
|
||||
$res = $db->prepare("select * from users");
|
||||
$res->execute();
|
||||
$res->setFetchMode(PDO::FETCH_LAZY);
|
||||
|
||||
$res = $db->prepare("select * from users");
|
||||
$res->execute();
|
||||
$res->setFetchMode(PDO::FETCH_LAZY);
|
||||
// assign to smarty
|
||||
$smarty->assign('res',$res);
|
||||
|
||||
// assign to smarty
|
||||
$smarty->assign('res',$res);
|
||||
$smarty->display('index.tpl');?>
|
||||
```
|
||||
|
||||
$smarty->display('index.tpl');?>
|
||||
?>
|
||||
|
||||
|
||||
|
||||
|
||||
{foreach $res as $r}
|
||||
{$r.id}
|
||||
{$r.name}
|
||||
{foreachelse}
|
||||
.. no results ..
|
||||
{/foreach}
|
||||
|
||||
|
||||
```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
|
||||
`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
|
||||
result sets.
|
||||
|
||||
\@index {#foreach.property.index}
|
||||
-------
|
||||
## @index
|
||||
|
||||
`index` contains the current array index, starting with zero.
|
||||
|
||||
|
||||
{* output empty row on the 4th iteration (when index is 3) *}
|
||||
<table>
|
||||
```smarty
|
||||
{* output empty row on the 4th iteration (when index is 3) *}
|
||||
<table>
|
||||
{foreach $items as $i}
|
||||
{if $i@index eq 3}
|
||||
{* put empty table row *}
|
||||
@@ -231,72 +223,69 @@ result sets.
|
||||
{/if}
|
||||
<tr><td>{$i.label}</td></tr>
|
||||
{/foreach}
|
||||
</table>
|
||||
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
\@iteration {#foreach.property.iteration}
|
||||
-----------
|
||||
## @iteration
|
||||
|
||||
`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.
|
||||
|
||||
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.
|
||||
|
||||
```smarty
|
||||
{foreach $myNames as $name}
|
||||
{if $name@iteration is div by 4}
|
||||
<b>{$name}</b>
|
||||
{/if}
|
||||
{$name}
|
||||
{/foreach}
|
||||
```
|
||||
|
||||
{foreach $myNames as $name}
|
||||
{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
|
||||
The *"is even by"* and *"is odd by"* operators can be used to
|
||||
alternate something every so many iterations. Choosing between even or
|
||||
odd rotates which one starts. Here we switch the font color every 3rd
|
||||
iteration.
|
||||
|
||||
|
||||
{foreach $myNames as $name}
|
||||
{if $name@iteration is even by 3}
|
||||
<span style="color: #000">{$name}</span>
|
||||
{else}
|
||||
<span style="color: #eee">{$name}</span>
|
||||
{/if}
|
||||
{/foreach}
|
||||
|
||||
|
||||
```smarty
|
||||
{foreach $myNames as $name}
|
||||
{if $name@iteration is even by 3}
|
||||
<span style="color: #000">{$name}</span>
|
||||
{else}
|
||||
<span style="color: #eee">{$name}</span>
|
||||
{/if}
|
||||
{/foreach}
|
||||
```
|
||||
|
||||
This will output something similar to this:
|
||||
|
||||
|
||||
<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>
|
||||
...
|
||||
|
||||
```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>
|
||||
...
|
||||
```
|
||||
|
||||
|
||||
\@first {#foreach.property.first}
|
||||
-------
|
||||
## @first
|
||||
|
||||
`first` is TRUE if the current `{foreach}` iteration is the initial one.
|
||||
Here we display a table header row on the first iteration.
|
||||
|
||||
|
||||
{* show table header at first iteration *}
|
||||
<table>
|
||||
```smarty
|
||||
{* show table header at first iteration *}
|
||||
<table>
|
||||
{foreach $items as $i}
|
||||
{if $i@first}
|
||||
<tr>
|
||||
@@ -309,99 +298,92 @@ Here we display a table header row on the first iteration.
|
||||
<td>{$i.name}</td>
|
||||
</tr>
|
||||
{/foreach}
|
||||
</table>
|
||||
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
\@last {#foreach.property.last}
|
||||
------
|
||||
## @last
|
||||
|
||||
`last` is set to TRUE if the current `{foreach}` iteration is the final
|
||||
one. Here we display a horizontal rule on the last iteration.
|
||||
|
||||
|
||||
{* 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}
|
||||
|
||||
```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}
|
||||
```
|
||||
|
||||
|
||||
\@show {#foreach.property.show}
|
||||
------
|
||||
## @show
|
||||
|
||||
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
|
||||
a boolean value.
|
||||
|
||||
|
||||
<ul>
|
||||
```smarty
|
||||
<ul>
|
||||
{foreach $myArray as $name}
|
||||
<li>{$name}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{if $name@show} do something here if the array contained data {/if}
|
||||
</ul>
|
||||
{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
|
||||
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 *}
|
||||
{foreach $items as $item}
|
||||
{$item.name}<hr/>
|
||||
{if $item@last}
|
||||
<div id="total">{$item@total} items</div>
|
||||
{/if}
|
||||
{foreachelse}
|
||||
... no items to loop ...
|
||||
{/foreach}
|
||||
See also [`{section}`](./language-function-section.md),
|
||||
[`{for}`](./language-function-for.md) and
|
||||
[`{while}`](./language-function-while.md)
|
||||
|
||||
See also [`{section}`](#language.function.section),
|
||||
[`{for}`](#language.function.for) and
|
||||
[`{while}`](#language.function.while)
|
||||
|
||||
{break} {#foreach.construct.break}
|
||||
-------
|
||||
## {break}
|
||||
|
||||
`{break}` aborts the iteration of the array
|
||||
|
||||
|
||||
{$data = [1,2,3,4,5]}
|
||||
{foreach $data as $value}
|
||||
{if $value == 3}
|
||||
{* abort iterating the array *}
|
||||
{break}
|
||||
{/if}
|
||||
{$value}
|
||||
{/foreach}
|
||||
{*
|
||||
prints: 1 2
|
||||
*}
|
||||
|
||||
```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
|
||||
*}
|
||||
```
|
||||
|
||||
|
||||
{continue} {#foreach.construct.continue}
|
||||
----------
|
||||
## {continue}
|
||||
|
||||
`{continue}` leaves the current iteration and begins with the next
|
||||
iteration.
|
||||
|
||||
|
||||
{$data = [1,2,3,4,5]}
|
||||
{foreach $data as $value}
|
||||
{if $value == 3}
|
||||
{* skip this iteration *}
|
||||
{continue}
|
||||
{/if}
|
||||
{$value}
|
||||
{/foreach}
|
||||
{*
|
||||
prints: 1 2 4 5
|
||||
*}
|
||||
|
||||
|
||||
```smarty
|
||||
{$data = [1,2,3,4,5]}
|
||||
{foreach $data as $value}
|
||||
{if $value == 3}
|
||||
{* skip this iteration *}
|
||||
{continue}
|
||||
{/if}
|
||||
{$value}
|
||||
{/foreach}
|
||||
{*
|
||||
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
|
||||
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
|
||||
> single-pass compiler, The [`{call}`](#language.function.call) tag must
|
||||
> 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.
|
||||
|
||||
## 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 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.
|
||||
|
||||
- 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
|
||||
values can be overwritten when the template function is being
|
||||
called.
|
||||
@@ -30,12 +36,7 @@ nested menus.
|
||||
inside the template function have local scope and are not visible
|
||||
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**
|
||||
>
|
||||
@@ -45,44 +46,44 @@ nested menus.
|
||||
> values must be scalar and can not be variable. Variables must be
|
||||
> passed when the template is called.
|
||||
|
||||
## Examples
|
||||
|
||||
{* define the function *}
|
||||
{function name=menu level=0}
|
||||
{function menu level=0} {* short-hand *}
|
||||
<ul class="level{$level}">
|
||||
{foreach $data as $entry}
|
||||
{if is_array($entry)}
|
||||
<li>{$entry@key}</li>
|
||||
{menu data=$entry level=$level+1}
|
||||
{else}
|
||||
<li>{$entry}</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/function}
|
||||
```smarty
|
||||
{* define the function *}
|
||||
{function name=menu level=0}
|
||||
{function menu level=0} {* short-hand *}
|
||||
<ul class="level{$level}">
|
||||
{foreach $data as $entry}
|
||||
{if is_array($entry)}
|
||||
<li>{$entry@key}</li>
|
||||
{menu data=$entry level=$level+1}
|
||||
{else}
|
||||
<li>{$entry}</li>
|
||||
{/if}
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/function}
|
||||
|
||||
{* create an array to demonstrate *}
|
||||
{$menu = ['item1','item2','item3' => ['item3-1','item3-2','item3-3' =>
|
||||
['item3-3-1','item3-3-2']],'item4']}
|
||||
{* 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}
|
||||
|
||||
|
||||
{* run the array through the function *}
|
||||
{menu data=$menu}
|
||||
```
|
||||
|
||||
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
|
||||
* item2
|
||||
* item3
|
||||
o item3-1
|
||||
o item3-2
|
||||
o item3-3
|
||||
+ item3-3-1
|
||||
+ item3-3-2
|
||||
* item4
|
||||
```
|
||||
|
||||
|
||||
See also [`{call}`](#language.function.call)
|
||||
See also [`{call}`](./language-function-call.md)
|
||||
|
||||
@@ -1,121 +1,116 @@
|
||||
{if},{elseif},{else} {#language.function.if}
|
||||
====================
|
||||
# {if},{elseif},{else}
|
||||
|
||||
`{if}` statements in Smarty have much the same flexibility as PHP
|
||||
[if](&url.php-manual;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}`.
|
||||
`{else}` and `{elseif}` are also permitted. All PHP conditionals and
|
||||
functions are recognized, such as *\|\|*, *or*, *&&*, *and*,
|
||||
*is\_array()*, etc.
|
||||
|
||||
If securty is enabled, only PHP functions from `$php_functions` property
|
||||
of the securty policy are allowed. See the
|
||||
[Security](#advanced.features.security) section for details.
|
||||
*is_array()*, etc.
|
||||
|
||||
The following is a list of recognized qualifiers, which must be
|
||||
separated from surrounding elements by spaces. Note that items listed in
|
||||
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||
|
||||
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 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
|
||||
## Qualifiers
|
||||
|
||||
| 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
|
||||
{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'}
|
||||
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}
|
||||
{* parenthesis are allowed *}
|
||||
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{* parenthesis are allowed *}
|
||||
{if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#}
|
||||
...
|
||||
{/if}
|
||||
{* you can also embed php function calls *}
|
||||
{if count($var) gt 0}
|
||||
...
|
||||
{/if}
|
||||
|
||||
{* check for array. *}
|
||||
{if is_array($foo) }
|
||||
.....
|
||||
{/if}
|
||||
|
||||
{* check for not null. *}
|
||||
{if isset($foo) }
|
||||
.....
|
||||
{/if}
|
||||
|
||||
|
||||
{* you can also embed php function calls *}
|
||||
{if count($var) gt 0}
|
||||
...
|
||||
{/if}
|
||||
|
||||
{* check for array. *}
|
||||
{if is_array($foo) }
|
||||
.....
|
||||
{/if}
|
||||
|
||||
{* check for not null. *}
|
||||
{if isset($foo) }
|
||||
.....
|
||||
{/if}
|
||||
{* test if values are even or odd *}
|
||||
{if $var is even}
|
||||
...
|
||||
{/if}
|
||||
{if $var is odd}
|
||||
...
|
||||
{/if}
|
||||
{if $var is not odd}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{* test if values are even or odd *}
|
||||
{if $var is even}
|
||||
...
|
||||
{/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}
|
||||
...
|
||||
{/if}
|
||||
|
||||
|
||||
{* test if var is divisible by 4 *}
|
||||
{if $var is div by 4}
|
||||
...
|
||||
{/if}
|
||||
{*
|
||||
test if var is even, grouped by two. i.e.,
|
||||
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
|
||||
*}
|
||||
{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'}
|
||||
{* do something *}
|
||||
{elseif $name == $foo}
|
||||
{* do something *}
|
||||
{/if}
|
||||
|
||||
{*
|
||||
test if var is even, grouped by two. i.e.,
|
||||
0=even, 1=even, 2=odd, 3=odd, 4=even, 5=even, etc.
|
||||
*}
|
||||
{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'}
|
||||
{* 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,74 +0,0 @@
|
||||
{include\_php} {#language.function.include.php}
|
||||
==============
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{include_php}` is deprecated from Smarty, use registered plugins to
|
||||
> properly insulate presentation from the application code. As of Smarty
|
||||
> 3.1 the `{include_php}` tags are only available from [SmartyBC](#bc).
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- --------- ----------------------------------------------------------------------------------
|
||||
file string Yes *n/a* The name of the php file to include as absolute path
|
||||
once boolean No *TRUE* whether or not to include the php file more than once if included multiple times
|
||||
assign string No *n/a* The name of the variable that the output of include\_php will be assigned to
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- ----------------------------------------
|
||||
nocache Disables caching of inluded PHP script
|
||||
|
||||
`{include_php}` tags are used to include a php script in your template.
|
||||
The path of the attribute `file` can be either absolute, or relative to
|
||||
[`$trusted_dir`](#variable.trusted.dir). If security is enabled, then
|
||||
the script must be located in the `$trusted_dir` path of the securty
|
||||
policy. See the [Security](#advanced.features.security) section for
|
||||
details.
|
||||
|
||||
By default, php files are only included once even if called multiple
|
||||
times in the template. You can specify that it should be included every
|
||||
time with the `once` attribute. Setting once to FALSE will include the
|
||||
php script each time it is included in the template.
|
||||
|
||||
You can optionally pass the `assign` attribute, which will specify a
|
||||
template variable name that the output of `{include_php}` will be
|
||||
assigned to instead of displayed.
|
||||
|
||||
The smarty object is available as `$_smarty_tpl->smarty` within the PHP
|
||||
script that you include.
|
||||
|
||||
The `load_nav.php` file:
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
// load in variables from a mysql db and assign them to the template
|
||||
require_once('database.class.php');
|
||||
$db = new Db();
|
||||
$db->query('select url, name from navigation order by name');
|
||||
$this->assign('navigation', $db->getRows());
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
where the template is:
|
||||
|
||||
|
||||
{* absolute path, or relative to $trusted_dir *}
|
||||
{include_php file='/path/to/load_nav.php'}
|
||||
{include_php '/path/to/load_nav.php'} {* short-hand *}
|
||||
|
||||
{foreach item='nav' from=$navigation}
|
||||
<a href="{$nav.url}">{$nav.name}</a><br />
|
||||
{/foreach}
|
||||
|
||||
|
||||
|
||||
See also [`{include}`](#language.function.include),
|
||||
[`$trusted_dir`](#variable.trusted.dir),
|
||||
[`{php}`](#language.function.php),
|
||||
[`{capture}`](#language.function.capture), [template
|
||||
resources](#resources) and [componentized
|
||||
templates](#tips.componentized.templates)
|
||||
@@ -1,19 +1,31 @@
|
||||
{include} {#language.function.include}
|
||||
=========
|
||||
# {include}
|
||||
|
||||
`{include}` tags are used for including other templates in the current
|
||||
template. Any variables available in the current template are also
|
||||
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 template resource path.
|
||||
|
||||
- Setting the optional `assign` attribute specifies the template
|
||||
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
|
||||
[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
|
||||
of the included file. Attribute variables override current template
|
||||
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
|
||||
included template by using the scope attribute at the `{include}`
|
||||
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
|
||||
including template.
|
||||
|
||||
- Use the syntax for [template resources](#resources) to `{include}`
|
||||
files outside of the [`$template_dir`](#variable.template.dir)
|
||||
- Use the syntax for [template resources](../../api/resources.md) to `{include}`
|
||||
files outside of the [`$template_dir`](../../programmers/api-variables/variable-template-dir.md)
|
||||
directory.
|
||||
|
||||
**Attributes:**
|
||||
## Option Flags
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
----------------- ---------------- ---------- --------- --------------------------------------------------------------------------------------------------
|
||||
file string Yes *n/a* The name of the template file to include
|
||||
assign string No *n/a* The name of the variable that the output of include will be assigned to
|
||||
cache\_lifetime integer No *n/a* Enable caching of this subtemplate with an individual cache lifetime
|
||||
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
|
||||
| Name | Description |
|
||||
|---------|--------------------------------------------------------------------------------------|
|
||||
| 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 |
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -------------------------------------------------------------------------------------
|
||||
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>
|
||||
## Examples
|
||||
```smarty
|
||||
<html>
|
||||
<head>
|
||||
<title>{$title}</title>
|
||||
</head>
|
||||
@@ -69,126 +70,118 @@ available within the included template.
|
||||
{* using shortform file attribute *}
|
||||
{include 'page_footer.tpl'}
|
||||
</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
|
||||
|
||||
|
||||
<div id="box">
|
||||
```smarty
|
||||
<div id="box">
|
||||
<h3>{$title}{/h3>
|
||||
<ul>
|
||||
{foreach from=$links item=l}
|
||||
.. do stuff ...
|
||||
</foreach}
|
||||
{foreach from=$links item=l}
|
||||
.. do stuff ...
|
||||
</foreach}
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
```
|
||||
Variables assigned in the included template will be seen in the
|
||||
including template.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' scope=parent}
|
||||
...
|
||||
{* display variables assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
{$bar}<br>
|
||||
...
|
||||
|
||||
```smarty
|
||||
{include 'sub_template.tpl' scope=parent}
|
||||
...
|
||||
{* display variables assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
{$bar}<br>
|
||||
...
|
||||
```
|
||||
|
||||
|
||||
The template above includes the example `sub_template.tpl` below
|
||||
|
||||
|
||||
...
|
||||
{assign var=foo value='something'}
|
||||
{assign var=bar value='value'}
|
||||
...
|
||||
```smarty
|
||||
...
|
||||
{assign var=foo value='something'}
|
||||
{assign var=bar value='value'}
|
||||
...
|
||||
```
|
||||
|
||||
The included template will not be cached.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' nocache}
|
||||
...
|
||||
|
||||
```smarty
|
||||
{include 'sub_template.tpl' nocache}
|
||||
...
|
||||
```
|
||||
|
||||
|
||||
In this example included template will be cached with an individual
|
||||
cache lifetime of 500 seconds.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' cache_lifetime=500}
|
||||
...
|
||||
|
||||
```smarty
|
||||
{include 'sub_template.tpl' cache_lifetime=500}
|
||||
...
|
||||
```
|
||||
|
||||
|
||||
In this example included template will be cached independent of the
|
||||
global cahing setting.
|
||||
|
||||
|
||||
{include 'sub_template.tpl' caching}
|
||||
...
|
||||
global caching setting.
|
||||
|
||||
```smarty
|
||||
{include 'sub_template.tpl' caching}
|
||||
...
|
||||
```
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
<body>
|
||||
{include 'nav.tpl' assign=navbar}
|
||||
{include 'header.tpl' title='Smarty is cool'}
|
||||
{$navbar}
|
||||
{* body of template goes here *}
|
||||
{$navbar}
|
||||
{include 'footer.tpl'}
|
||||
</body>
|
||||
|
||||
```smarty
|
||||
<body>
|
||||
{include 'nav.tpl' assign=navbar}
|
||||
{include 'header.tpl' title='Smarty is cool'}
|
||||
{$navbar}
|
||||
{* body of template goes here *}
|
||||
{$navbar}
|
||||
{include 'footer.tpl'}
|
||||
</body>
|
||||
```
|
||||
|
||||
|
||||
This example includes another template relative to the directory of the
|
||||
current template.
|
||||
|
||||
|
||||
{include 'template-in-a-template_dir-directory.tpl'}
|
||||
{include './template-in-same-directory.tpl'}
|
||||
{include '../template-in-parent-directory.tpl'}
|
||||
|
||||
```smarty
|
||||
{include 'template-in-a-template_dir-directory.tpl'}
|
||||
{include './template-in-same-directory.tpl'}
|
||||
{include '../template-in-parent-directory.tpl'}
|
||||
```
|
||||
|
||||
```smarty
|
||||
{* absolute filepath *}
|
||||
{include file='/usr/local/include/templates/header.tpl'}
|
||||
|
||||
{* absolute filepath (same thing) *}
|
||||
{include file='file:/usr/local/include/templates/header.tpl'}
|
||||
|
||||
{* absolute filepath *}
|
||||
{include file='/usr/local/include/templates/header.tpl'}
|
||||
{* windows absolute filepath (MUST use "file:" prefix) *}
|
||||
{include file='file:C:/www/pub/templates/header.tpl'}
|
||||
|
||||
{* absolute filepath (same thing) *}
|
||||
{include file='file:/usr/local/include/templates/header.tpl'}
|
||||
{* include from template resource named "db" *}
|
||||
{include file='db:header.tpl'}
|
||||
|
||||
{* windows absolute filepath (MUST use "file:" prefix) *}
|
||||
{include file='file:C:/www/pub/templates/header.tpl'}
|
||||
{* include a $variable template - eg $module = 'contacts' *}
|
||||
{include file="$module.tpl"}
|
||||
|
||||
{* include from template resource named "db" *}
|
||||
{include file='db:header.tpl'}
|
||||
|
||||
{* 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"}
|
||||
{* 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 [`{include_php}`](#language.function.include.php),
|
||||
[`{insert}`](#language.function.insert),
|
||||
[`{php}`](#language.function.php), [template resources](#resources) and
|
||||
[componentized templates](#tips.componentized.templates).
|
||||
See also [template resources](../../api/resources.md) and
|
||||
[componentized templates](../../appendixes/tips.md#componentized-templates).
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
{insert} {#language.function.insert}
|
||||
========
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `{insert}` tags are deprecated from Smarty, and should not be used.
|
||||
> Put your PHP logic in PHP scripts or plugin functions instead.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> As of Smarty 3.1 the `{insert}` tags are only available from
|
||||
> [SmartyBC](#bc).
|
||||
|
||||
`{insert}` tags work much like [`{include}`](#language.function.include)
|
||||
tags, except that `{insert}` tags are NOT cached when template
|
||||
[caching](#caching) is enabled. They will be executed on every
|
||||
invocation of the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------------- ---------- --------- ----------------------------------------------------------------------------------
|
||||
name string Yes *n/a* 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
|
||||
script string No *n/a* 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
|
||||
|
||||
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
|
||||
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
|
||||
\#banner\_location\_id\# and \#site\_id\# values (gathered from a
|
||||
[config file](#config.files)), and needs to call a function to get the
|
||||
banner contents.
|
||||
|
||||
{* example of fetching a banner *}
|
||||
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}
|
||||
{insert "getBanner" lid=#banner_location_id# sid=#site_id#} {* short-hand *}
|
||||
|
||||
In this example, we are using the name "getBanner" and passing the
|
||||
parameters \#banner\_location\_id\# and \#site\_id\#. Smarty will look
|
||||
for a function named insert\_getBanner() in your PHP application,
|
||||
passing the values of \#banner\_location\_id\# and \#site\_id\# as the
|
||||
first argument in an associative array. All {insert} function names in
|
||||
your application must be prepended with \"insert\_\" to remedy possible
|
||||
function name-space conflicts. Your insert\_getBanner() function should
|
||||
do something with the passed values and return the results. These
|
||||
results are then displayed in the template in place of the {insert} tag.
|
||||
In this example, Smarty would call this function:
|
||||
insert\_getBanner(array(\"lid\" =\> \"12345\",\"sid\" =\> \"67890\"));
|
||||
and display the returned results in place of the {insert} tag.
|
||||
|
||||
- If you supply the `assign` attribute, the output of the `{insert}`
|
||||
tag will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assigning the output to a template variable isn\'t too useful with
|
||||
> [caching](#variable.caching) enabled.
|
||||
|
||||
- If you supply the `script` attribute, this php script will be
|
||||
included (only once) before the `{insert}` function is executed.
|
||||
This is the case where the insert function may not exist yet, and a
|
||||
php script must be included first to make it work.
|
||||
|
||||
The path can be either absolute, or relative to
|
||||
[`$trusted_dir`](#variable.trusted.dir). If security is enabled,
|
||||
then the script must be located in the `$trusted_dir` path of the
|
||||
securty policy. See the [Security](#advanced.features.security)
|
||||
section for details.
|
||||
|
||||
The Smarty object is passed as the second argument. This way you can
|
||||
reference and modify information in the Smarty object from within the
|
||||
`{insert}` function.
|
||||
|
||||
If no PHP script can be found Smarty is looking for a corresponding
|
||||
insert plugin.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> It is possible to have portions of the template not cached. If you
|
||||
> have [caching](#caching) turned on, `{insert}` tags will not be
|
||||
> cached. They will run dynamically every time the page is created, even
|
||||
> within cached pages. This works good for things like banners, polls,
|
||||
> live weather, search results, user feedback areas, etc.
|
||||
|
||||
See also [`{include}`](#language.function.include)
|
||||
|
||||
@@ -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
|
||||
[`{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
|
||||
[`{$smarty.ldelim}`](#language.variables.smarty.ldelim).
|
||||
[`{$smarty.ldelim}`](../../designers/language-basic-syntax/language-escaping.md).
|
||||
|
||||
```smarty
|
||||
{* this will print literal delimiters out of the template *}
|
||||
|
||||
{* this will print literal delimiters out of the template *}
|
||||
|
||||
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
||||
|
||||
|
||||
{ldelim}funcname{rdelim} is how functions look in Smarty!
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
{funcname} is how functions look in Smarty!
|
||||
|
||||
|
||||
```
|
||||
{funcname} is how functions look in Smarty!
|
||||
```
|
||||
|
||||
Another example with some Javascript
|
||||
|
||||
|
||||
<script language="JavaScript">
|
||||
function foo() {ldelim}
|
||||
... code ...
|
||||
{rdelim}
|
||||
</script>
|
||||
|
||||
|
||||
```smarty
|
||||
<script>
|
||||
function foo() {ldelim}
|
||||
... code ...
|
||||
{rdelim}
|
||||
</script>
|
||||
```
|
||||
|
||||
will output
|
||||
|
||||
```html
|
||||
<script>
|
||||
function foo() {
|
||||
.... code ...
|
||||
}
|
||||
</script>
|
||||
```
|
||||
|
||||
<script language="JavaScript">
|
||||
function foo() {
|
||||
.... code ...
|
||||
}
|
||||
</script>
|
||||
```smarty
|
||||
<script>
|
||||
function myJsFunction(){ldelim}
|
||||
alert("The server name\n{$smarty.server.SERVER_NAME|escape:javascript}\n{$smarty.server.SERVER_ADDR|escape:javascript}");
|
||||
{rdelim}
|
||||
</script>
|
||||
<a href="javascript:myJsFunction()">Click here for Server Info</a>
|
||||
```
|
||||
|
||||
|
||||
|
||||
|
||||
<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).
|
||||
See also [`{literal}`](./language-function-literal.md) and [escaping Smarty
|
||||
parsing](../language-basic-syntax/language-escaping.md).
|
||||
|
||||
@@ -1,13 +1,12 @@
|
||||
{literal} {#language.function.literal}
|
||||
=========
|
||||
# {literal}
|
||||
|
||||
`{literal}` tags allow a block of data to be taken literally. This is
|
||||
typically used around Javascript or stylesheet blocks where {curly
|
||||
braces} would interfere with the template
|
||||
[delimiter](#variable.left.delimiter) syntax. Anything within
|
||||
[delimiter](../../designers/language-basic-syntax/language-escaping.md) syntax. Anything within
|
||||
`{literal}{/literal}` tags is not interpreted, but displayed as-is. If
|
||||
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.
|
||||
|
||||
> **Note**
|
||||
@@ -17,20 +16,19 @@ delimiters instead.
|
||||
> javascript and CSS curly braces are surrounded by whitespace. This is
|
||||
> 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>
|
||||
// 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>
|
||||
|
||||
|
||||
|
||||
See also [`{ldelim} {rdelim}`](#language.function.ldelim) and the
|
||||
[escaping Smarty parsing](#language.escaping) page.
|
||||
See also [`{ldelim} {rdelim}`](./language-function-ldelim.md) and the
|
||||
[escaping Smarty parsing](../language-basic-syntax/language-escaping.md) page.
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
{nocache} {#language.function.nocache}
|
||||
=========
|
||||
# {nocache}
|
||||
|
||||
`{nocache}` is used to disable caching of a template section. Every
|
||||
`{nocache}` must be paired with a matching `{/nocache}`.
|
||||
@@ -9,15 +8,13 @@
|
||||
> Be sure any variables used within a non-cached section are also
|
||||
> assigned from PHP when the page is loaded from the cache.
|
||||
|
||||
|
||||
|
||||
Today's date is
|
||||
{nocache}
|
||||
{$smarty.now|date_format}
|
||||
{/nocache}
|
||||
|
||||
|
||||
|
||||
```smarty
|
||||
Today's date is
|
||||
{nocache}
|
||||
{$smarty.now|date_format}
|
||||
{/nocache}
|
||||
```
|
||||
|
||||
The above code will output the current date on a cached page.
|
||||
|
||||
See also the [caching section](#caching).
|
||||
See also the [caching section](../../api/caching/basics.md).
|
||||
|
||||
@@ -1,14 +1,13 @@
|
||||
{section},{sectionelse} {#language.function.section}
|
||||
=======================
|
||||
# {section}, {sectionelse}
|
||||
|
||||
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
|
||||
be paired with a closing `{/section}` tag.
|
||||
|
||||
> **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
|
||||
> usually preferred over the {section} loop.
|
||||
|
||||
@@ -16,30 +15,33 @@ be paired with a closing `{/section}` tag.
|
||||
>
|
||||
> {section} loops cannot loop over associative arrays, they must be
|
||||
> 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
|
||||
--------- ------------------------------------------
|
||||
nocache Disables caching of the `{section}` loop
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| 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`.
|
||||
|
||||
- The `name` of the `{section}` can be anything you like, made up of
|
||||
letters, numbers and underscores, like [PHP
|
||||
variables](&url.php-manual;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.
|
||||
|
||||
- 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}`
|
||||
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`.
|
||||
|
||||
- `{section}` properties are [`index`](#section.property.index),
|
||||
[`index_prev`](#section.property.index.prev),
|
||||
[`index_next`](#section.property.index.next),
|
||||
[`iteration`](#section.property.iteration),
|
||||
[`first`](#section.property.first),
|
||||
[`last`](#section.property.last),
|
||||
[`rownum`](#section.property.rownum),
|
||||
[`loop`](#section.property.loop), [`show`](#section.property.show),
|
||||
[`total`](#section.property.total).
|
||||
- `{section}` properties are [`index`](#index),
|
||||
[`index_prev`](#index_prev),
|
||||
[`index_next`](#index_next),
|
||||
[`iteration`](#iteration),
|
||||
[`first`](#first),
|
||||
[`last`](#last),
|
||||
[`rownum`](#rownum),
|
||||
[`loop`](#loop), [`show`](#show),
|
||||
[`total`](#total).
|
||||
|
||||
[`assign()`](#api.assign) an array to Smarty
|
||||
[`assign()`](../../programmers/api-functions/api-assign.md) an array to Smarty
|
||||
|
||||
## Examples
|
||||
|
||||
<?php
|
||||
$data = array(1000,1001,1002);
|
||||
$smarty->assign('custid',$data);
|
||||
?>
|
||||
```php
|
||||
<?php
|
||||
$data = [1000, 1001, 1002];
|
||||
$smarty->assign('custid', $data);
|
||||
```
|
||||
|
||||
The template that outputs the array
|
||||
|
||||
|
||||
{* this example will print out all the values of the $custid array *}
|
||||
{section name=customer loop=$custid}
|
||||
{section customer $custid} {* short-hand *}
|
||||
id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
<hr />
|
||||
{* print out all the values of the $custid array reversed *}
|
||||
{section name=foo loop=$custid step=-1}
|
||||
{section foo $custid step=-1} {* short-hand *}
|
||||
{$custid[foo]}<br />
|
||||
{/section}
|
||||
|
||||
```smarty
|
||||
{* this example will print out all the values of the $custid array *}
|
||||
{section name=customer loop=$custid}
|
||||
{section customer $custid} {* short-hand *}
|
||||
id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
<hr />
|
||||
{* print out all the values of the $custid array reversed *}
|
||||
{section name=foo loop=$custid step=-1}
|
||||
{section foo $custid step=-1} {* short-hand *}
|
||||
{$custid[foo]}<br />
|
||||
{/section}
|
||||
```
|
||||
|
||||
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 />
|
||||
```
|
||||
|
||||
```smarty
|
||||
{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:
|
||||
|
||||
|
||||
id: 1000<br />
|
||||
id: 1001<br />
|
||||
id: 1002<br />
|
||||
<hr />
|
||||
id: 1002<br />
|
||||
id: 1001<br />
|
||||
id: 1000<br />
|
||||
|
||||
|
||||
|
||||
|
||||
{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:
|
||||
|
||||
|
||||
10 12 14 16 18
|
||||
<hr />
|
||||
20 18 16 14 12 10
|
||||
|
||||
|
||||
```html
|
||||
10 12 14 16 18
|
||||
<hr />
|
||||
20 18 16 14 12 10
|
||||
```
|
||||
|
||||
The `name` of the `{section}` can be anything you like, see [PHP
|
||||
variables](&url.php-manual;language.variables). It is used to reference
|
||||
variables](https://www.php.net/language.variables). It is used to reference
|
||||
the data within the `{section}`.
|
||||
|
||||
|
||||
{section name=anything loop=$myArray}
|
||||
{$myArray[anything].foo}
|
||||
{$name[anything]}
|
||||
{$address[anything].bar}
|
||||
{/section}
|
||||
|
||||
|
||||
```smarty
|
||||
{section name=anything loop=$myArray}
|
||||
{$myArray[anything].foo}
|
||||
{$name[anything]}
|
||||
{$address[anything].bar}
|
||||
{/section}
|
||||
```
|
||||
|
||||
This is an example of printing an associative array of data with a
|
||||
`{section}`. Following is the php script to assign the `$contacts` array
|
||||
to Smarty.
|
||||
|
||||
|
||||
<?php
|
||||
$data = array(
|
||||
array('name' => 'John Smith', 'home' => '555-555-5555',
|
||||
'cell' => '666-555-5555', 'email' => 'john@myexample.com'),
|
||||
array('name' => 'Jack Jones', 'home' => '777-555-5555',
|
||||
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'),
|
||||
array('name' => 'Jane Munson', 'home' => '000-555-5555',
|
||||
'cell' => '123456', 'email' => 'jane@myexample.com')
|
||||
);
|
||||
$smarty->assign('contacts',$data);
|
||||
?>
|
||||
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$data = [
|
||||
['name' => 'John Smith', 'home' => '555-555-5555',
|
||||
'cell' => '666-555-5555', 'email' => 'john@myexample.com'],
|
||||
['name' => 'Jack Jones', 'home' => '777-555-5555',
|
||||
'cell' => '888-555-5555', 'email' => 'jack@myexample.com'],
|
||||
['name' => 'Jane Munson', 'home' => '000-555-5555',
|
||||
'cell' => '123456', 'email' => 'jane@myexample.com']
|
||||
];
|
||||
$smarty->assign('contacts',$data);
|
||||
```
|
||||
|
||||
The template to output `$contacts`
|
||||
|
||||
|
||||
{section name=customer loop=$contacts}
|
||||
<p>
|
||||
name: {$contacts[customer].name}<br />
|
||||
home: {$contacts[customer].home}<br />
|
||||
cell: {$contacts[customer].cell}<br />
|
||||
e-mail: {$contacts[customer].email}
|
||||
</p>
|
||||
{/section}
|
||||
|
||||
|
||||
```smarty
|
||||
{section name=customer loop=$contacts}
|
||||
<p>
|
||||
name: {$contacts[customer].name}<br />
|
||||
home: {$contacts[customer].home}<br />
|
||||
cell: {$contacts[customer].cell}<br />
|
||||
e-mail: {$contacts[customer].email}
|
||||
</p>
|
||||
{/section}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<p>
|
||||
name: John Smith<br />
|
||||
home: 555-555-5555<br />
|
||||
cell: 666-555-5555<br />
|
||||
e-mail: john@myexample.com
|
||||
</p>
|
||||
<p>
|
||||
name: Jack Jones<br />
|
||||
home phone: 777-555-5555<br />
|
||||
cell phone: 888-555-5555<br />
|
||||
e-mail: jack@myexample.com
|
||||
</p>
|
||||
<p>
|
||||
name: Jane Munson<br />
|
||||
home phone: 000-555-5555<br />
|
||||
cell phone: 123456<br />
|
||||
e-mail: jane@myexample.com
|
||||
</p>
|
||||
|
||||
```html
|
||||
<p>
|
||||
name: John Smith<br />
|
||||
home: 555-555-5555<br />
|
||||
cell: 666-555-5555<br />
|
||||
e-mail: john@myexample.com
|
||||
</p>
|
||||
<p>
|
||||
name: Jack Jones<br />
|
||||
home phone: 777-555-5555<br />
|
||||
cell phone: 888-555-5555<br />
|
||||
e-mail: jack@myexample.com
|
||||
</p>
|
||||
<p>
|
||||
name: Jane Munson<br />
|
||||
home phone: 000-555-5555<br />
|
||||
cell phone: 123456<br />
|
||||
e-mail: jane@myexample.com
|
||||
</p>
|
||||
```
|
||||
|
||||
|
||||
This example assumes that `$custid`, `$name` and `$address` are all
|
||||
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);
|
||||
$smarty->assign('custid',$id);
|
||||
$fullnames = ['John Smith','Jack Jones','Jane Munson'];
|
||||
$smarty->assign('name',$fullnames);
|
||||
|
||||
$fullnames = array('John Smith','Jack Jones','Jane Munson');
|
||||
$smarty->assign('name',$fullnames);
|
||||
|
||||
$addr = array('253 Abbey road', '417 Mulberry ln', '5605 apple st');
|
||||
$smarty->assign('address',$addr);
|
||||
|
||||
?>
|
||||
$addr = ['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
|
||||
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
|
||||
to specify the number of loops.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
<p>
|
||||
id: {$custid[customer]}<br />
|
||||
name: {$name[customer]}<br />
|
||||
address: {$address[customer]}
|
||||
</p>
|
||||
{/section}
|
||||
|
||||
```smarty
|
||||
{section name=customer loop=$custid}
|
||||
<p>
|
||||
id: {$custid[customer]}<br />
|
||||
name: {$name[customer]}<br />
|
||||
address: {$address[customer]}
|
||||
</p>
|
||||
{/section}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<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>
|
||||
|
||||
```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>
|
||||
```
|
||||
|
||||
{section}'s can be nested as deep as you like. With nested
|
||||
{section}'s, you can access complex data structures, such as
|
||||
multidimensional arrays. This is an example `.php` script that
|
||||
assigns the arrays.
|
||||
|
||||
{section}\'s can be nested as deep as you like. With nested
|
||||
{section}\'s, you can access complex data structures, such as
|
||||
multi-dimensional arrays. This is an example `.php` script thats
|
||||
assign\'s the arrays.
|
||||
```php
|
||||
<?php
|
||||
|
||||
$id = [1001,1002,1003];
|
||||
$smarty->assign('custid',$id);
|
||||
|
||||
<?php
|
||||
$fullnames = ['John Smith','Jack Jones','Jane Munson'];
|
||||
$smarty->assign('name',$fullnames);
|
||||
|
||||
$id = array(1001,1002,1003);
|
||||
$smarty->assign('custid',$id);
|
||||
$addr = ['253 N 45th', '417 Mulberry ln', '5605 apple st'];
|
||||
$smarty->assign('address',$addr);
|
||||
|
||||
$fullnames = array('John Smith','Jack Jones','Jane Munson');
|
||||
$smarty->assign('name',$fullnames);
|
||||
$types = [
|
||||
[ 'home phone', 'cell phone', 'e-mail'],
|
||||
[ 'home phone', 'web'],
|
||||
[ 'cell phone']
|
||||
];
|
||||
$smarty->assign('contact_type', $types);
|
||||
|
||||
$addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st');
|
||||
$smarty->assign('address',$addr);
|
||||
|
||||
$types = array(
|
||||
array( 'home phone', 'cell phone', 'e-mail'),
|
||||
array( 'home phone', 'web'),
|
||||
array( 'cell phone')
|
||||
);
|
||||
$smarty->assign('contact_type', $types);
|
||||
|
||||
$info = array(
|
||||
array('555-555-5555', '666-555-5555', 'john@myexample.com'),
|
||||
array( '123-456-4', 'www.example.com'),
|
||||
array( '0457878')
|
||||
);
|
||||
$smarty->assign('contact_info', $info);
|
||||
|
||||
?>
|
||||
$info = [
|
||||
['555-555-5555', '666-555-5555', 'john@myexample.com'],
|
||||
[ '123-456-4', 'www.example.com'],
|
||||
[ '0457878']
|
||||
];
|
||||
$smarty->assign('contact_info', $info);
|
||||
```
|
||||
|
||||
|
||||
In this template, *\$contact\_type\[customer\]* is an array of contact
|
||||
In this template, *$contact_type\[customer\]* is an array of contact
|
||||
types for the current customer.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
<hr>
|
||||
id: {$custid[customer]}<br />
|
||||
name: {$name[customer]}<br />
|
||||
address: {$address[customer]}<br />
|
||||
{section name=contact loop=$contact_type[customer]}
|
||||
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
|
||||
{/section}
|
||||
{/section}
|
||||
|
||||
```smarty
|
||||
{section name=customer loop=$custid}
|
||||
<hr>
|
||||
id: {$custid[customer]}<br />
|
||||
name: {$name[customer]}<br />
|
||||
address: {$address[customer]}<br />
|
||||
{section name=contact loop=$contact_type[customer]}
|
||||
{$contact_type[customer][contact]}: {$contact_info[customer][contact]}<br />
|
||||
{/section}
|
||||
{/section}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<hr>
|
||||
id: 1000<br />
|
||||
name: John Smith<br />
|
||||
address: 253 N 45th<br />
|
||||
home phone: 555-555-5555<br />
|
||||
cell phone: 666-555-5555<br />
|
||||
e-mail: john@myexample.com<br />
|
||||
<hr>
|
||||
id: 1001<br />
|
||||
name: Jack Jones<br />
|
||||
address: 417 Mulberry ln<br />
|
||||
home phone: 123-456-4<br />
|
||||
web: www.example.com<br />
|
||||
<hr>
|
||||
id: 1002<br />
|
||||
name: Jane Munson<br />
|
||||
address: 5605 apple st<br />
|
||||
cell phone: 0457878<br />
|
||||
|
||||
```html
|
||||
<hr>
|
||||
id: 1000<br />
|
||||
name: John Smith<br />
|
||||
address: 253 N 45th<br />
|
||||
home phone: 555-555-5555<br />
|
||||
cell phone: 666-555-5555<br />
|
||||
e-mail: john@myexample.com<br />
|
||||
<hr>
|
||||
id: 1001<br />
|
||||
name: Jack Jones<br />
|
||||
address: 417 Mulberry ln<br />
|
||||
home phone: 123-456-4<br />
|
||||
web: www.example.com<br />
|
||||
<hr>
|
||||
id: 1002<br />
|
||||
name: Jane Munson<br />
|
||||
address: 5605 apple st<br />
|
||||
cell phone: 0457878<br />
|
||||
```
|
||||
|
||||
|
||||
Results of a database search (eg ADODB or PEAR) are assigned to Smarty
|
||||
|
||||
|
||||
<?php
|
||||
$sql = 'select id, name, home, cell, email from contacts '
|
||||
."where name like '$foo%' ";
|
||||
$smarty->assign('contacts', $db->getAll($sql));
|
||||
?>
|
||||
```php
|
||||
<?php
|
||||
$sql = 'select id, name, home, cell, email from contacts '
|
||||
."where name like '$foo%' ";
|
||||
$smarty->assign('contacts', $db->getAll($sql));
|
||||
```
|
||||
|
||||
The template to output the database result in a HTML table
|
||||
|
||||
|
||||
<table>
|
||||
```smarty
|
||||
<table>
|
||||
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
{section name=co loop=$contacts}
|
||||
<tr>
|
||||
@@ -348,11 +338,10 @@ The template to output the database result in a HTML table
|
||||
{sectionelse}
|
||||
<tr><td colspan="5">No items found</td></tr>
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
.index {#section.property.index}
|
||||
------
|
||||
</table>
|
||||
```
|
||||
|
||||
## .index
|
||||
`index` contains the current array index, starting with zero or the
|
||||
`start` attribute if given. It increments by one or by the `step`
|
||||
attribute if given.
|
||||
@@ -360,129 +349,120 @@ attribute if given.
|
||||
> **Note**
|
||||
>
|
||||
> 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.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> `$custid[customer.index]` and `$custid[customer]` are identical.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
|
||||
```smarty
|
||||
{section name=customer loop=$custid}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
0 id: 1000<br />
|
||||
1 id: 1001<br />
|
||||
2 id: 1002<br />
|
||||
|
||||
```html
|
||||
0 id: 1000<br />
|
||||
1 id: 1001<br />
|
||||
2 id: 1002<br />
|
||||
```
|
||||
|
||||
|
||||
.index\_prev {#section.property.index.prev}
|
||||
------------
|
||||
## .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 to -1.
|
||||
|
||||
.index\_next {#section.property.index.next}
|
||||
------------
|
||||
## .index_next
|
||||
|
||||
`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`
|
||||
attribute, if given.
|
||||
|
||||
|
||||
<?php
|
||||
$data = array(1001,1002,1003,1004,1005);
|
||||
```php
|
||||
<?php
|
||||
$data = [1001,1002,1003,1004,1005];
|
||||
$smarty->assign('rows',$data);
|
||||
?>
|
||||
```
|
||||
|
||||
Template to output the above array in a table
|
||||
|
||||
|
||||
{* $rows[row.index] and $rows[row] are identical in meaning *}
|
||||
<table>
|
||||
<tr>
|
||||
<th>index</th><th>id</th>
|
||||
<th>index_prev</th><th>prev_id</th>
|
||||
<th>index_next</th><th>next_id</th>
|
||||
</tr>
|
||||
{section name=row loop=$rows}
|
||||
<tr>
|
||||
<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_next}</td><td>{$rows[row.index_next]}</td>
|
||||
</tr>
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
```smarty
|
||||
{* $rows[row.index] and $rows[row] are identical in meaning *}
|
||||
<table>
|
||||
<tr>
|
||||
<th>index</th><th>id</th>
|
||||
<th>index_prev</th><th>prev_id</th>
|
||||
<th>index_next</th><th>next_id</th>
|
||||
</tr>
|
||||
{section name=row loop=$rows}
|
||||
<tr>
|
||||
<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_next}</td><td>{$rows[row.index_next]}</td>
|
||||
</tr>
|
||||
{/section}
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
The above example will output a table containing the following:
|
||||
|
||||
|
||||
```
|
||||
index id index_prev prev_id index_next next_id
|
||||
0 1001 -1 1 1002
|
||||
1 1002 0 1001 2 1003
|
||||
2 1003 1 1002 3 1004
|
||||
3 1004 2 1003 4 1005
|
||||
4 1005 3 1004 5
|
||||
|
||||
```
|
||||
|
||||
|
||||
.iteration {#section.property.iteration}
|
||||
----------
|
||||
## .iteration
|
||||
|
||||
`iteration` contains the current loop iteration and starts at one.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> 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`.
|
||||
> [`rownum`](#section.property.rownum) is an alias to `iteration`, they
|
||||
> [`rownum`](#rownum) is an alias to `iteration`, they
|
||||
> are identical.
|
||||
|
||||
|
||||
<?php
|
||||
// array of 3000 to 3015
|
||||
$id = range(3000,3015);
|
||||
$smarty->assign('arr',$id);
|
||||
?>
|
||||
```php
|
||||
<?php
|
||||
// array of 3000 to 3015
|
||||
$id = range(3000,3015);
|
||||
$smarty->assign('arr', $id);
|
||||
```
|
||||
|
||||
Template to output every other element of the `$arr` array as `step=2`
|
||||
|
||||
|
||||
{section name=cu loop=$arr start=5 step=2}
|
||||
iteration={$smarty.section.cu.iteration}
|
||||
index={$smarty.section.cu.index}
|
||||
id={$custid[cu]}<br />
|
||||
{/section}
|
||||
|
||||
```smarty
|
||||
{section name=cu loop=$arr start=5 step=2}
|
||||
iteration={$smarty.section.cu.iteration}
|
||||
index={$smarty.section.cu.index}
|
||||
id={$custid[cu]}<br />
|
||||
{/section}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
iteration=1 index=5 id=3005<br />
|
||||
iteration=2 index=7 id=3007<br />
|
||||
iteration=3 index=9 id=3009<br />
|
||||
iteration=4 index=11 id=3011<br />
|
||||
iteration=5 index=13 id=3013<br />
|
||||
iteration=6 index=15 id=3015<br />
|
||||
|
||||
|
||||
```html
|
||||
iteration=1 index=5 id=3005<br />
|
||||
iteration=2 index=7 id=3007<br />
|
||||
iteration=3 index=9 id=3009<br />
|
||||
iteration=4 index=11 id=3011<br />
|
||||
iteration=5 index=13 id=3013<br />
|
||||
iteration=6 index=15 id=3015<br />
|
||||
```
|
||||
|
||||
Another example that uses the `iteration` property to output a table
|
||||
header block every five rows.
|
||||
|
||||
|
||||
<table>
|
||||
```smarty
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is div by 5}
|
||||
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
|
||||
@@ -495,150 +475,136 @@ header block every five rows.
|
||||
<td>{$contacts[co].email}</td>
|
||||
<tr>
|
||||
{/section}
|
||||
</table>
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
|
||||
An that uses the `iteration` property to alternate a text color every
|
||||
An example that uses the `iteration` property to alternate a text color every
|
||||
third row.
|
||||
|
||||
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is even by 3}
|
||||
<span style="color: #ffffff">{$contacts[co].name}</span>
|
||||
{else}
|
||||
<span style="color: #dddddd">{$contacts[co].name}</span>
|
||||
{/if}
|
||||
{/section}
|
||||
</table>
|
||||
|
||||
|
||||
```smarty
|
||||
<table>
|
||||
{section name=co loop=$contacts}
|
||||
{if $smarty.section.co.iteration is even by 3}
|
||||
<span style="color: #ffffff">{$contacts[co].name}</span>
|
||||
{else}
|
||||
<span style="color: #dddddd">{$contacts[co].name}</span>
|
||||
{/if}
|
||||
{/section}
|
||||
</table>
|
||||
```
|
||||
|
||||
> **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:
|
||||
> `{if $smarty.section.co.iteration % 5 == 1}` will work just the same.
|
||||
|
||||
> **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
|
||||
initial one.
|
||||
`first` is set to TRUE if the current `{section}` iteration is the initial one.
|
||||
|
||||
.last {#section.property.last}
|
||||
-----
|
||||
## .last
|
||||
|
||||
`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
|
||||
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}
|
||||
{if $smarty.section.customer.first}
|
||||
<table>
|
||||
<tr><th>id</th><th>customer</th></tr>
|
||||
{/if}
|
||||
<tr>
|
||||
<td>{$customers[customer].id}}</td>
|
||||
<td>{$customers[customer].name}</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td>{$customers[customer].id}}</td>
|
||||
<td>{$customers[customer].name}</td>
|
||||
</tr>
|
||||
{if $smarty.section.customer.last}
|
||||
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
|
||||
</table>
|
||||
{/if}
|
||||
{/section}
|
||||
```
|
||||
|
||||
{if $smarty.section.customer.last}
|
||||
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
|
||||
</table>
|
||||
{/if}
|
||||
{/section}
|
||||
|
||||
|
||||
|
||||
.rownum {#section.property.rownum}
|
||||
-------
|
||||
## .rownum
|
||||
|
||||
`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.
|
||||
|
||||
.loop {#section.property.loop}
|
||||
-----
|
||||
## .loop
|
||||
|
||||
`loop` contains the last index number that this {section} looped. This
|
||||
can be used inside or after the `{section}`.
|
||||
|
||||
|
||||
{section name=customer loop=$custid}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
There are {$smarty.section.customer.loop} customers shown above.
|
||||
|
||||
|
||||
```smarty
|
||||
{section name=customer loop=$custid}
|
||||
{$smarty.section.customer.index} id: {$custid[customer]}<br />
|
||||
{/section}
|
||||
There are {$smarty.section.customer.loop} customers shown above.
|
||||
```
|
||||
|
||||
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 />
|
||||
1 id: 1001<br />
|
||||
2 id: 1002<br />
|
||||
There are 3 customers shown above.
|
||||
|
||||
|
||||
|
||||
.show {#section.property.show}
|
||||
-----
|
||||
## .show
|
||||
|
||||
`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}`
|
||||
present, that will be alternately displayed.
|
||||
|
||||
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.
|
||||
|
||||
```smarty
|
||||
{section name=customer loop=$customers show=$show_customer_info}
|
||||
{$smarty.section.customer.rownum} id: {$customers[customer]}<br />
|
||||
{/section}
|
||||
|
||||
{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}
|
||||
|
||||
{if $smarty.section.customer.show}
|
||||
the section was shown.
|
||||
{else}
|
||||
the section was not shown.
|
||||
{/if}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
```html
|
||||
1 id: 1000<br />
|
||||
2 id: 1001<br />
|
||||
3 id: 1002<br />
|
||||
|
||||
1 id: 1000<br />
|
||||
2 id: 1001<br />
|
||||
3 id: 1002<br />
|
||||
|
||||
the section was shown.
|
||||
|
||||
the section was shown.
|
||||
```
|
||||
|
||||
|
||||
.total {#section.property.total}
|
||||
------
|
||||
## .total
|
||||
|
||||
`total` contains the number of iterations that this `{section}` will
|
||||
loop. This can be used inside or after a `{section}`.
|
||||
|
||||
|
||||
{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.
|
||||
|
||||
```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.
|
||||
```
|
||||
|
||||
|
||||
See also [`{foreach}`](#language.function.foreach),
|
||||
[`{for}`](#language.function.for), [`{while}`](#language.function.while)
|
||||
and [`$smarty.section`](#language.variables.smarty.loops).
|
||||
See also [`{foreach}`](./language-function-foreach.md),
|
||||
[`{for}`](./language-function-for.md), [`{while}`](./language-function-while.md)
|
||||
and [`$smarty.section`](../language-variables/language-variables-smarty.md#smartysection-languagevariablessmartyloops).
|
||||
|
||||
@@ -1,29 +1,35 @@
|
||||
{setfilter} {#language.function.setfilter}
|
||||
===========
|
||||
# {setfilter}
|
||||
|
||||
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:
|
||||
|
||||
- A variable filter plugin specified by it\'s name.
|
||||
- A variable filter plugin specified by it's name.
|
||||
|
||||
- A modidier specified by it\'s name and optional additional
|
||||
- A modifier specified by it's name and optional additional
|
||||
parameter.
|
||||
|
||||
`{setfilter}...{/setfilter}` blocks can be nested. The filter definition
|
||||
of inner blocks does replace the definition of the outer block.
|
||||
|
||||
Template instance filters run in addition to other modifiers and
|
||||
filters. They run in the following order: modifier, default\_modifier,
|
||||
\$escape\_html, registered variable filters, autoloaded variable
|
||||
filters, template instance\'s variable filters. Everything after
|
||||
default\_modifier can be disabled with the `nofilter` flag.
|
||||
filters. They run in the following order: modifier, default_modifier,
|
||||
$escape_html, registered variable filters, autoloaded variable
|
||||
filters, template instance's variable filters. Everything after
|
||||
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}
|
||||
{$foo} {* filter1 runs on output of $foo *}
|
||||
{setfilter filter2|mod:true}
|
||||
@@ -32,11 +38,6 @@ default\_modifier can be disabled with the `nofilter` flag.
|
||||
{$buh} {* filter1 runs on output of $buh *}
|
||||
{/setfilter}
|
||||
{$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,84 +0,0 @@
|
||||
{\$var=\...} {#language.function.shortform.assign}
|
||||
============
|
||||
|
||||
This is a short-hand version of the {assign} function. You can assign
|
||||
values directly to the template, or assign values to array elements too.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Assignment of variables in-template is essentially placing application
|
||||
> logic into the presentation that may be better handled in PHP. Use at
|
||||
> your own discretion.
|
||||
|
||||
The following attributes can be added to the tag:
|
||||
|
||||
**Attributes:**
|
||||
|
||||
Attribute Name Shorthand Type Required Default Description
|
||||
---------------- ----------- -------- ---------- --------- -----------------------------------------------------------------------
|
||||
scope n/a string No *n/a* The scope of the assigned variable: \'parent\',\'root\' or \'global\'
|
||||
|
||||
**Option Flags:**
|
||||
|
||||
Name Description
|
||||
--------- -----------------------------------------------------
|
||||
nocache Assigns the variable with the \'nocache\' attribute
|
||||
|
||||
|
||||
{$name='Bob'}
|
||||
|
||||
The value of $name is {$name}.
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
The value of $name is Bob.
|
||||
|
||||
|
||||
|
||||
|
||||
{$running_total=$running_total+$some_array[row].some_value}
|
||||
|
||||
|
||||
|
||||
|
||||
{$user.name="Bob"}
|
||||
|
||||
|
||||
|
||||
|
||||
{$user.name.first="Bob"}
|
||||
|
||||
|
||||
|
||||
|
||||
{$users[]="Bob"}
|
||||
|
||||
|
||||
|
||||
Variables assigned in the included template will be seen in the
|
||||
including template.
|
||||
|
||||
|
||||
{include file="sub_template.tpl"}
|
||||
...
|
||||
{* display variable assigned in sub_template *}
|
||||
{$foo}<br>
|
||||
...
|
||||
|
||||
|
||||
|
||||
The template above includes the example `sub_template.tpl` below
|
||||
|
||||
|
||||
...
|
||||
{* foo will be known also in the including template *}
|
||||
{$foo="something" scope=parent}
|
||||
{* bar is assigned only local in the including template *}
|
||||
{$bar="value"}
|
||||
...
|
||||
|
||||
See also [`{assign}`](#language.function.assign) and
|
||||
[`{append}`](#language.function.append)
|
||||
@@ -1,9 +1,8 @@
|
||||
{strip} {#language.function.strip}
|
||||
=======
|
||||
# {strip}
|
||||
|
||||
Many times web designers run into the issue where white space and
|
||||
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
|
||||
unmanageable templates.
|
||||
|
||||
@@ -15,34 +14,32 @@ worry about extra white space causing problems.
|
||||
> **Note**
|
||||
>
|
||||
> `{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.
|
||||
|
||||
|
||||
{* the following will be all run into one line upon output *}
|
||||
{strip}
|
||||
<table border='0'>
|
||||
```smarty
|
||||
{* the following will be all run into one line upon output *}
|
||||
{strip}
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{$url}">
|
||||
<font color="red">This is a test</font>
|
||||
<a href="#">
|
||||
This is a test
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
{/strip}
|
||||
|
||||
{/strip}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
<table border='0'><tr><td><a href="http://. snipped...</a></td></tr></table>
|
||||
|
||||
|
||||
```html
|
||||
<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
|
||||
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
|
||||
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](&url.php-manual;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
|
||||
`{/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
|
||||
separated from surrounding elements by spaces. Note that items listed in
|
||||
\[brackets\] are optional. PHP equivalents are shown where applicable.
|
||||
|
||||
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 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
|
||||
## Qualifiers
|
||||
|
||||
| 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}
|
||||
{$foo--}
|
||||
{/while}
|
||||
The above example will count down the value of $foo until 1 is reached.
|
||||
|
||||
|
||||
|
||||
The above example will count down the value of \$foo until 1 is reached.
|
||||
|
||||
See also [`{foreach}`](#language.function.foreach),
|
||||
[`{for}`](#language.function.for) and
|
||||
[`{section}`](#language.function.section).
|
||||
See also [`{foreach}`](./language-function-foreach.md),
|
||||
[`{for}`](./language-function-for.md) and
|
||||
[`{section}`](./language-function-section.md).
|
||||
|
||||
@@ -1,35 +1,32 @@
|
||||
Combining Modifiers {#language.combining.modifiers}
|
||||
===================
|
||||
# Combining Modifiers
|
||||
|
||||
You can apply any number of modifiers to a variable. They will be
|
||||
applied in the order they are combined, from left to right. They must be
|
||||
separated with a `|` (pipe) character.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
|
||||
|
||||
?>
|
||||
$smarty->assign('articleTitle', 'Smokers are Productive, but Death Cuts Efficiency.');
|
||||
```
|
||||
|
||||
where template is:
|
||||
|
||||
|
||||
{$articleTitle}
|
||||
{$articleTitle|upper|spacify}
|
||||
{$articleTitle|lower|spacify|truncate}
|
||||
{$articleTitle|lower|truncate:30|spacify}
|
||||
{$articleTitle|lower|spacify|truncate:30:". . ."}
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|upper|spacify}
|
||||
{$articleTitle|lower|spacify|truncate}
|
||||
{$articleTitle|lower|truncate:30|spacify}
|
||||
{$articleTitle|lower|spacify|truncate:30:". . ."}
|
||||
```
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
Smokers are Productive, but Death Cuts Efficiency.
|
||||
S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
|
||||
s m o k e r s a r ....snip.... b u t d e a t h c u t s...
|
||||
s m o k e r s a r e p r o d u c t i v e , b u t . . .
|
||||
s m o k e r s a r e p. . .
|
||||
|
||||
|
||||
```
|
||||
Smokers are Productive, but Death Cuts Efficiency.
|
||||
S M O K E R S A R ....snip.... H C U T S E F F I C I E N C Y .
|
||||
s m o k e r s a r ....snip.... b u t d e a t h c u t s...
|
||||
s m o k e r s a r e p r o d u c t i v e , b u t . . .
|
||||
s m o k e r s a r e p. . .
|
||||
```
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
Custom Functions {#language.custom.functions}
|
||||
================
|
||||
|
||||
Smarty comes with several custom plugin functions that you can use in
|
||||
the templates.
|
||||
|
||||
## Table of contents
|
||||
- [{counter}](./language-custom-functions/language-function-counter.md)
|
||||
- [{cycle}](./language-custom-functions/language-function-cycle.md)
|
||||
- [{eval}](./language-custom-functions/language-function-eval.md)
|
||||
- [{fetch}](./language-custom-functions/language-function-fetch.md)
|
||||
- [{html_checkboxes}](./language-custom-functions/language-function-html-checkboxes.md)
|
||||
- [{html_image}](./language-custom-functions/language-function-html-image.md)
|
||||
- [{html_options}](./language-custom-functions/language-function-html-options.md)
|
||||
- [{html_radios}](./language-custom-functions/language-function-html-radios.md)
|
||||
- [{html_select_date}](./language-custom-functions/language-function-html-select-date.md)
|
||||
- [{html_select_time}](./language-custom-functions/language-function-html-select-time.md)
|
||||
- [{html_table}](./language-custom-functions/language-function-html-table.md)
|
||||
- [{mailto}](./language-custom-functions/language-function-mailto.md)
|
||||
- [{math}](./language-custom-functions/language-function-math.md)
|
||||
- [{textformat}](./language-custom-functions/language-function-textformat.md)
|
||||
@@ -0,0 +1,19 @@
|
||||
# Custom Tags
|
||||
|
||||
Smarty comes with several custom plugin functions that you can use in
|
||||
the templates.
|
||||
|
||||
- [{counter}](language-function-counter.md)
|
||||
- [{cycle}](language-function-cycle.md)
|
||||
- [{eval}](language-function-eval.md)
|
||||
- [{fetch}](language-function-fetch.md)
|
||||
- [{html_checkboxes}](language-function-html-checkboxes.md)
|
||||
- [{html_image}](language-function-html-image.md)
|
||||
- [{html_options}](language-function-html-options.md)
|
||||
- [{html_radios}](language-function-html-radios.md)
|
||||
- [{html_select_date}](language-function-html-select-date.md)
|
||||
- [{html_select_time}](language-function-html-select-time.md)
|
||||
- [{html_table}](language-function-html-table.md)
|
||||
- [{mailto}](language-function-mailto.md)
|
||||
- [{math}](language-function-math.md)
|
||||
- [{textformat}](language-function-textformat.md)
|
||||
@@ -1,41 +1,45 @@
|
||||
{counter} {#language.function.counter}
|
||||
=========
|
||||
# {counter}
|
||||
|
||||
`{counter}` is used to print out a count. `{counter}` will remember the
|
||||
count on each iteration. You can adjust the number, the interval and the
|
||||
direction of the count, as well as determine whether or not to print the
|
||||
direction of the count, as well as determine whether to print the
|
||||
value. You can run multiple counters concurrently by supplying a unique
|
||||
name for each one. If you do not supply a name, the name "default" will
|
||||
be used.
|
||||
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|-----------------------------------------------------------|
|
||||
| name | No | The name of the counter |
|
||||
| start | No | The initial number to start counting from (defaults to 1) |
|
||||
| skip | No | The interval to count by (defaults to 1) |
|
||||
| direction | No | The direction to count (up/down) (defaults to 'up') |
|
||||
| print | No | Whether or not to print the value (defaults to true) |
|
||||
| assign | No | the template variable the output will be assigned to |
|
||||
|
||||
If you supply the `assign` attribute, the output of the `{counter}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ----------- ------------------------------------------------------
|
||||
name string No *default* The name of the counter
|
||||
start number No *1* The initial number to start counting from
|
||||
skip number No *1* The interval to count by
|
||||
direction string No *up* The direction to count (up/down)
|
||||
print boolean No *TRUE* Whether or not to print the value
|
||||
assign string No *n/a* the template variable the output will be assigned to
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
|
||||
{* initialize the count *}
|
||||
{counter start=0 skip=2}<br />
|
||||
{counter}<br />
|
||||
{counter}<br />
|
||||
{counter}<br />
|
||||
{* initialize the count *}
|
||||
{counter start=0 skip=2}<br />
|
||||
{counter}<br />
|
||||
{counter}<br />
|
||||
{counter}<br />
|
||||
|
||||
|
||||
```
|
||||
|
||||
this will output:
|
||||
|
||||
|
||||
0<br />
|
||||
2<br />
|
||||
4<br />
|
||||
6<br />
|
||||
|
||||
```html
|
||||
0<br />
|
||||
2<br />
|
||||
4<br />
|
||||
6<br />
|
||||
```
|
||||
|
||||
|
||||
@@ -1,22 +1,23 @@
|
||||
{cycle} {#language.function.cycle}
|
||||
=======
|
||||
# {cycle}
|
||||
|
||||
`{cycle}` is used to alternate a set of values. This makes it easy to
|
||||
for example, alternate between two or more colors in a table, or cycle
|
||||
through an array of values.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ----------- -------------------------------------------------------------------------------------------------------------
|
||||
name string No *default* The name of the cycle
|
||||
values mixed Yes *N/A* The values to cycle through, either a comma delimited list (see delimiter attribute), or an array of values
|
||||
print boolean No *TRUE* Whether to print the value or not
|
||||
advance boolean No *TRUE* Whether or not to advance to the next value
|
||||
delimiter string No *,* The delimiter to use in the values attribute
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
reset boolean No *FALSE* The cycle will be set to the first value and not advanced
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|-------------------------------------------------------------------------------------------------------------|
|
||||
| name | No | The name of the cycle |
|
||||
| values | Yes | The values to cycle through, either a comma delimited list (see delimiter attribute), or an array of values |
|
||||
| print | No | Whether to print the value or not (defaults to true) |
|
||||
| advance | No | Whether or not to advance to the next value (defaults to true) |
|
||||
| delimiter | No | The delimiter to use in the values attribute (defaults to ',') |
|
||||
| assign | No | The template variable the output will be assigned to |
|
||||
| reset | No | The cycle will be set to the first value and not advanced (defaults to false) |
|
||||
|
||||
- You can `{cycle}` through more than one set of values in a template
|
||||
by supplying a `name` attribute. Give each `{cycle}` an unique
|
||||
by supplying a `name` attribute. Give each `{cycle}` a unique
|
||||
`name`.
|
||||
|
||||
- You can force the current value not to print with the `print`
|
||||
@@ -30,20 +31,18 @@ through an array of values.
|
||||
function will be assigned to a template variable instead of being
|
||||
output to the template.
|
||||
|
||||
<!-- -->
|
||||
|
||||
|
||||
{section name=rows loop=$data}
|
||||
## Examples
|
||||
```smarty
|
||||
{section name=rows loop=$data}
|
||||
<tr class="{cycle values="odd,even"}">
|
||||
<td>{$data[rows]}</td>
|
||||
</tr>
|
||||
{/section}
|
||||
|
||||
|
||||
{/section}
|
||||
```
|
||||
|
||||
The above template would output:
|
||||
|
||||
|
||||
```html
|
||||
<tr class="odd">
|
||||
<td>1</td>
|
||||
</tr>
|
||||
@@ -53,5 +52,4 @@ The above template would output:
|
||||
<tr class="odd">
|
||||
<td>3</td>
|
||||
</tr>
|
||||
|
||||
|
||||
```
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
{debug} {#language.function.debug}
|
||||
=======
|
||||
# {debug}
|
||||
|
||||
`{debug}` dumps the debug console to the page. This works regardless of
|
||||
the [debug](#chapter.debugging.console) settings in the php script.
|
||||
the [debug](../chapter-debugging-console.md) settings in the php script.
|
||||
Since this gets executed at runtime, this is only able to show the
|
||||
[assigned](#api.assign) variables; not the templates that are in use.
|
||||
[assigned](../../programmers/api-functions/api-assign.md) variables; not the templates that are in use.
|
||||
However, you can see all the currently available variables within the
|
||||
scope of a template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- -------------- ---------------------------------
|
||||
output string No *javascript* output type, html or javascript
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|------------------------------------------------------------|
|
||||
| output | No | output type, html or javascript (defaults to 'javascript') |
|
||||
|
||||
See also the [debugging console page](#chapter.debugging.console).
|
||||
See also the [debugging console page](../chapter-debugging-console.md).
|
||||
|
||||
@@ -1,19 +1,20 @@
|
||||
{eval} {#language.function.eval}
|
||||
======
|
||||
# {eval}
|
||||
|
||||
`{eval}` is used to evaluate a variable as a template. This can be used
|
||||
for things like embedding template tags/variables into variables or
|
||||
tags/variables into config file variables.
|
||||
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|------------------------------------------------------|
|
||||
| var | Yes | Variable (or string) to evaluate |
|
||||
| assign | No | The template variable the output will be assigned to |
|
||||
|
||||
If you supply the `assign` attribute, the output of the `{eval}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ------------------------------------------------------
|
||||
var mixed Yes *n/a* Variable (or string) to evaluate
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> - Evaluated variables are treated the same as templates. They follow
|
||||
@@ -21,64 +22,60 @@ output to the template.
|
||||
> templates.
|
||||
>
|
||||
> - Evaluated variables are compiled on every invocation, the compiled
|
||||
> versions are not saved! However if you have [caching](#caching)
|
||||
> versions are not saved! However, if you have [caching](../../api/caching/basics.md)
|
||||
> enabled, the output will be cached with the rest of the template.
|
||||
>
|
||||
> - If the content to evaluate doesn\'t change often, or is used
|
||||
> - If the content to evaluate doesn't change often, or is used
|
||||
> repeatedly, consider using
|
||||
> `{include file="string:{$template_code}"}` instead. This may cache
|
||||
> the compiled state and thus doesn\'t have to run the (comparably
|
||||
> the compiled state and thus doesn't have to run the (comparably
|
||||
> slow) compiler on every invocation.
|
||||
>
|
||||
|
||||
## Examples
|
||||
|
||||
The contents of the config file, `setup.conf`.
|
||||
|
||||
|
||||
emphstart = <strong>
|
||||
emphend = </strong>
|
||||
title = Welcome to {$company}'s home page!
|
||||
ErrorCity = You must supply a {#emphstart#}city{#emphend#}.
|
||||
ErrorState = You must supply a {#emphstart#}state{#emphend#}.
|
||||
|
||||
|
||||
```ini
|
||||
emphstart = <strong>
|
||||
emphend = </strong>
|
||||
title = Welcome to {$company}'s home page!
|
||||
ErrorCity = You must supply a {#emphstart#}city{#emphend#}.
|
||||
ErrorState = You must supply a {#emphstart#}state{#emphend#}.
|
||||
```
|
||||
|
||||
Where the template is:
|
||||
|
||||
```smarty
|
||||
{config_load file='setup.conf'}
|
||||
|
||||
{config_load file='setup.conf'}
|
||||
|
||||
{eval var=$foo}
|
||||
{eval var=#title#}
|
||||
{eval var=#ErrorCity#}
|
||||
{eval var=#ErrorState# assign='state_error'}
|
||||
{$state_error}
|
||||
|
||||
{eval var=$foo}
|
||||
{eval var=#title#}
|
||||
{eval var=#ErrorCity#}
|
||||
{eval var=#ErrorState# assign='state_error'}
|
||||
{$state_error}
|
||||
```
|
||||
|
||||
|
||||
The above template will output:
|
||||
|
||||
|
||||
This is the contents of foo.
|
||||
Welcome to Foobar Pub & Grill's home page!
|
||||
You must supply a <strong>city</strong>.
|
||||
You must supply a <strong>state</strong>.
|
||||
|
||||
|
||||
```html
|
||||
This is the contents of foo.
|
||||
Welcome to Foobar Pub & Grill's home page!
|
||||
You must supply a <strong>city</strong>.
|
||||
You must supply a <strong>state</strong>.
|
||||
```
|
||||
|
||||
This outputs the server name (in uppercase) and IP. The assigned
|
||||
variable `$str` could be from a database query.
|
||||
|
||||
|
||||
<?php
|
||||
```php
|
||||
<?php
|
||||
$str = 'The server name is {$smarty.server.SERVER_NAME|upper} '
|
||||
.'at {$smarty.server.SERVER_ADDR}';
|
||||
$smarty->assign('foo',$str);
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
{eval var=$foo}
|
||||
|
||||
|
||||
```smarty
|
||||
{eval var=$foo}
|
||||
```
|
||||
|
||||
@@ -1,10 +1,15 @@
|
||||
{fetch} {#language.function.fetch}
|
||||
=======
|
||||
# {fetch}
|
||||
|
||||
`{fetch}` is used to retrieve files from the local file system, http, or
|
||||
ftp and display the contents.
|
||||
|
||||
- If the file name begins with `http://`, the web site page will be
|
||||
## Attributes
|
||||
| Attribute | Required | Description |
|
||||
|-----------|----------|------------------------------------------------------|
|
||||
| file | Yes | The file, http or ftp site to fetch |
|
||||
| assign | No | The template variable the output will be assigned to |
|
||||
|
||||
- If the file name begins with `http://`, the website page will be
|
||||
fetched and displayed.
|
||||
|
||||
> **Note**
|
||||
@@ -20,40 +25,37 @@ ftp and display the contents.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> If security is enabled and you are fetching a file from the local
|
||||
> If security is enabled, and you are fetching a file from the local
|
||||
> file system, `{fetch}` will only allow files from within the
|
||||
> `$secure_dir` path of the securty policy. See the
|
||||
> [Security](#advanced.features.security) section for details.
|
||||
> `$secure_dir` path of the security policy. See the
|
||||
> [Security](../../api/security.md) section for details.
|
||||
|
||||
- If the `assign` attribute is set, the output of the `{fetch}`
|
||||
function will be assigned to this template variable instead of being
|
||||
output to the template.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- ------------------------------------------------------
|
||||
file string Yes *n/a* The file, http or ftp site to fetch
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{* include some javascript in your template *}
|
||||
{fetch file='/export/httpd/www.example.com/docs/navbar.js'}
|
||||
|
||||
{* include some javascript in your template *}
|
||||
{fetch file='/export/httpd/www.example.com/docs/navbar.js'}
|
||||
{* embed some weather text in your template from another web site *}
|
||||
{fetch file='http://www.myweather.com/68502/'}
|
||||
|
||||
{* embed some weather text in your template from another web site *}
|
||||
{fetch file='http://www.myweather.com/68502/'}
|
||||
|
||||
{* fetch a news headline file via ftp *}
|
||||
{fetch file='ftp://user:password@ftp.example.com/path/to/currentheadlines.txt'}
|
||||
{* as above but with variables *}
|
||||
{fetch file="ftp://`$user`:`$password`@`$server`/`$path`"}
|
||||
|
||||
{* assign the fetched contents to a template variable *}
|
||||
{fetch file='http://www.myweather.com/68502/' assign='weather'}
|
||||
{if $weather ne ''}
|
||||
<div id="weather">{$weather}</div>
|
||||
{/if}
|
||||
{* fetch a news headline file via ftp *}
|
||||
{fetch file='ftp://user:password@ftp.example.com/path/to/currentheadlines.txt'}
|
||||
{* as above but with variables *}
|
||||
{fetch file="ftp://`$user`:`$password`@`$server`/`$path`"}
|
||||
|
||||
{* assign the fetched contents to a template variable *}
|
||||
{fetch file='http://www.myweather.com/68502/' assign='weather'}
|
||||
{if $weather ne ''}
|
||||
<div id="weather">{$weather}</div>
|
||||
{/if}
|
||||
```
|
||||
|
||||
|
||||
See also [`{capture}`](#language.function.capture),
|
||||
[`{eval}`](#language.function.eval),
|
||||
[`{assign}`](#language.function.assign) and [`fetch()`](#api.fetch).
|
||||
See also [`{capture}`](../language-builtin-functions/language-function-capture.md),
|
||||
[`{eval}`](language-function-eval.md),
|
||||
[`{assign}`](../language-builtin-functions/language-function-assign.md) and [`fetch()`](../../programmers/api-functions/api-fetch.md).
|
||||
|
||||
@@ -1,113 +1,102 @@
|
||||
{html\_checkboxes} {#language.function.html.checkboxes}
|
||||
==================
|
||||
# {html_checkboxes}
|
||||
|
||||
`{html_checkboxes}` is a [custom function](#language.custom.functions)
|
||||
`{html_checkboxes}` is a [custom function](index.md)
|
||||
that creates an html checkbox group with provided data. It takes care of
|
||||
which item(s) are selected by default as well.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- ------------------- ------------------------------------- ------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
name string No *checkbox* Name of checkbox list
|
||||
values array Yes, unless using options attribute *n/a* An array of values for checkbox buttons
|
||||
output array Yes, unless using options attribute *n/a* An array of output for checkbox buttons
|
||||
selected string/array No *empty* The selected checkbox element(s)
|
||||
options associative array Yes, unless using values and output *n/a* An associative array of values and output
|
||||
separator string No *empty* String of text to separate each checkbox item
|
||||
assign string No *empty* Assign checkbox tags to an array instead of output
|
||||
labels boolean No *TRUE* Add \<label\>-tags to the output
|
||||
label\_ids boolean No *FALSE* Add id-attributes to \<label\> and \<input\> to the output
|
||||
escape boolean No *TRUE* Escape the output / content (values are always escaped)
|
||||
strict boolean No *FALSE* Will make the \"extra\" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *\"disabled\"* and *\"readonly\"* respectively
|
||||
## Attributes
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use
|
||||
`options` instead.
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| name | No | Name of checkbox list (defaults to 'checkbox') |
|
||||
| values | Yes, unless using options attribute | An array of values for checkbox buttons |
|
||||
| output | Yes, unless using options attribute | An array of output for checkbox buttons |
|
||||
| selected | No | The selected checkbox element(s) as a string or array |
|
||||
| options | Yes, unless using values and output | An associative array of values and output |
|
||||
| separator | No | String of text to separate each checkbox item |
|
||||
| assign | No | Assign checkbox tags to an array instead of output |
|
||||
| labels | No | Add <label\>-tags to the output (defaults to true) |
|
||||
| label\_ids | No | Add id-attributes to <label\> and <input\> to the output (defaults to false) |
|
||||
| escape | No | Escape the output / content (values are always escaped) (defaults to true) |
|
||||
| strict | No | Will make the "extra" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *"disabled"* and *"readonly"* respectively (defaults to false) |
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use `options` instead.
|
||||
|
||||
- All output is XHTML compliant.
|
||||
|
||||
- All parameters that are not in the list above are printed as
|
||||
name/value-pairs inside each of the created \<input\>-tags.
|
||||
name/value-pairs inside each of the created <input\>-tags.
|
||||
|
||||
<!-- -->
|
||||
## Examples
|
||||
```php
|
||||
<?php
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jack Smith',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jack Smith',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
```
|
||||
|
||||
where template is
|
||||
|
||||
|
||||
{html_checkboxes name='id' values=$cust_ids output=$cust_names
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
```smarty
|
||||
{html_checkboxes name='id' values=$cust_ids output=$cust_names selected=$customer_id separator='<br />'}
|
||||
```
|
||||
|
||||
or where PHP code is:
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_checkboxes', array(
|
||||
1000 => 'Joe Schmoe',
|
||||
1001 => 'Jack Smith',
|
||||
1002 => 'Jane Johnson',
|
||||
1003 => 'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
$smarty->assign(
|
||||
'cust_checkboxes',
|
||||
[
|
||||
1000 => 'Joe Schmoe',
|
||||
1001 => 'Jack Smith',
|
||||
1002 => 'Jane Johnson',
|
||||
1003 => 'Charlie Brown',
|
||||
]
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
```
|
||||
|
||||
and the template is
|
||||
|
||||
|
||||
{html_checkboxes name='id' options=$cust_checkboxes
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
```smarty
|
||||
{html_checkboxes name='id' options=$cust_checkboxes selected=$customer_id separator='<br />'}
|
||||
```
|
||||
|
||||
both examples will output:
|
||||
|
||||
|
||||
<label><input type="checkbox" name="id[]" value="1000" />Joe Schmoe</label><br />
|
||||
<label><input type="checkbox" name="id[]" value="1001" checked="checked" />Jack Smith</label>
|
||||
<br />
|
||||
<label><input type="checkbox" name="id[]" value="1002" />Jane Johnson</label><br />
|
||||
<label><input type="checkbox" name="id[]" value="1003" />Charlie Brown</label><br />
|
||||
|
||||
```html
|
||||
<label><input type="checkbox" name="id[]" value="1000" />Joe Schmoe</label><br />
|
||||
<label><input type="checkbox" name="id[]" value="1001" checked="checked" />Jack Smith</label>
|
||||
<br />
|
||||
<label><input type="checkbox" name="id[]" value="1002" />Jane Johnson</label><br />
|
||||
<label><input type="checkbox" name="id[]" value="1003" />Charlie Brown</label><br />
|
||||
```
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
<?php
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select contact_id, contact_type_id, contact '
|
||||
.'from contacts where contact_id=12';
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
?>
|
||||
|
||||
|
||||
$sql = 'select contact_id, contact_type_id, contact '
|
||||
.'from contacts where contact_id=12';
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
```
|
||||
|
||||
The results of the database queries above would be output with.
|
||||
|
||||
```smarty
|
||||
{html_checkboxes name='contact_type_id' options=$contact_types selected=$contact.contact_type_id separator='<br />'}
|
||||
```
|
||||
|
||||
{html_checkboxes name='contact_type_id' options=$contact_types
|
||||
selected=$contact.contact_type_id separator='<br />'}
|
||||
|
||||
See also [`{html_radios}`](#language.function.html.radios) and
|
||||
[`{html_options}`](#language.function.html.options)
|
||||
See also [`{html_radios}`](./language-function-html-radios.md) and
|
||||
[`{html_options}`](./language-function-html-options.md)
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
{html\_image} {#language.function.html.image}
|
||||
=============
|
||||
# {html_image}
|
||||
|
||||
`{html_image}` is a [custom function](#language.custom.functions) that
|
||||
`{html_image}` is a [custom function](index.md) that
|
||||
generates an HTML `<img>` tag. The `height` and `width` are
|
||||
automatically calculated from the image file if they are not supplied.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- ----------------------- ---------------------------------------
|
||||
file string Yes *n/a* name/path to image
|
||||
height string No *actual image height* Height to display image
|
||||
width string No *actual image width* Width to display image
|
||||
basedir string no *web server doc root* Directory to base relative paths from
|
||||
alt string no *""* Alternative description of the image
|
||||
href string no *n/a* href value to link the image to
|
||||
path\_prefix string no *n/a* Prefix for output path
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|-------------------------------------------------------------------------|
|
||||
| file | Yes | name/path to image |
|
||||
| height | No | Height to display image (defaults to actual image height) |
|
||||
| width | No | Width to display image (defaults to actual image width) |
|
||||
| basedir | no | Directory to base relative paths from (defaults to web server doc root) |
|
||||
| alt | no | Alternative description of the image |
|
||||
| href | no | href value to link the image to |
|
||||
| path\_prefix | no | Prefix for output path |
|
||||
|
||||
- `basedir` is the base directory that relative image paths are based
|
||||
from. If not given, the web server\'s document root
|
||||
from. If not given, the web server's document root
|
||||
`$_ENV['DOCUMENT_ROOT']` is used as the base. If security is
|
||||
enabled, then the image must be located in the `$secure_dir` path of
|
||||
the securty policy. See the [Security](#advanced.features.security)
|
||||
the security policy. See the [Security](../../api/security.md)
|
||||
section for details.
|
||||
|
||||
- `href` is the href value to link the image to. If link is supplied,
|
||||
@@ -35,22 +36,23 @@ automatically calculated from the image file if they are not supplied.
|
||||
> **Note**
|
||||
>
|
||||
> `{html_image}` requires a hit to the disk to read the image and
|
||||
> calculate the height and width. If you don\'t use template
|
||||
> [caching](#caching), it is generally better to avoid `{html_image}`
|
||||
> calculate the height and width. If you don't use template
|
||||
> [caching](../../api/caching/basics.md), it is generally better to avoid `{html_image}`
|
||||
> and leave image tags static for optimal performance.
|
||||
|
||||
## Examples
|
||||
|
||||
{html_image file='pumpkin.jpg'}
|
||||
{html_image file='/path/from/docroot/pumpkin.jpg'}
|
||||
{html_image file='../path/relative/to/currdir/pumpkin.jpg'}
|
||||
|
||||
|
||||
```smarty
|
||||
{html_image file='pumpkin.jpg'}
|
||||
{html_image file='/path/from/docroot/pumpkin.jpg'}
|
||||
{html_image file='../path/relative/to/currdir/pumpkin.jpg'}
|
||||
```
|
||||
|
||||
Example output of the above template would be:
|
||||
|
||||
|
||||
<img src="pumpkin.jpg" alt="" width="44" height="68" />
|
||||
<img src="/path/from/docroot/pumpkin.jpg" alt="" width="44" height="68" />
|
||||
<img src="../path/relative/to/currdir/pumpkin.jpg" alt="" width="44" height="68" />
|
||||
|
||||
```html
|
||||
<img src="pumpkin.jpg" alt="" width="44" height="68" />
|
||||
<img src="/path/from/docroot/pumpkin.jpg" alt="" width="44" height="68" />
|
||||
<img src="../path/relative/to/currdir/pumpkin.jpg" alt="" width="44" height="68" />
|
||||
```
|
||||
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
{html\_options} {#language.function.html.options}
|
||||
===============
|
||||
# {html_options}
|
||||
|
||||
`{html_options}` is a [custom function](#language.custom.functions) that
|
||||
`{html_options}` is a [custom function](index.md) that
|
||||
creates the html `<select><option>` group with the assigned data. It
|
||||
takes care of which item(s) are selected by default as well.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- ------------------- ------------------------------------- --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
values array Yes, unless using options attribute *n/a* An array of values for dropdown
|
||||
output array Yes, unless using options attribute *n/a* An array of output for dropdown
|
||||
selected string/array No *empty* The selected option element(s)
|
||||
options associative array Yes, unless using values and output *n/a* An associative array of values and output
|
||||
name string No *empty* Name of select group
|
||||
strict boolean No *FALSE* Will make the \"extra\" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *\"disabled\"* and *\"readonly\"* respectively
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| values | Yes, unless using options attribute | An array of values for dropdown |
|
||||
| output | Yes, unless using options attribute | An array of output for dropdown |
|
||||
| selected | No | The selected option element(s) as a string or array |
|
||||
| options | Yes, unless using values and output | An associative array of values and output |
|
||||
| name | No | Name of select group |
|
||||
| strict | No | Will make the "extra" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *"disabled"* and *"readonly"* respectively (defaults to false) |
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use the
|
||||
combined `options` instead.
|
||||
@@ -30,126 +31,116 @@ takes care of which item(s) are selected by default as well.
|
||||
|
||||
- All output is XHTML compliant.
|
||||
|
||||
<!-- -->
|
||||
## Examples
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign('myOptions', array(
|
||||
1800 => 'Joe Schmoe',
|
||||
9904 => 'Jack Smith',
|
||||
2003 => 'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('mySelect', 9904);
|
||||
?>
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('myOptions', [
|
||||
1800 => 'Joe Schmoe',
|
||||
9904 => 'Jack Smith',
|
||||
2003 => 'Charlie Brown']
|
||||
);
|
||||
$smarty->assign('mySelect', 9904);
|
||||
```
|
||||
|
||||
The following template will generate a drop-down list. Note the presence
|
||||
of the `name` attribute which creates the `<select>` tags.
|
||||
|
||||
|
||||
{html_options name=foo options=$myOptions selected=$mySelect}
|
||||
|
||||
|
||||
```smarty
|
||||
{html_options name=foo options=$myOptions selected=$mySelect}
|
||||
```
|
||||
|
||||
Output of the above example would be:
|
||||
|
||||
|
||||
<select name="foo">
|
||||
```html
|
||||
<select name="foo">
|
||||
<option value="1800">Joe Schmoe</option>
|
||||
<option value="9904" selected="selected">Jack Smith</option>
|
||||
<option value="2003">Charlie Brown</option>
|
||||
</select>
|
||||
</select>
|
||||
```
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign('cust_ids', array(56,92,13));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown'));
|
||||
$smarty->assign('customer_id', 92);
|
||||
?>
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('cust_ids', [56,92,13]);
|
||||
$smarty->assign('cust_names', [
|
||||
'Joe Schmoe',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown']);
|
||||
$smarty->assign('customer_id', 92);
|
||||
```
|
||||
|
||||
The above arrays would be output with the following template (note the
|
||||
use of the php [`count()`](&url.php-manual;function.count) function as a
|
||||
use of the php [`count()`](https://www.php.net/function.count) function as a
|
||||
modifier to set the select size).
|
||||
|
||||
|
||||
<select name="customer_id" size="{$cust_names|@count}">
|
||||
{html_options values=$cust_ids output=$cust_names selected=$customer_id}
|
||||
</select>
|
||||
|
||||
|
||||
```smarty
|
||||
<select name="customer_id" size="{$cust_names|@count}">
|
||||
{html_options values=$cust_ids output=$cust_names selected=$customer_id}
|
||||
</select>
|
||||
```
|
||||
|
||||
The above example would output:
|
||||
|
||||
```html
|
||||
<select name="customer_id" size="3">
|
||||
<option value="56">Joe Schmoe</option>
|
||||
<option value="92" selected="selected">Jane Johnson</option>
|
||||
<option value="13">Charlie Brown</option>
|
||||
</select>
|
||||
```
|
||||
|
||||
<select name="customer_id" size="3">
|
||||
<option value="56">Joe Schmoe</option>
|
||||
<option value="92" selected="selected">Jane Johnson</option>
|
||||
<option value="13">Charlie Brown</option>
|
||||
</select>
|
||||
```php
|
||||
<?php
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
|
||||
$sql = 'select contact_id, name, email, contact_type_id
|
||||
from contacts where contact_id='.$contact_id;
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select contact_id, name, email, contact_type_id
|
||||
from contacts where contact_id='.$contact_id;
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
?>
|
||||
```
|
||||
|
||||
Where a template could be as follows. Note the use of the
|
||||
[`truncate`](#language.modifier.truncate) modifier.
|
||||
[`truncate`](../language-modifiers/language-modifier-truncate.md) modifier.
|
||||
|
||||
```smarty
|
||||
<select name="type_id">
|
||||
<option value='null'>-- none --</option>
|
||||
{html_options options=$contact_types|truncate:20 selected=$contact.type_id}
|
||||
</select>
|
||||
```
|
||||
|
||||
<select name="type_id">
|
||||
<option value='null'>-- none --</option>
|
||||
{html_options options=$contact_types|truncate:20 selected=$contact.type_id}
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
$arr['Sport'] = array(6 => 'Golf', 9 => 'Cricket',7 => 'Swim');
|
||||
$arr['Rest'] = array(3 => 'Sauna',1 => 'Massage');
|
||||
$smarty->assign('lookups', $arr);
|
||||
$smarty->assign('fav', 7);
|
||||
?>
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$arr['Sport'] = array(6 => 'Golf', 9 => 'Cricket',7 => 'Swim');
|
||||
$arr['Rest'] = array(3 => 'Sauna',1 => 'Massage');
|
||||
$smarty->assign('lookups', $arr);
|
||||
$smarty->assign('fav', 7);
|
||||
```
|
||||
|
||||
The script above and the following template
|
||||
|
||||
|
||||
{html_options name=foo options=$lookups selected=$fav}
|
||||
|
||||
|
||||
```smarty
|
||||
{html_options name=foo options=$lookups selected=$fav}
|
||||
```
|
||||
|
||||
would output:
|
||||
|
||||
|
||||
<select name="foo">
|
||||
```html
|
||||
<select name="foo">
|
||||
<optgroup label="Sport">
|
||||
<option value="6">Golf</option>
|
||||
<option value="9">Cricket</option>
|
||||
<option value="7" selected="selected">Swim</option>
|
||||
<option value="6">Golf</option>
|
||||
<option value="9">Cricket</option>
|
||||
<option value="7" selected="selected">Swim</option>
|
||||
</optgroup>
|
||||
<optgroup label="Rest">
|
||||
<option value="3">Sauna</option>
|
||||
<option value="1">Massage</option>
|
||||
<option value="3">Sauna</option>
|
||||
<option value="1">Massage</option>
|
||||
</optgroup>
|
||||
</select>
|
||||
</select>
|
||||
```
|
||||
|
||||
See also [`{html_checkboxes}`](#language.function.html.checkboxes) and
|
||||
[`{html_radios}`](#language.function.html.radios)
|
||||
See also [`{html_checkboxes}`](./language-function-html-checkboxes.md) and
|
||||
[`{html_radios}`](./language-function-html-radios.md)
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
{html\_radios} {#language.function.html.radios}
|
||||
==============
|
||||
# {html_radios}
|
||||
|
||||
`{html_radios}` is a [custom function](#language.custom.functions) that
|
||||
creates a HTML radio button group. It also takes care of which item is
|
||||
`{html_radios}` is a [custom function](index.md) that
|
||||
creates an HTML radio button group. It also takes care of which item is
|
||||
selected by default as well.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- ------------------- ------------------------------------- --------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
name string No *radio* Name of radio list
|
||||
values array Yes, unless using options attribute *n/a* An array of values for radio buttons
|
||||
output array Yes, unless using options attribute *n/a* An array of output for radio buttons
|
||||
selected string No *empty* The selected radio element
|
||||
options associative array Yes, unless using values and output *n/a* An associative array of values and output
|
||||
separator string No *empty* String of text to separate each radio item
|
||||
assign string No *empty* Assign radio tags to an array instead of output
|
||||
labels boolean No *TRUE* Add \<label\>-tags to the output
|
||||
label\_ids boolean No *FALSE* Add id-attributes to \<label\> and \<input\> to the output
|
||||
escape boolean No *TRUE* Escape the output / content (values are always escaped)
|
||||
strict boolean No *FALSE* Will make the \"extra\" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *\"disabled\"* and *\"readonly\"* respectively
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| name | No | Name of radio list |
|
||||
| values | Yes, unless using options attribute | An array of values for radio buttons |
|
||||
| output | Yes, unless using options attribute | An array of output for radio buttons |
|
||||
| selected | No | The selected radio element |
|
||||
| options | Yes, unless using values and output | An associative array of values and output |
|
||||
| separator | No | String of text to separate each radio item |
|
||||
| assign | No | Assign radio tags to an array instead of output |
|
||||
| labels | No | Add <label>-tags to the output (defaults to true) |
|
||||
| label\_ids | No | Add id-attributes to <label\> and <input\> to the output (defaults to false) |
|
||||
| escape | No | Escape the output / content (values are always escaped) (defaults to true) |
|
||||
| strict | No | Will make the "extra" attributes *disabled* and *readonly* only be set, if they were supplied with either boolean *TRUE* or string *"disabled"* and *"readonly"* respectively (defaults to false) |
|
||||
|
||||
- Required attributes are `values` and `output`, unless you use
|
||||
`options` instead.
|
||||
@@ -27,86 +28,77 @@ selected by default as well.
|
||||
- All parameters that are not in the list above are output as
|
||||
name/value-pairs inside each of the created `<input>`-tags.
|
||||
|
||||
<!-- -->
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jack Smith',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
$smarty->assign('cust_ids', array(1000,1001,1002,1003));
|
||||
$smarty->assign('cust_names', array(
|
||||
'Joe Schmoe',
|
||||
'Jack Smith',
|
||||
'Jane Johnson',
|
||||
'Charlie Brown')
|
||||
);
|
||||
$smarty->assign('customer_id', 1001);
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
```smarty
|
||||
{html_radios name='id' values=$cust_ids output=$cust_names
|
||||
selected=$customer_id separator='<br />'}
|
||||
```
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign('cust_radios', array(
|
||||
1000 => 'Joe Schmoe',
|
||||
1001 => 'Jack Smith',
|
||||
1002 => 'Jane Johnson',
|
||||
1003 => 'Charlie Brown'));
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
```smarty
|
||||
|
||||
{html_radios name='id' values=$cust_ids output=$cust_names
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
{html_radios name='id' options=$cust_radios
|
||||
selected=$customer_id separator='<br />'}
|
||||
```
|
||||
|
||||
|
||||
|
||||
<?php
|
||||
|
||||
$smarty->assign('cust_radios', array(
|
||||
1000 => 'Joe Schmoe',
|
||||
1001 => 'Jack Smith',
|
||||
1002 => 'Jane Johnson',
|
||||
1003 => 'Charlie Brown'));
|
||||
$smarty->assign('customer_id', 1001);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
{html_radios name='id' options=$cust_radios
|
||||
selected=$customer_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
Both examples will output:
|
||||
|
||||
|
||||
<label><input type="radio" name="id" value="1000" />Joe Schmoe</label><br />
|
||||
<label><input type="radio" name="id" value="1001" checked="checked" />Jack Smith</label><br />
|
||||
<label><input type="radio" name="id" value="1002" />Jane Johnson</label><br />
|
||||
<label><input type="radio" name="id" value="1003" />Charlie Brown</label><br />
|
||||
|
||||
```html
|
||||
<label><input type="radio" name="id" value="1000" />Joe Schmoe</label><br />
|
||||
<label><input type="radio" name="id" value="1001" checked="checked" />Jack Smith</label><br />
|
||||
<label><input type="radio" name="id" value="1002" />Jane Johnson</label><br />
|
||||
<label><input type="radio" name="id" value="1003" />Charlie Brown</label><br />
|
||||
```
|
||||
|
||||
```php
|
||||
|
||||
<?php
|
||||
|
||||
<?php
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
|
||||
$sql = 'select type_id, types from contact_types order by type';
|
||||
$smarty->assign('contact_types',$db->getAssoc($sql));
|
||||
$sql = 'select contact_id, name, email, contact_type_id '
|
||||
.'from contacts where contact_id='.$contact_id;
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
$sql = 'select contact_id, name, email, contact_type_id '
|
||||
.'from contacts where contact_id='.$contact_id;
|
||||
$smarty->assign('contact',$db->getRow($sql));
|
||||
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
The variable assigned from the database above would be output with the
|
||||
template:
|
||||
|
||||
```smarty
|
||||
{html_radios name='contact_type_id' options=$contact_types
|
||||
selected=$contact.contact_type_id separator='<br />'}
|
||||
```
|
||||
|
||||
{html_radios name='contact_type_id' options=$contact_types
|
||||
selected=$contact.contact_type_id separator='<br />'}
|
||||
|
||||
|
||||
|
||||
See also [`{html_checkboxes}`](#language.function.html.checkboxes) and
|
||||
[`{html_options}`](#language.function.html.options)
|
||||
See also [`{html_checkboxes}`](language-function-html-checkboxes.md) and
|
||||
[`{html_options}`](language-function-html-options.md)
|
||||
|
||||
@@ -1,62 +1,64 @@
|
||||
{html\_select\_date} {#language.function.html.select.date}
|
||||
====================
|
||||
# {html_select_date}
|
||||
|
||||
`{html_select_date}` is a [custom function](#language.custom.functions)
|
||||
that creates date dropdowns. It can display any or all of year, month,
|
||||
`{html_select_date}` is a [custom function](index.md)
|
||||
that creates date dropdowns. It can display any or all of: year, month,
|
||||
and day. All parameters that are not in the list below are printed as
|
||||
name/value-pairs inside the `<select>` tags of day, month and year.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
prefix string No Date\_ What to prefix the var name with
|
||||
time [timestamp](&url.php-manual;function.time), [DateTime](&url.php-manual;class.DateTime), mysql timestamp or any string parsable by [`strtotime()`](&url.php-manual;strtotime), arrays as produced by this function if field\_array is set. No current [timestamp](&url.php-manual;function.time) What date/time to pre-select. If an array is given, the attributes field\_array and prefix are used to identify the array elements to extract year, month and day from. Omitting this parameter or supplying a falsy value will select the current date. To prevent date selection, pass in NULL
|
||||
start\_year string No current year The first year in the dropdown, either year number, or relative to current year (+/- N)
|
||||
end\_year string No same as start\_year The last year in the dropdown, either year number, or relative to current year (+/- N)
|
||||
display\_days boolean No TRUE Whether to display days or not
|
||||
display\_months boolean No TRUE Whether to display months or not
|
||||
display\_years boolean No TRUE Whether to display years or not
|
||||
month\_names array No null List of strings to display for months. array(1 =\> \'Jan\', ..., 12 =\> \'Dec\')
|
||||
month\_format string No \%B What format the month should be in (strftime)
|
||||
day\_format string No \%02d What format the day output should be in (sprintf)
|
||||
day\_value\_format string No \%d What format the day value should be in (sprintf)
|
||||
year\_as\_text boolean No FALSE Whether or not to display the year as text
|
||||
reverse\_years boolean No FALSE Display years in reverse order
|
||||
field\_array string No null If a name is given, the select boxes will be drawn such that the results will be returned to PHP in the form of name\[Day\], name\[Year\], name\[Month\].
|
||||
day\_size string No null Adds size attribute to select tag if given
|
||||
month\_size string No null Adds size attribute to select tag if given
|
||||
year\_size string No null Adds size attribute to select tag if given
|
||||
all\_extra string No null Adds extra attributes to all select/input tags if given
|
||||
day\_extra string No null Adds extra attributes to select/input tags if given
|
||||
month\_extra string No null Adds extra attributes to select/input tags if given
|
||||
year\_extra string No null Adds extra attributes to select/input tags if given
|
||||
all\_id string No null Adds id-attribute to all select/input tags if given
|
||||
day\_id string No null Adds id-attribute to select/input tags if given
|
||||
month\_id string No null Adds id-attribute to select/input tags if given
|
||||
year\_id string No null Adds id-attribute to select/input tags if given
|
||||
field\_order string No MDY The order in which to display the fields
|
||||
field\_separator string No \\n String printed between different fields
|
||||
month\_value\_format string No \%m strftime() format of the month values, default is %m for month numbers.
|
||||
all\_empty string No null If supplied then the first element of any select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-boxes read "Please select" for example.
|
||||
year\_empty string No null If supplied then the first element of the year\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select a year" for example. Note that you can use values like "-MM-DD" as time-attribute to indicate an unselected year.
|
||||
month\_empty string No null If supplied then the first element of the month\'s select-box has this value as it\'s label and "" as it\'s value. . Note that you can use values like "YYYY\--DD" as time-attribute to indicate an unselected month.
|
||||
day\_empty string No null If supplied then the first element of the day\'s select-box has this value as it\'s label and "" as it\'s value. Note that you can use values like "YYYY-MM-" as time-attribute to indicate an unselected day.
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Default | Description |
|
||||
|--------------------|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| prefix | Date_ | What to prefix the var name with |
|
||||
| time | | What date/time to pre-select. Accepts timestamps, DateTime objects or any string parseable by [strtotime()](https://www.php.net/strtotime). If an array is given, the attributes field_array and prefix are used to identify the array elements to extract year, month and day from. Omitting this parameter or supplying a falsy value will select the current date. To prevent date selection, pass in NULL. |
|
||||
| start_year | current year | The first year in the dropdown, either year number, or relative to current year (+/- N) |
|
||||
| end_year | same as start_year | The last year in the dropdown, either year number, or relative to current year (+/- N) |
|
||||
| display_days | TRUE | Whether to display days or not |
|
||||
| display_months | TRUE | Whether to display months or not |
|
||||
| display_years | TRUE | Whether to display years or not |
|
||||
| month_names | | List of strings to display for months. array(1 =\> 'Jan', ..., 12 =\> 'Dec') |
|
||||
| month_format | \%B | What format the month should be in (strftime) |
|
||||
| day_format | \%02d | What format the day output should be in (sprintf) |
|
||||
| day_value_format | \%d | What format the day value should be in (sprintf) |
|
||||
| year_as_text | FALSE | Whether or not to display the year as text |
|
||||
| reverse_years | FALSE | Display years in reverse order |
|
||||
| field_array | | If a name is given, the select boxes will be drawn such that the results will be returned to PHP in the form of name\[Day\], name\[Year\], name\[Month\]. |
|
||||
| day_size | | Adds size attribute to select tag if given |
|
||||
| month_size | | Adds size attribute to select tag if given |
|
||||
| year_size | | Adds size attribute to select tag if given |
|
||||
| all_extra | | Adds extra attributes to all select/input tags if given |
|
||||
| day_extra | | Adds extra attributes to select/input tags if given |
|
||||
| month_extra | | Adds extra attributes to select/input tags if given |
|
||||
| year_extra | | Adds extra attributes to select/input tags if given |
|
||||
| all_id | | Adds id-attribute to all select/input tags if given |
|
||||
| day_id | | Adds id-attribute to select/input tags if given |
|
||||
| month_id | | Adds id-attribute to select/input tags if given |
|
||||
| year_id | | Adds id-attribute to select/input tags if given |
|
||||
| field_order | MDY | The order in which to display the fields |
|
||||
| field_separator | \\n | String printed between different fields |
|
||||
| month_value_format | \%m | strftime() format of the month values, default is %m for month numbers. |
|
||||
| all_empty | | If supplied then the first element of any select-box has this value as it's label and "" as it's value. This is useful to make the select-boxes read "Please select" for example. |
|
||||
| year_empty | | If supplied then the first element of the year's select-box has this value as it's label and "" as it's value. This is useful to make the select-box read "Please select a year" for example. Note that you can use values like "-MM-DD" as time-attribute to indicate an unselected year. |
|
||||
| month_empty | | If supplied then the first element of the month's select-box has this value as it's label and "" as it's value. . Note that you can use values like "YYYY\--DD" as time-attribute to indicate an unselected month. |
|
||||
| day_empty | | If supplied then the first element of the day's select-box has this value as it's label and "" as it's value. Note that you can use values like "YYYY-MM-" as time-attribute to indicate an unselected day. |
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> There is an useful php function on the [date tips page](#tips.dates)
|
||||
> There is an useful php function on the [date tips page](../../appendixes/tips.md)
|
||||
> for converting `{html_select_date}` form values to a timestamp.
|
||||
|
||||
## Exaples
|
||||
|
||||
Template code
|
||||
|
||||
|
||||
{html_select_date}
|
||||
|
||||
|
||||
```smarty
|
||||
{html_select_date}
|
||||
```
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
<select name="Date_Month">
|
||||
```html
|
||||
<select name="Date_Month">
|
||||
<option value="1">January</option>
|
||||
<option value="2">February</option>
|
||||
<option value="3">March</option>
|
||||
@@ -64,8 +66,8 @@ This will output:
|
||||
<option value="10">October</option>
|
||||
<option value="11">November</option>
|
||||
<option value="12" selected="selected">December</option>
|
||||
</select>
|
||||
<select name="Date_Day">
|
||||
</select>
|
||||
<select name="Date_Day">
|
||||
<option value="1">01</option>
|
||||
<option value="2">02</option>
|
||||
<option value="3">03</option>
|
||||
@@ -79,41 +81,38 @@ This will output:
|
||||
<option value="29">29</option>
|
||||
<option value="30">30</option>
|
||||
<option value="31">31</option>
|
||||
</select>
|
||||
<select name="Date_Year">
|
||||
</select>
|
||||
<select name="Date_Year">
|
||||
<option value="2006" selected="selected">2006</option>
|
||||
</select>
|
||||
|
||||
</select>
|
||||
```
|
||||
|
||||
|
||||
|
||||
{* start and end year can be relative to current year *}
|
||||
{html_select_date prefix='StartDate' time=$time start_year='-5'
|
||||
```smarty
|
||||
{* start and end year can be relative to current year *}
|
||||
{html_select_date prefix='StartDate' time=$time start_year='-5'
|
||||
end_year='+1' display_days=false}
|
||||
|
||||
|
||||
```
|
||||
|
||||
With 2000 as the current year the output:
|
||||
|
||||
|
||||
<select name="StartDateMonth">
|
||||
```html
|
||||
<select name="StartDateMonth">
|
||||
<option value="1">January</option>
|
||||
<option value="2">February</option>
|
||||
.... snipped ....
|
||||
<option value="11">November</option>
|
||||
<option value="12" selected="selected">December</option>
|
||||
</select>
|
||||
<select name="StartDateYear">
|
||||
</select>
|
||||
<select name="StartDateYear">
|
||||
<option value="1995">1995</option>
|
||||
.... snipped ....
|
||||
<option value="1999">1999</option>
|
||||
<option value="2000" selected="selected">2000</option>
|
||||
<option value="2001">2001</option>
|
||||
</select>
|
||||
|
||||
</select>
|
||||
```
|
||||
|
||||
|
||||
See also [`{html_select_time}`](#language.function.html.select.time),
|
||||
[`date_format`](#language.modifier.date.format),
|
||||
[`$smarty.now`](#language.variables.smarty.now) and the [date tips
|
||||
page](#tips.dates).
|
||||
See also [`{html_select_time}`](language-function-html-select-time.md),
|
||||
[`date_format`](../language-modifiers/language-modifier-date-format.md),
|
||||
[`$smarty.now`](../language-variables/language-variables-smarty.md#smartynow-languagevariablessmartynow) and the [date tips
|
||||
page](../../appendixes/tips.md#dates).
|
||||
|
||||
@@ -1,59 +1,62 @@
|
||||
{html\_select\_time} {#language.function.html.select.time}
|
||||
====================
|
||||
# {html_select_time}
|
||||
|
||||
`{html_select_time}` is a [custom function](#language.custom.functions)
|
||||
that creates time dropdowns for you. It can display any or all of hour,
|
||||
`{html_select_time}` is a [custom function](index.md)
|
||||
that creates time dropdowns for you. It can display any or all of: hour,
|
||||
minute, second and meridian.
|
||||
|
||||
The `time` attribute can have different formats. It can be a unique
|
||||
timestamp, a string of the format `YYYYMMDDHHMMSS` or a string that is
|
||||
parseable by PHP\'s [`strtotime()`](&url.php-manual;strtotime).
|
||||
parseable by PHP's [`strtotime()`](https://www.php.net/strtotime).
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
----------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------- ---------------------------------------------------- -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
prefix string No Time\_ What to prefix the var name with
|
||||
time [timestamp](&url.php-manual;function.time), [DateTime](&url.php-manual;class.DateTime), mysql timestamp or any string parsable by [`strtotime()`](&url.php-manual;strtotime), arrays as produced by this function if field\_array is set. No current [timestamp](&url.php-manual;function.time) What date/time to pre-select. If an array is given, the attributes field\_array and prefix are used to identify the array elements to extract hour, minute, second and meridian from.
|
||||
display\_hours boolean No TRUE Whether or not to display hours
|
||||
display\_minutes boolean No TRUE Whether or not to display minutes
|
||||
display\_seconds boolean No TRUE Whether or not to display seconds
|
||||
display\_meridian boolean No TRUE Whether or not to display meridian (am/pm)
|
||||
use\_24\_hours boolean No TRUE Whether or not to use 24 hour clock
|
||||
minute\_interval integer No 1 Number interval in minute dropdown
|
||||
second\_interval integer No 1 Number interval in second dropdown
|
||||
hour\_format string No \%02d What format the hour label should be in (sprintf)
|
||||
hour\_value\_format string No \%20d What format the hour value should be in (sprintf)
|
||||
minute\_format string No \%02d What format the minute label should be in (sprintf)
|
||||
minute\_value\_format string No \%20d What format the minute value should be in (sprintf)
|
||||
second\_format string No \%02d What format the second label should be in (sprintf)
|
||||
second\_value\_format string No \%20d What format the second value should be in (sprintf)
|
||||
field\_array string No n/a Outputs values to array of this name
|
||||
all\_extra string No null Adds extra attributes to select/input tags if given
|
||||
hour\_extra string No null Adds extra attributes to select/input tags if given
|
||||
minute\_extra string No null Adds extra attributes to select/input tags if given
|
||||
second\_extra string No null Adds extra attributes to select/input tags if given
|
||||
meridian\_extra string No null Adds extra attributes to select/input tags if given
|
||||
field\_separator string No \\n String printed between different fields
|
||||
option\_separator string No \\n String printed between different options of a field
|
||||
all\_id string No null Adds id-attribute to all select/input tags if given
|
||||
hour\_id string No null Adds id-attribute to select/input tags if given
|
||||
minute\_id string No null Adds id-attribute to select/input tags if given
|
||||
second\_id string No null Adds id-attribute to select/input tags if given
|
||||
meridian\_id string No null Adds id-attribute to select/input tags if given
|
||||
all\_empty string No null If supplied then the first element of any select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-boxes read "Please select" for example.
|
||||
hour\_empty string No null If supplied then the first element of the hour\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an hour" for example.
|
||||
minute\_empty string No null If supplied then the first element of the minute\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an minute" for example.
|
||||
second\_empty string No null If supplied then the first element of the second\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an second" for example.
|
||||
meridian\_empty string No null If supplied then the first element of the meridian\'s select-box has this value as it\'s label and "" as it\'s value. This is useful to make the select-box read "Please select an meridian" for example.
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Default | Description |
|
||||
|-----------------------|--------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| prefix | Time\_ | What to prefix the var name with |
|
||||
| time | current [timestamp](https://www.php.net/function.time) | What date/time to pre-select. Accepts [timestamp](https://www.php.net/function.time), [DateTime](https://www.php.net/class.DateTime), mysql timestamp or any string parsable by [`strtotime()`](https://www.php.net/strtotime). If an array is given, the attributes field\_array and prefix are used to identify the array elements to extract hour, minute, second and meridian from. |
|
||||
| display\_hours | TRUE | Whether or not to display hours |
|
||||
| display\_minutes | TRUE | Whether or not to display minutes |
|
||||
| display\_seconds | TRUE | Whether or not to display seconds |
|
||||
| display\_meridian | TRUE | Whether or not to display meridian (am/pm) |
|
||||
| use\_24\_hours | TRUE | Whether or not to use 24 hour clock |
|
||||
| minute\_interval | 1 | Number interval in minute dropdown |
|
||||
| second\_interval | 1 | Number interval in second dropdown |
|
||||
| hour\_format | \%02d | What format the hour label should be in (sprintf) |
|
||||
| hour\_value\_format | \%20d | What format the hour value should be in (sprintf) |
|
||||
| minute\_format | \%02d | What format the minute label should be in (sprintf) |
|
||||
| minute\_value\_format | \%20d | What format the minute value should be in (sprintf) |
|
||||
| second\_format | \%02d | What format the second label should be in (sprintf) |
|
||||
| second\_value\_format | \%20d | What format the second value should be in (sprintf) |
|
||||
| field\_array | n/a | Outputs values to array of this name |
|
||||
| all\_extra | null | Adds extra attributes to select/input tags if given |
|
||||
| hour\_extra | null | Adds extra attributes to select/input tags if given |
|
||||
| minute\_extra | null | Adds extra attributes to select/input tags if given |
|
||||
| second\_extra | null | Adds extra attributes to select/input tags if given |
|
||||
| meridian\_extra | null | Adds extra attributes to select/input tags if given |
|
||||
| field\_separator | \\n | String printed between different fields |
|
||||
| option\_separator | \\n | String printed between different options of a field |
|
||||
| all\_id | null | Adds id-attribute to all select/input tags if given |
|
||||
| hour\_id | null | Adds id-attribute to select/input tags if given |
|
||||
| minute\_id | null | Adds id-attribute to select/input tags if given |
|
||||
| second\_id | null | Adds id-attribute to select/input tags if given |
|
||||
| meridian\_id | null | Adds id-attribute to select/input tags if given |
|
||||
| all\_empty | null | If supplied then the first element of any select-box has this value as it's label and "" as it's value. This is useful to make the select-boxes read "Please select" for example. |
|
||||
| hour\_empty | null | If supplied then the first element of the hour's select-box has this value as it's label and "" as it's value. This is useful to make the select-box read "Please select an hour" for example. |
|
||||
| minute\_empty | null | If supplied then the first element of the minute's select-box has this value as it's label and "" as it's value. This is useful to make the select-box read "Please select an minute" for example. |
|
||||
| second\_empty | null | If supplied then the first element of the second's select-box has this value as it's label and "" as it's value. This is useful to make the select-box read "Please select an second" for example. |
|
||||
| meridian\_empty | null | If supplied then the first element of the meridian's select-box has this value as it's label and "" as it's value. This is useful to make the select-box read "Please select an meridian" for example. |
|
||||
|
||||
|
||||
{html_select_time use_24_hours=true}
|
||||
|
||||
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{html_select_time use_24_hours=true}
|
||||
```
|
||||
|
||||
At 9:20 and 23 seconds in the morning the template above would output:
|
||||
|
||||
|
||||
<select name="Time_Hour">
|
||||
```html
|
||||
<select name="Time_Hour">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
... snipped ....
|
||||
@@ -63,8 +66,8 @@ At 9:20 and 23 seconds in the morning the template above would output:
|
||||
... snipped ....
|
||||
<option value="22">22</option>
|
||||
<option value="23">23</option>
|
||||
</select>
|
||||
<select name="Time_Minute">
|
||||
</select>
|
||||
<select name="Time_Minute">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
... snipped ....
|
||||
@@ -74,8 +77,8 @@ At 9:20 and 23 seconds in the morning the template above would output:
|
||||
... snipped ....
|
||||
<option value="58">58</option>
|
||||
<option value="59">59</option>
|
||||
</select>
|
||||
<select name="Time_Second">
|
||||
</select>
|
||||
<select name="Time_Second">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
... snipped ....
|
||||
@@ -85,14 +88,13 @@ At 9:20 and 23 seconds in the morning the template above would output:
|
||||
... snipped ....
|
||||
<option value="58">58</option>
|
||||
<option value="59">59</option>
|
||||
</select>
|
||||
<select name="Time_Meridian">
|
||||
</select>
|
||||
<select name="Time_Meridian">
|
||||
<option value="am" selected>AM</option>
|
||||
<option value="pm">PM</option>
|
||||
</select>
|
||||
</select>
|
||||
```
|
||||
|
||||
|
||||
|
||||
See also [`$smarty.now`](#language.variables.smarty.now),
|
||||
[`{html_select_date}`](#language.function.html.select.date) and the
|
||||
[date tips page](#tips.dates).
|
||||
See also [`$smarty.now`](../language-variables/language-variables-smarty.md#smartynow-languagevariablessmartynow),
|
||||
[`{html_select_date}`](language-function-html-select-date.md) and the
|
||||
[date tips page](../../appendixes/tips.md#dates).
|
||||
|
||||
@@ -1,23 +1,24 @@
|
||||
{html\_table} {#language.function.html.table}
|
||||
=============
|
||||
# {html_table}
|
||||
|
||||
`{html_table}` is a [custom function](#language.custom.functions) that
|
||||
`{html_table}` is a [custom function](index.md) that
|
||||
dumps an array of data into an HTML `<table>`.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||
loop array Yes *n/a* Array of data to loop through
|
||||
cols mixed No *3* Number of columns in the table or a comma-separated list of column heading names or an array of column heading names.if the cols-attribute is empty, but rows are given, then the number of cols is computed by the number of rows and the number of elements to display to be just enough cols to display all elements. If both, rows and cols, are omitted cols defaults to 3. if given as a list or array, the number of columns is computed from the number of elements in the list or array.
|
||||
rows integer No *empty* Number of rows in the table. if the rows-attribute is empty, but cols are given, then the number of rows is computed by the number of cols and the number of elements to display to be just enough rows to display all elements.
|
||||
inner string No *cols* Direction of consecutive elements in the loop-array to be rendered. *cols* means elements are displayed col-by-col. *rows* means elements are displayed row-by-row.
|
||||
caption string No *empty* Text to be used for the `<caption>` element of the table
|
||||
table\_attr string No *border=\"1\"* Attributes for `<table>` tag
|
||||
th\_attr string No *empty* Attributes for `<th>` tag (arrays are cycled)
|
||||
tr\_attr string No *empty* attributes for `<tr>` tag (arrays are cycled)
|
||||
td\_attr string No *empty* Attributes for `<td>` tag (arrays are cycled)
|
||||
trailpad string No * * Value to pad the trailing cells on last row with (if any)
|
||||
hdir string No *right* Direction of each row to be rendered. possible values: *right* (left-to-right), and *left* (right-to-left)
|
||||
vdir string No *down* Direction of each column to be rendered. possible values: *down* (top-to-bottom), *up* (bottom-to-top)
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| loop | Yes | Array of data to loop through |
|
||||
| cols | No | Number of columns in the table or a comma-separated list of column heading names or an array of column heading names.if the cols-attribute is empty, but rows are given, then the number of cols is computed by the number of rows and the number of elements to display to be just enough cols to display all elements. If both, rows and cols, are omitted cols defaults to 3. if given as a list or array, the number of columns is computed from the number of elements in the list or array. |
|
||||
| rows | No | Number of rows in the table. if the rows-attribute is empty, but cols are given, then the number of rows is computed by the number of cols and the number of elements to display to be just enough rows to display all elements. |
|
||||
| inner | No | Direction of consecutive elements in the loop-array to be rendered. *cols* means elements are displayed col-by-col. *rows* means elements are displayed row-by-row. |
|
||||
| caption | No | Text to be used for the `<caption>` element of the table |
|
||||
| table\_attr | No | Attributes for `<table>` tag (defaults to 'border="1"') |
|
||||
| th\_attr | No | Attributes for `<th>` tag (arrays are cycled) |
|
||||
| tr\_attr | No | attributes for `<tr>` tag (arrays are cycled) |
|
||||
| td\_attr | No | Attributes for `<td>` tag (arrays are cycled) |
|
||||
| trailpad | No | Value to pad the trailing cells on last row with (if any) (defaults to ' ') |
|
||||
| hdir | No | Direction of each row to be rendered. possible values: *right* (left-to-right), and *left* (right-to-left) (defaults to 'right') |
|
||||
| vdir | No | Direction of each column to be rendered. possible values: *down* (top-to-bottom), *up* (bottom-to-top) (defaults to 'down') |
|
||||
|
||||
- The `cols` attribute determines how many columns will be in the
|
||||
table.
|
||||
@@ -30,60 +31,63 @@ dumps an array of data into an HTML `<table>`.
|
||||
- `trailpad` is the value put into the trailing cells on the last
|
||||
table row if there are any present.
|
||||
|
||||
<!-- -->
|
||||
## Examples
|
||||
|
||||
|
||||
<?php
|
||||
$smarty->assign( 'data', array(1,2,3,4,5,6,7,8,9) );
|
||||
$smarty->assign( 'tr', array('bgcolor="#eeeeee"','bgcolor="#dddddd"') );
|
||||
$smarty->display('index.tpl');
|
||||
?>
|
||||
|
||||
|
||||
```php
|
||||
<?php
|
||||
$smarty->assign( 'data', array(1,2,3,4,5,6,7,8,9) );
|
||||
$smarty->assign( 'tr', array('bgcolor="#eeeeee"','bgcolor="#dddddd"') );
|
||||
$smarty->display('index.tpl');
|
||||
```
|
||||
|
||||
The variables assigned from php could be displayed as these three
|
||||
examples demonstrate. Each example shows the template followed by
|
||||
output.
|
||||
|
||||
|
||||
{**** Example One ****}
|
||||
{html_table loop=$data}
|
||||
|
||||
<table border="1">
|
||||
** Example 1 **
|
||||
```smarty
|
||||
{html_table loop=$data}
|
||||
```
|
||||
```html
|
||||
<table border="1">
|
||||
<tbody>
|
||||
<tr><td>1</td><td>2</td><td>3</td></tr>
|
||||
<tr><td>4</td><td>5</td><td>6</td></tr>
|
||||
<tr><td>7</td><td>8</td><td>9</td></tr>
|
||||
<tr><td>1</td><td>2</td><td>3</td></tr>
|
||||
<tr><td>4</td><td>5</td><td>6</td></tr>
|
||||
<tr><td>7</td><td>8</td><td>9</td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
{**** Example Two ****}
|
||||
{html_table loop=$data cols=4 table_attr='border="0"'}
|
||||
|
||||
<table border="0">
|
||||
** Example 2 **
|
||||
```smarty
|
||||
{html_table loop=$data cols=4 table_attr='border="0"'}
|
||||
```
|
||||
```html
|
||||
<table border="0">
|
||||
<tbody>
|
||||
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
|
||||
<tr><td>5</td><td>6</td><td>7</td><td>8</td></tr>
|
||||
<tr><td>9</td><td> </td><td> </td><td> </td></tr>
|
||||
<tr><td>1</td><td>2</td><td>3</td><td>4</td></tr>
|
||||
<tr><td>5</td><td>6</td><td>7</td><td>8</td></tr>
|
||||
<tr><td>9</td><td> </td><td> </td><td> </td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
{**** Example Three ****}
|
||||
{html_table loop=$data cols="first,second,third,fourth" tr_attr=$tr}
|
||||
|
||||
<table border="1">
|
||||
** Example 3 **
|
||||
```smarty
|
||||
{html_table loop=$data cols="first,second,third,fourth" tr_attr=$tr}
|
||||
```
|
||||
```html
|
||||
<table border="1">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>first</th><th>second</th><th>third</th><th>fourth</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>first</th><th>second</th><th>third</th><th>fourth</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr bgcolor="#eeeeee"><td>1</td><td>2</td><td>3</td><td>4</td></tr>
|
||||
<tr bgcolor="#dddddd"><td>5</td><td>6</td><td>7</td><td>8</td></tr>
|
||||
<tr bgcolor="#eeeeee"><td>9</td><td> </td><td> </td><td> </td></tr>
|
||||
<tr bgcolor="#eeeeee"><td>1</td><td>2</td><td>3</td><td>4</td></tr>
|
||||
<tr bgcolor="#dddddd"><td>5</td><td>6</td><td>7</td><td>8</td></tr>
|
||||
<tr bgcolor="#eeeeee"><td>9</td><td> </td><td> </td><td> </td></tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</table>
|
||||
```
|
||||
|
||||
|
||||
@@ -1,56 +1,61 @@
|
||||
{mailto} {#language.function.mailto}
|
||||
========
|
||||
# {mailto}
|
||||
|
||||
`{mailto}` automates the creation of a `mailto:` anchor links and
|
||||
optionally encodes them. Encoding emails makes it more difficult for web
|
||||
spiders to lift email addresses off of a site.
|
||||
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|-----------------------------------------------------------------------------------------------|
|
||||
| address | Yes | The e-mail address |
|
||||
| text | No | The text to display, default is the e-mail address |
|
||||
| encode | No | How to encode the e-mail. Can be one of `none`, `hex`, `javascript` or `javascript_charcode`. |
|
||||
| cc | No | Email addresses to carbon copy, separate entries by a comma. |
|
||||
| bcc | No | Email addresses to blind carbon copy, separate entries by a comma |
|
||||
| subject | No | Email subject |
|
||||
| newsgroups | No | Newsgroups to post to, separate entries by a comma. |
|
||||
| followupto | No | Addresses to follow up to, separate entries by a comma. |
|
||||
| extra | No | Any extra information you want passed to the link, such as style sheet classes |
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Javascript is probably the most thorough form of encoding, although
|
||||
> you can use hex encoding too.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- -------- ---------- --------- -----------------------------------------------------------------------------------------------
|
||||
address string Yes *n/a* The e-mail address
|
||||
text string No *n/a* The text to display, default is the e-mail address
|
||||
encode string No *none* How to encode the e-mail. Can be one of `none`, `hex`, `javascript` or `javascript_charcode`.
|
||||
cc string No *n/a* Email addresses to carbon copy, separate entries by a comma.
|
||||
bcc string No *n/a* Email addresses to blind carbon copy, separate entries by a comma
|
||||
subject string No *n/a* Email subject
|
||||
newsgroups string No *n/a* Newsgroups to post to, separate entries by a comma.
|
||||
followupto string No *n/a* Addresses to follow up to, separate entries by a comma.
|
||||
extra string No *n/a* Any extra information you want passed to the link, such as style sheet classes
|
||||
|
||||
## Examples
|
||||
|
||||
{mailto address="me@example.com"}
|
||||
<a href="mailto:me@example.com" >me@example.com</a>
|
||||
```smarty
|
||||
{mailto address="me@example.com"}
|
||||
<a href="mailto:me@example.com" >me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" text="send me some mail"}
|
||||
<a href="mailto:me@example.com" >send me some mail</a>
|
||||
{mailto address="me@example.com" text="send me some mail"}
|
||||
<a href="mailto:me@example.com" >send me some mail</a>
|
||||
|
||||
{mailto address="me@example.com" encode="javascript"}
|
||||
<script type="text/javascript" language="javascript">
|
||||
eval(unescape('%64%6f% ... snipped ...%61%3e%27%29%3b'))
|
||||
</script>
|
||||
{mailto address="me@example.com" encode="javascript"}
|
||||
<script>
|
||||
eval(unescape('%64%6f% ... snipped ...%61%3e%27%29%3b'))
|
||||
</script>
|
||||
|
||||
{mailto address="me@example.com" encode="hex"}
|
||||
<a href="mailto:%6d%65.. snipped..3%6f%6d">m&..snipped...#x6f;m</a>
|
||||
{mailto address="me@example.com" encode="hex"}
|
||||
<a href="mailto:%6d%65.. snipped..3%6f%6d">m&..snipped...#x6f;m</a>
|
||||
|
||||
{mailto address="me@example.com" subject="Hello to you!"}
|
||||
<a href="mailto:me@example.com?subject=Hello%20to%20you%21" >me@example.com</a>
|
||||
{mailto address="me@example.com" subject="Hello to you!"}
|
||||
<a href="mailto:me@example.com?subject=Hello%20to%20you%21" >me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" cc="you@example.com,they@example.com"}
|
||||
<a href="mailto:me@example.com?cc=you@example.com,they@example.com" >me@example.com</a>
|
||||
{mailto address="me@example.com" cc="you@example.com,they@example.com"}
|
||||
<a href="mailto:me@example.com?cc=you@example.com,they@example.com" >me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" extra='class="email"'}
|
||||
<a href="mailto:me@example.com" class="email">me@example.com</a>
|
||||
{mailto address="me@example.com" extra='class="email"'}
|
||||
<a href="mailto:me@example.com" class="email">me@example.com</a>
|
||||
|
||||
{mailto address="me@example.com" encode="javascript_charcode"}
|
||||
<script type="text/javascript" language="javascript">
|
||||
{document.write(String.fromCharCode(60,97, ... snipped ....60,47,97,62))}
|
||||
</script>
|
||||
{mailto address="me@example.com" encode="javascript_charcode"}
|
||||
<script>
|
||||
{document.write(String.fromCharCode(60,97, ... snipped ....60,47,97,62))}
|
||||
</script>
|
||||
```
|
||||
|
||||
See also [`escape`](#language.modifier.escape),
|
||||
[`{textformat}`](#language.function.textformat) and [obfuscating email
|
||||
addresses](#tips.obfuscating.email).
|
||||
See also [`escape`](../language-modifiers/language-modifier-escape.md),
|
||||
[`{textformat}`](../language-custom-functions/language-function-textformat.md) and [obfuscating email
|
||||
addresses](../../appendixes/tips.md#obfuscating-e-mail-addresses).
|
||||
|
||||
@@ -1,9 +1,18 @@
|
||||
{math} {#language.function.math}
|
||||
======
|
||||
# {math}
|
||||
|
||||
`{math}` allows the template designer to do math equations in the
|
||||
template.
|
||||
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Required | Description |
|
||||
|----------------|----------|--------------------------------------------------|
|
||||
| equation | Yes | The equation to execute |
|
||||
| format | No | The format of the result (sprintf) |
|
||||
| var | Yes | Equation variable value |
|
||||
| assign | No | Template variable the output will be assigned to |
|
||||
| \[var \...\] | Yes | Equation variable value |
|
||||
|
||||
- Any numeric template variables may be used in the equations, and the
|
||||
result is printed in place of the tag.
|
||||
|
||||
@@ -13,7 +22,7 @@ template.
|
||||
- +, -, /, \*, abs, ceil, cos, exp, floor, log, log10, max, min, pi,
|
||||
pow, rand, round, sin, sqrt, srans and tan are all valid operators.
|
||||
Check the PHP documentation for further information on these
|
||||
[math](&url.php-manual;eval) functions.
|
||||
[math](https://www.php.net/eval) functions.
|
||||
|
||||
- If you supply the `assign` attribute, the output of the `{math}`
|
||||
function will be assigned to this template variable instead of being
|
||||
@@ -22,83 +31,69 @@ template.
|
||||
> **Note**
|
||||
>
|
||||
> `{math}` is an expensive function in performance due to its use of the
|
||||
> php [`eval()`](&url.php-manual;eval) function. Doing the math in PHP
|
||||
> php [`eval()`](https://www.php.net/eval) function. Doing the math in PHP
|
||||
> is much more efficient, so whenever possible do the math calculations
|
||||
> in the script and [`assign()`](#api.assign) the results to the
|
||||
> in the script and [`assign()`](../../programmers/api-functions/api-assign.md) the results to the
|
||||
> template. Definitely avoid repetitive `{math}` function calls, eg
|
||||
> within [`{section}`](#language.function.section) loops.
|
||||
> within [`{section}`](../language-builtin-functions/language-function-section.md) loops.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- --------- --------------------------------------------------
|
||||
equation string Yes *n/a* The equation to execute
|
||||
format string No *n/a* The format of the result (sprintf)
|
||||
var numeric Yes *n/a* Equation variable value
|
||||
assign string No *n/a* Template variable the output will be assigned to
|
||||
\[var \...\] numeric Yes *n/a* Equation variable value
|
||||
## Examples
|
||||
|
||||
**Example a:**
|
||||
**Example 1**
|
||||
```smarty
|
||||
|
||||
{* $height=4, $width=5 *}
|
||||
|
||||
{* $height=4, $width=5 *}
|
||||
|
||||
{math equation="x + y" x=$height y=$width}
|
||||
|
||||
{math equation="x + y" x=$height y=$width}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
```
|
||||
9
|
||||
```
|
||||
|
||||
|
||||
**Example 2**
|
||||
|
||||
```smarty
|
||||
{* $row_height = 10, $row_width = 20, #col_div# = 2, assigned in template *}
|
||||
|
||||
{math equation="height * width / division"
|
||||
height=$row_height
|
||||
width=$row_width
|
||||
division=#col_div#}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
9
|
||||
|
||||
```
|
||||
100
|
||||
```
|
||||
|
||||
**Example 3**
|
||||
|
||||
**Example b:**
|
||||
```smarty
|
||||
{* you can use parenthesis *}
|
||||
|
||||
|
||||
{* $row_height = 10, $row_width = 20, #col_div# = 2, assigned in template *}
|
||||
|
||||
{math equation="height * width / division"
|
||||
height=$row_height
|
||||
width=$row_width
|
||||
division=#col_div#}
|
||||
|
||||
|
||||
{math equation="(( x + y ) / z )" x=2 y=10 z=2}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
```
|
||||
6
|
||||
```
|
||||
|
||||
100
|
||||
**Example 4**
|
||||
|
||||
```smarty
|
||||
{* you can supply a format parameter in sprintf format *}
|
||||
|
||||
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
|
||||
```
|
||||
|
||||
|
||||
**Example c:**
|
||||
|
||||
|
||||
{* you can use parenthesis *}
|
||||
|
||||
{math equation="(( x + y ) / z )" x=2 y=10 z=2}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
6
|
||||
|
||||
|
||||
|
||||
**Example d:**
|
||||
|
||||
|
||||
{* you can supply a format parameter in sprintf format *}
|
||||
|
||||
{math equation="x + y" x=4.4444 y=5.0000 format="%.2f"}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
9.44
|
||||
|
||||
|
||||
```
|
||||
9.44
|
||||
```
|
||||
|
||||
@@ -1,190 +1,182 @@
|
||||
{textformat} {#language.function.textformat}
|
||||
============
|
||||
# {textformat}
|
||||
|
||||
`{textformat}` is a [block function](#plugins.block.functions) used to
|
||||
`{textformat}` is a block tag used to
|
||||
format text. It basically cleans up spaces and special characters, and
|
||||
formats paragraphs by wrapping at a boundary and indenting lines.
|
||||
|
||||
You can set the parameters explicitly, or use a preset style. Currently
|
||||
You can set the parameters explicitly, or use a preset style. Currently,
|
||||
"email" is the only available style.
|
||||
|
||||
Attribute Name Type Required Default Description
|
||||
---------------- --------- ---------- ------------------ ----------------------------------------------------------------------------------------
|
||||
style string No *n/a* Preset style
|
||||
indent number No *0* The number of chars to indent every line
|
||||
indent\_first number No *0* The number of chars to indent the first line
|
||||
indent\_char string No *(single space)* The character (or string of chars) to indent with
|
||||
wrap number No *80* How many characters to wrap each line to
|
||||
wrap\_char string No *\\n* The character (or string of chars) to break each line with
|
||||
wrap\_cut boolean No *FALSE* If TRUE, wrap will break the line at the exact character instead of at a word boundary
|
||||
assign string No *n/a* The template variable the output will be assigned to
|
||||
## Attributes
|
||||
|
||||
| Attribute Name | Default | Description |
|
||||
|----------------|------------------|----------------------------------------------------------------------------------------|
|
||||
| style | *n/a* | Preset style |
|
||||
| indent | *0* | The number of chars to indent every line |
|
||||
| indent\_first | *0* | The number of chars to indent the first line |
|
||||
| indent\_char | *(single space)* | The character (or string of chars) to indent with |
|
||||
| wrap | *80* | How many characters to wrap each line to |
|
||||
| wrap\_char | *\\n* | The character (or string of chars) to break each line with |
|
||||
| wrap\_cut | *FALSE* | If TRUE, wrap will break the line at the exact character instead of at a word boundary |
|
||||
| assign | *n/a* | The template variable the output will be assigned to |
|
||||
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{textformat wrap=40}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
```
|
||||
This is foo. This is foo. This is foo.
|
||||
This is foo. This is foo. This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo bar
|
||||
foo foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo.
|
||||
```
|
||||
|
||||
```smarty
|
||||
{textformat wrap=40 indent=4}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
```
|
||||
This is foo. This is foo. This is
|
||||
foo. This is foo. This is foo. This
|
||||
is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo.
|
||||
bar foo bar foo foo. bar foo bar
|
||||
foo foo.
|
||||
```
|
||||
|
||||
|
||||
{textformat wrap=40}
|
||||
```smarty
|
||||
{textformat wrap=40 indent=4 indent_first=4}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
{/textformat}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
```
|
||||
This is foo. This is foo. This
|
||||
is foo. This is foo. This is foo.
|
||||
This is foo.
|
||||
|
||||
This is foo. This is foo. This is foo.
|
||||
This is foo. This is foo. This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo bar
|
||||
foo foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo.
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar
|
||||
foo foo. bar foo bar foo foo. bar
|
||||
foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo.
|
||||
```
|
||||
|
||||
|
||||
```smarty
|
||||
{textformat style="email"}
|
||||
|
||||
{textformat wrap=40 indent=4}
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is bar.
|
||||
|
||||
This is bar.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
{/textformat}
|
||||
```
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
```
|
||||
This is foo. This is foo. This is foo. This is foo. This is foo. This is
|
||||
foo.
|
||||
|
||||
This is foo. This is foo. This is
|
||||
foo. This is foo. This is foo. This
|
||||
is foo.
|
||||
This is bar.
|
||||
|
||||
This is bar.
|
||||
bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo
|
||||
foo.
|
||||
```
|
||||
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo.
|
||||
bar foo bar foo foo. bar foo bar
|
||||
foo foo.
|
||||
|
||||
|
||||
|
||||
|
||||
{textformat wrap=40 indent=4 indent_first=4}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
This is foo. This is foo. This
|
||||
is foo. This is foo. This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar
|
||||
foo foo. bar foo bar foo foo. bar
|
||||
foo bar foo foo. bar foo bar foo
|
||||
foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo.
|
||||
|
||||
|
||||
|
||||
|
||||
{textformat style="email"}
|
||||
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
This is foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
bar foo bar foo foo.
|
||||
|
||||
{/textformat}
|
||||
|
||||
|
||||
|
||||
|
||||
The above example will output:
|
||||
|
||||
|
||||
|
||||
This is foo. This is foo. This is foo. This is foo. This is foo. This is
|
||||
foo.
|
||||
|
||||
This is bar.
|
||||
|
||||
bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo
|
||||
bar foo foo. bar foo bar foo foo. bar foo bar foo foo. bar foo bar foo
|
||||
foo.
|
||||
|
||||
|
||||
|
||||
|
||||
See also [`{strip}`](#language.function.strip) and
|
||||
[`wordwrap`](#language.modifier.wordwrap).
|
||||
See also [`{strip}`](../language-builtin-functions/language-function-strip.md) and
|
||||
[`wordwrap`](../language-modifiers/language-modifier-wordwrap.md).
|
||||
|
||||
@@ -1,123 +0,0 @@
|
||||
Variable Modifiers {#language.modifiers}
|
||||
==================
|
||||
|
||||
## Table of contents
|
||||
- [capitalize](./language-modifiers/language-modifier-capitalize.md)
|
||||
- [cat](./language-modifiers/language-modifier-cat.md)
|
||||
- [count_characters](./language-modifiers/language-modifier-count-characters.md)
|
||||
- [count_paragraphs](./language-modifiers/language-modifier-count-paragraphs.md)
|
||||
- [count_sentences](./language-modifiers/language-modifier-count-sentences.md)
|
||||
- [count_words](./language-modifiers/language-modifier-count-words.md)
|
||||
- [date_format](./language-modifiers/language-modifier-date-format.md)
|
||||
- [default](./language-modifiers/language-modifier-default.md)
|
||||
- [escape](./language-modifiers/language-modifier-escape.md)
|
||||
- [from_charset](./language-modifiers/language-modifier-from-charset.md)
|
||||
- [indent](./language-modifiers/language-modifier-indent.md)
|
||||
- [lower](./language-modifiers/language-modifier-lower.md)
|
||||
- [nl2br](./language-modifiers/language-modifier-nl2br.md)
|
||||
- [regex_replace](./language-modifiers/language-modifier-regex-replace.md)
|
||||
- [replace](./language-modifiers/language-modifier-replace.md)
|
||||
- [spacify](./language-modifiers/language-modifier-spacify.md)
|
||||
- [string_format](./language-modifiers/language-modifier-string-format.md)
|
||||
- [strip](./language-modifiers/language-modifier-strip.md)
|
||||
- [strip_tags](./language-modifiers/language-modifier-strip-tags.md)
|
||||
- [to_charset](./language-modifiers/language-modifier-to-charset.md)
|
||||
- [truncate](./language-modifiers/language-modifier-truncate.md)
|
||||
- [unescape](./language-modifiers/language-modifier-unescape.md)
|
||||
- [upper](./language-modifiers/language-modifier-upper.md)
|
||||
- [wordwrap](./language-modifiers/language-modifier-wordwrap.md)
|
||||
|
||||
Variable modifiers can be applied to
|
||||
[variables](./language-variables.md), [custom
|
||||
functions](./language-custom-functions.md) or strings. To apply a modifier,
|
||||
specify the value followed by a `|` (pipe) and the modifier name. A
|
||||
modifier may accept additional parameters that affect its behavior.
|
||||
These parameters follow the modifier name and are separated by a `:`
|
||||
(colon). Also, *all php-functions can be used as modifiers implicitly*
|
||||
(more below) and modifiers can be
|
||||
[combined](./language-combining-modifiers.md).
|
||||
|
||||
|
||||
{* apply modifier to a variable *}
|
||||
{$title|upper}
|
||||
|
||||
{* modifier with parameters *}
|
||||
{$title|truncate:40:"..."}
|
||||
|
||||
{* apply modifier to a function parameter *}
|
||||
{html_table loop=$myvar|upper}
|
||||
|
||||
{* with parameters *}
|
||||
{html_table loop=$myvar|truncate:40:"..."}
|
||||
|
||||
{* apply modifier to literal string *}
|
||||
{"foobar"|upper}
|
||||
|
||||
{* using date_format to format the current date *}
|
||||
{$smarty.now|date_format:"%Y/%m/%d"}
|
||||
|
||||
{* apply modifier to a custom function *}
|
||||
{mailto|upper address="smarty@example.com"}
|
||||
|
||||
{* using php's str_repeat *}
|
||||
{"="|str_repeat:80}
|
||||
|
||||
{* php's count *}
|
||||
{$myArray|@count}
|
||||
|
||||
{* this will uppercase and truncate the whole array *}
|
||||
<select name="name_id">
|
||||
{html_options output=$my_array|upper|truncate:20}
|
||||
</select>
|
||||
|
||||
|
||||
|
||||
- Modifiers can be applied to any type of variables, including arrays
|
||||
and objects.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The default behavior was changed with Smarty 3. In Smarty 2.x, you
|
||||
> had to use an \"`@`\" symbol to apply a modifier to an array, such
|
||||
> as `{$articleTitle|@count}`. With Smarty 3, the \"`@`\" is no
|
||||
> longer necessary, and is ignored.
|
||||
>
|
||||
> If you want a modifier to apply to each individual item of an
|
||||
> array, you will either need to loop the array in the template, or
|
||||
> provide for this functionality inside your modifier function.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Second, in Smarty 2.x, modifiers were applied to the result of
|
||||
> math expressions like `{8+2}`, meaning that
|
||||
> `{8+2|count_characters}` would give `2`, as 8+2=10 and 10 is two
|
||||
> characters long. With Smarty 3, modifiers are applied to the
|
||||
> variables or atomic expressions before executing the calculations,
|
||||
> so since 2 is one character long, `{8+2|count_characters}`
|
||||
> gives 9. To get the old result use parentheses like
|
||||
> `{(8+2)|count_characters}`.
|
||||
|
||||
- Modifiers are autoloaded from the
|
||||
[`$plugins_dir`](../programmers/api-variables/variable-plugins-dir.md) or can be registered
|
||||
explicitly with the [`registerPlugin()`](../programmers/api-functions/api-register-plugin.md)
|
||||
function. The later is useful for sharing a function between php
|
||||
scripts and smarty templates.
|
||||
|
||||
- All php-functions can be used as modifiers implicitly, as
|
||||
demonstrated in the example above. However, using php-functions as
|
||||
modifiers has two little pitfalls:
|
||||
|
||||
- First - sometimes the order of the function-parameters is not
|
||||
the desirable one. Formatting `$foo` with
|
||||
`{"%2.f"|sprintf:$foo}` actually works, but asks for the more
|
||||
intuitive, like `{$foo|string_format:"%2.f"}` that is provided
|
||||
by the Smarty distribution.
|
||||
|
||||
- Secondly - if security is enabled, all php-functions that are to
|
||||
be used as modifiers have to be declared trusted in the
|
||||
`$modifiers` property of the securty policy. See the
|
||||
[Security](../programmers/advanced-features/advanced-features-security.md) section for details.
|
||||
|
||||
See also [`registerPlugin()`](../programmers/api-functions/api-register-plugin.md), [combining
|
||||
modifiers](./language-combining-modifiers.md). and [extending smarty with
|
||||
plugins](../programmers/plugins.md)
|
||||
@@ -0,0 +1,105 @@
|
||||
# Variable Modifiers
|
||||
|
||||
Variable modifiers can be applied to
|
||||
[variables](../language-variables/index.md), [custom tags](../language-custom-functions/index.md)
|
||||
or strings. To apply a modifier,
|
||||
specify the value followed by a `|` (pipe) and the modifier name. A
|
||||
modifier may accept additional parameters that affect its behavior.
|
||||
These parameters follow the modifier name and are separated by a `:`
|
||||
(colon). Also, *all php-functions can be used as modifiers implicitly*
|
||||
(more below) and modifiers can be
|
||||
[combined](../language-combining-modifiers.md).
|
||||
|
||||
- [capitalize](language-modifier-capitalize.md)
|
||||
- [cat](language-modifier-cat.md)
|
||||
- [count_characters](language-modifier-count-characters.md)
|
||||
- [count_paragraphs](language-modifier-count-paragraphs.md)
|
||||
- [count_sentences](language-modifier-count-sentences.md)
|
||||
- [count_words](language-modifier-count-words.md)
|
||||
- [date_format](language-modifier-date-format.md)
|
||||
- [default](language-modifier-default.md)
|
||||
- [escape](language-modifier-escape.md)
|
||||
- [from_charset](language-modifier-from-charset.md)
|
||||
- [indent](language-modifier-indent.md)
|
||||
- [lower](language-modifier-lower.md)
|
||||
- [nl2br](language-modifier-nl2br.md)
|
||||
- [regex_replace](language-modifier-regex-replace.md)
|
||||
- [replace](language-modifier-replace.md)
|
||||
- [spacify](language-modifier-spacify.md)
|
||||
- [string_format](language-modifier-string-format.md)
|
||||
- [strip](language-modifier-strip.md)
|
||||
- [strip_tags](language-modifier-strip-tags.md)
|
||||
- [to_charset](language-modifier-to-charset.md)
|
||||
- [truncate](language-modifier-truncate.md)
|
||||
- [unescape](language-modifier-unescape.md)
|
||||
- [upper](language-modifier-upper.md)
|
||||
- [wordwrap](language-modifier-wordwrap.md)
|
||||
|
||||
## Examples
|
||||
|
||||
```smarty
|
||||
{* apply modifier to a variable *}
|
||||
{$title|upper}
|
||||
|
||||
{* modifier with parameters *}
|
||||
{$title|truncate:40:"..."}
|
||||
|
||||
{* apply modifier to a function parameter *}
|
||||
{html_table loop=$myvar|upper}
|
||||
|
||||
{* with parameters *}
|
||||
{html_table loop=$myvar|truncate:40:"..."}
|
||||
|
||||
{* apply modifier to literal string *}
|
||||
{"foobar"|upper}
|
||||
|
||||
{* using date_format to format the current date *}
|
||||
{$smarty.now|date_format:"%Y/%m/%d"}
|
||||
|
||||
{* apply modifier to a custom function *}
|
||||
{mailto|upper address="smarty@example.com"}
|
||||
|
||||
{* using php's str_repeat *}
|
||||
{"="|str_repeat:80}
|
||||
|
||||
{* php's count *}
|
||||
{$myArray|@count}
|
||||
|
||||
{* this will uppercase and truncate the whole array *}
|
||||
<select name="name_id">
|
||||
{html_options output=$my_array|upper|truncate:20}
|
||||
</select>
|
||||
```
|
||||
|
||||
- Modifiers can be applied to any type of variables, including arrays
|
||||
and objects.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> The default behavior was changed with Smarty 3. In Smarty 2.x, you
|
||||
> had to use an "`@`" symbol to apply a modifier to an array, such
|
||||
> as `{$articleTitle|@count}`. With Smarty 3, the "`@`" is no
|
||||
> longer necessary, and is ignored.
|
||||
>
|
||||
> If you want a modifier to apply to each individual item of an
|
||||
> array, you will either need to loop the array in the template, or
|
||||
> provide for this functionality inside your modifier function.
|
||||
|
||||
> **Note**
|
||||
>
|
||||
> Second, in Smarty 2.x, modifiers were applied to the result of
|
||||
> math expressions like `{8+2}`, meaning that
|
||||
> `{8+2|count_characters}` would give `2`, as 8+2=10 and 10 is two
|
||||
> characters long. With Smarty 3, modifiers are applied to the
|
||||
> variables or atomic expressions before executing the calculations,
|
||||
> so since 2 is one character long, `{8+2|count_characters}`
|
||||
> gives 9. To get the old result use parentheses like
|
||||
> `{(8+2)|count_characters}`.
|
||||
|
||||
- Custom modifiers can be registered
|
||||
with the [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md)
|
||||
function.
|
||||
|
||||
See also [`registerPlugin()`](../../programmers/api-functions/api-register-plugin.md), [combining
|
||||
modifiers](../language-combining-modifiers.md). and [extending smarty with
|
||||
plugins](../../api/extending/introduction.md)
|
||||
@@ -1,41 +1,49 @@
|
||||
capitalize {#language.modifier.capitalize}
|
||||
==========
|
||||
# capitalize
|
||||
|
||||
This is used to capitalize the first letter of all words in a variable.
|
||||
This is similar to the PHP [`ucwords()`](&url.php-manual;ucwords)
|
||||
This is similar to the PHP [`ucwords()`](https://www.php.net/ucwords)
|
||||
function.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- --------- ---------- --------- -----------------------------------------------------------------------------------------------------------
|
||||
1 boolean No FALSE This determines whether or not words with digits will be uppercased
|
||||
2 boolean No FALSE This determines whether or not Capital letters within words should be lowercased, e.g. \"aAa\" to \"Aaa\"
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|capitalize}
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|---------|----------|-------------------------------------------------------------------------------------------------------|
|
||||
| 1 | boolean | No | This determines whether or not words with digits will be uppercased |
|
||||
| 2 | boolean | No | This determines whether or not Capital letters within words should be lowercased, e.g. "aAa" to "Aaa" |
|
||||
|
||||
|
||||
<?php
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'next x-men film, x3, delayed.');
|
||||
|
||||
?>
|
||||
|
||||
```
|
||||
|
||||
|
||||
Where the template is:
|
||||
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|capitalize}
|
||||
{$articleTitle|capitalize:true}
|
||||
|
||||
```
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
```
|
||||
next x-men film, x3, delayed.
|
||||
Next X-Men Film, x3, Delayed.
|
||||
Next X-Men Film, X3, Delayed.
|
||||
|
||||
```
|
||||
|
||||
|
||||
See also [`lower`](#language.modifier.lower) and
|
||||
[`upper`](#language.modifier.upper)
|
||||
See also [`lower`](language-modifier-lower.md) and
|
||||
[`upper`](language-modifier-upper.md)
|
||||
|
||||
@@ -1,31 +1,36 @@
|
||||
cat {#language.modifier.cat}
|
||||
===
|
||||
# cat
|
||||
|
||||
This value is concatenated to the given variable.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- -------- ---------- --------- -----------------------------------------------
|
||||
1 string No *empty* This value to catenate to the given variable.
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|cat:' units'}
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
<?php
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|--------|----------|--------------------------------------------------|
|
||||
| 1 | string | No | This value to concatenate to the given variable. |
|
||||
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', "Psychics predict world didn't end");
|
||||
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
```smarty
|
||||
{$articleTitle|cat:' yesterday.'}
|
||||
|
||||
|
||||
```
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
```
|
||||
Psychics predict world didn't end yesterday.
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -1,39 +1,43 @@
|
||||
count\_characters {#language.modifier.count.characters}
|
||||
=================
|
||||
# count_characters
|
||||
|
||||
This is used to count the number of characters in a variable.
|
||||
|
||||
Parameter Position Type Required Default Description
|
||||
-------------------- --------- ---------- --------- -------------------------------------------------------------------------------
|
||||
1 boolean No FALSE This determines whether or not to include whitespace characters in the count.
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|count_characters}
|
||||
```
|
||||
|
||||
## Parameters
|
||||
|
||||
<?php
|
||||
| Parameter | Type | Required | Description |
|
||||
|-----------|---------|----------|------------------------------------------------------------------------|
|
||||
| 1 | boolean | No | This determines whether to include whitespace characters in the count. |
|
||||
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Cold Wave Linked to Temperatures.');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_characters}
|
||||
{$articleTitle|count_characters:true}
|
||||
|
||||
|
||||
```
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
```
|
||||
Cold Wave Linked to Temperatures.
|
||||
29
|
||||
33
|
||||
|
||||
```
|
||||
|
||||
|
||||
See also [`count_words`](#language.modifier.count.words),
|
||||
[`count_sentences`](#language.modifier.count.sentences) and
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs).
|
||||
See also [`count_words`](language-modifier-count-words.md),
|
||||
[`count_sentences`](language-modifier-count-sentences.md) and
|
||||
[`count_paragraphs`](language-modifier-count-paragraphs.md).
|
||||
|
||||
@@ -1,38 +1,41 @@
|
||||
count\_paragraphs {#language.modifier.count.paragraphs}
|
||||
=================
|
||||
# count_paragraphs
|
||||
|
||||
This is used to count the number of paragraphs in a variable.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|count_paragraphs}
|
||||
```
|
||||
|
||||
<?php
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
"War Dims Hope for Peace. Child's Death Ruins Couple's Holiday.\n\n
|
||||
Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation."
|
||||
);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_paragraphs}
|
||||
|
||||
```
|
||||
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
```
|
||||
War Dims Hope for Peace. Child's Death Ruins Couple's Holiday.
|
||||
|
||||
Man is Fatally Slain. Death Causes Loneliness, Feeling of Isolation.
|
||||
2
|
||||
```
|
||||
|
||||
|
||||
|
||||
See also [`count_characters`](#language.modifier.count.characters),
|
||||
[`count_sentences`](#language.modifier.count.sentences) and
|
||||
[`count_words`](#language.modifier.count.words).
|
||||
See also [`count_characters`](language-modifier-count-characters.md),
|
||||
[`count_sentences`](language-modifier-count-sentences.md) and
|
||||
[`count_words`](language-modifier-count-words.md).
|
||||
|
||||
@@ -1,37 +1,39 @@
|
||||
count\_sentences {#language.modifier.count.sentences}
|
||||
================
|
||||
# count_sentences
|
||||
|
||||
This is used to count the number of sentences in a variable. A sentence
|
||||
being delimited by a dot, question- or exclamation-mark (.?!).
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|count_sentences}
|
||||
```
|
||||
|
||||
<?php
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle',
|
||||
'Two Soviet Ships Collide - One Dies.
|
||||
Enraged Cow Injures Farmer with Axe.'
|
||||
);
|
||||
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_sentences}
|
||||
|
||||
|
||||
```
|
||||
|
||||
Will output:
|
||||
|
||||
|
||||
```
|
||||
Two Soviet Ships Collide - One Dies. Enraged Cow Injures Farmer with Axe.
|
||||
2
|
||||
|
||||
```
|
||||
|
||||
|
||||
See also [`count_characters`](#language.modifier.count.characters),
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs) and
|
||||
[`count_words`](#language.modifier.count.words).
|
||||
See also [`count_characters`](language-modifier-count-characters.md),
|
||||
[`count_paragraphs`](language-modifier-count-paragraphs.md) and
|
||||
[`count_words`](language-modifier-count-words.md).
|
||||
|
||||
@@ -1,33 +1,35 @@
|
||||
count\_words {#language.modifier.count.words}
|
||||
============
|
||||
# count_words
|
||||
|
||||
This is used to count the number of words in a variable.
|
||||
|
||||
## Basic usage
|
||||
```smarty
|
||||
{$myVar|count_words}
|
||||
```
|
||||
|
||||
<?php
|
||||
## Examples
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
$smarty->assign('articleTitle', 'Dealers Will Hear Car Talk at Noon.');
|
||||
|
||||
?>
|
||||
|
||||
|
||||
```
|
||||
|
||||
Where template is:
|
||||
|
||||
|
||||
```smarty
|
||||
{$articleTitle}
|
||||
{$articleTitle|count_words}
|
||||
|
||||
|
||||
```
|
||||
|
||||
This will output:
|
||||
|
||||
|
||||
```
|
||||
Dealers Will Hear Car Talk at Noon.
|
||||
7
|
||||
```
|
||||
|
||||
|
||||
|
||||
See also [`count_characters`](#language.modifier.count.characters),
|
||||
[`count_paragraphs`](#language.modifier.count.paragraphs) and
|
||||
[`count_sentences`](#language.modifier.count.sentences).
|
||||
See also [`count_characters`](language-modifier-count-characters.md),
|
||||
[`count_paragraphs`](language-modifier-count-paragraphs.md) and
|
||||
[`count_sentences`](language-modifier-count-sentences.md).
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user