From 632976557230d7680987a86edeb8486db66abe48 Mon Sep 17 00:00:00 2001 From: bzick Date: Tue, 5 Aug 2014 17:49:42 +0400 Subject: [PATCH] Update dosc and add tags {set} and {add} --- docs/ru/readme.md | 6 +- docs/ru/start.md | 64 ++++++----- docs/ru/syntax.md | 228 ++++++---------------------------------- docs/ru/tags/cycle.md | 5 +- docs/ru/tags/extends.md | 49 ++------- docs/ru/tags/filter.md | 4 +- docs/ru/tags/for.md | 2 +- docs/ru/tags/foreach.md | 4 +- docs/ru/tags/if.md | 8 +- docs/ru/tags/ignore.md | 2 +- docs/ru/tags/include.md | 28 +++-- docs/ru/tags/macro.md | 4 +- docs/ru/tags/set.md | 81 ++++++++++++++ docs/ru/tags/switch.md | 63 ++++++----- docs/ru/tags/var.md | 64 ----------- src/Fenom.php | 16 ++- 16 files changed, 250 insertions(+), 378 deletions(-) create mode 100644 docs/ru/tags/set.md delete mode 100644 docs/ru/tags/var.md diff --git a/docs/ru/readme.md b/docs/ru/readme.md index 4306618..7a101bd 100644 --- a/docs/ru/readme.md +++ b/docs/ru/readme.md @@ -17,14 +17,14 @@ Documentation [Использование](./syntax.md#tags) тегов. -* [var](./tags/var.md) — определение переменной +* [set](./tags/set.md), `add` и `var` — определение значения переменной * [if](./tags/if.md), `elseif` и `else` — условный оператор * [foreach](./tags/foreach.md), `foreaelse`, `break` and `continue` — перебор элементов массива или объекта * [for](./tags/for.md), `forelse`, `break` and `continue` — цикл -* [switch](./tags/switch.md), `case`, `default` — груповой условный оператор +* [switch](./tags/switch.md), `case` — груповой условный оператор * [cycle](./tags/cycle.md) — циклицеский перебор массива значений * [include](./tags/include.md), `insert` — вставляет и испольняет указанный шаблон -* [extends](./tags/extends.md), `use`, `block` и `parent` — наследование шаблонов +* [extends](./tags/extends.md), `use`, `block` и `parent` — [наследование](./inheritance.md) шаблонов * [filter](./tags/filter.md) — примение модификаторов к фрагменту шаблона * [ignore](./tags/ignore.md) — игнорирование тегов Fenom * [macro](./tags/macro.md) и `import` — пользовательские функции шаблонов diff --git a/docs/ru/start.md b/docs/ru/start.md index 851b811..b75282d 100644 --- a/docs/ru/start.md +++ b/docs/ru/start.md @@ -1,11 +1,12 @@ -Basic usage -=========== +Быстрый старт +============= -## Install Fenom +## Установка Fenom ### Composer -Add package Fenom in your require-list in `composer.json`: +Fenom зарегестирован на [packagist.org](https://packagist.org/) как пакет [fenom/fenom](https://packagist.org/packages/fenom/fenom). +Что бы установить Fenom через composer пропишите в `composer.json` списке пакетов: ```json { "require": { @@ -13,56 +14,71 @@ Add package Fenom in your require-list in `composer.json`: } } ``` -and update project's dependencies: `composer update`. +и обновите зависимости: `composer update`. ### Custom loader -Clone Fenom to any directory: `git clone https://github.com/bzick/fenom.git`. Recommended use latest tag. -Fenom use [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) autoloading standard. Therefore you can -* use `psr-0` format in your project loader for loading Fenom's classes -* or register Fenom's autoloader: `Fenom::registerAutoload();` for loading itself. +Склонируйте Fenom в любую директорию Вашего проекта: `git clone https://github.com/bzick/fenom.git`. Рекомендуется использовать последнюю версию. +Для загрузки классов Fenom использует [psr-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md#autoloading-standard) стандарт. +Таким образом вы можете: +* использовать Ваш загрузчик, который понимает `psr-0` формат для загрузки классов Fenom из директории `src/` с пространством имен `Fenom`. +* или использовать строенный загрузчик Fenom: `Fenom::registerAutoload();` для загрузки самого себя. -Also you can use this autoloader for loading any library with `psr-0` file naming: +Так же вы можете использовать встроенный в Fenom загрузчик для загрузки других классов в `psr-0` формате наименования класса и файла: ```php -Fenom::registerAutoload(PROJECT_DIR."/src"); +Fenom::registerAutoload(PROJECT_DIR."/classes"); ``` -## Setup Fenom +## Настройка Fenom -Create an object via factory method +Есть два варианта инициировать объект шаблонизатора: через `new` оператор и фабрику. +Пример создания Fenom через фабрику: ```php $fenom = Fenom::factory('/path/to/templates', '/path/to/compiled/template', $options); ``` - -Create an object via `new` operator +Пример создания Fenom через оператор `new`: ```php $fenom = new Fenom(new Provider('/path/to/templates')); $fenom->setCompileDir('/path/to/template/cache'); $fenom->setOptions($options); ``` -* `/path/to/templates` — directory, where stores your templates. -* `/path/to/template/cache` — directory, where stores compiled templates in PHP files. -* `$options` - bit-mask or array of [Fenom settings](./configuration.md#template-settings). +* `/path/to/templates` — директория в которой хранятся шаблоны. +* `/path/to/template/cache` — директория в которую Fenom будет сохранять PHP-кеш шаблонов +* `$options` - битовая маска или массив [параметров](./configuration.md). -### Use Fenom +### Использование + +Что бы отобразить шаблон на экран используйте метод `display`: -Output template ```php +// $fenom->display(string $template, array $variables) : void + $fenom->display("template/name.tpl", $vars); ``` -Get the result of rendering the template +Метод найдет шаблон `template/name.tpl` отрисует его в `stdout`, подставляя переменные из массива `$vars`. + +Метод `fetch` возвращает вывод шаблона вместо его отображения на экран. ```php +// $fenom->fetch(string $template, array $variables) : string + $result = $fenom->fetch("template/name.tpl", $vars); ``` -Create the pipeline of rendering into callback +Для отрисовки большого количества данных можно использовать поток + ```php +// $fenom->pipe(string $template, array $variables, callable $callback, int $chunk_size) : void + $fenom->pipe( "template/sitemap.tpl", $vars, - $callback = [new SplFileObject("/tmp/sitemap.xml", "w"), "fwrite"], // pipe to file /tmp/sitemap.xml - $chunk_size = 1e6 // chunk size for callback + $callback = [new SplFileObject("compress.zlib:///tmp/sitemap.xml.gz", "w"), "fwrite"], // поток с архивацией в файл /tmp/sitemap.xml.gz + 1e6 // размер куска данных в байтах ); ``` + +Поток позволяет обрабатывать большой результат по кускам, размер куска указывается в байтах аргументом `$chunk_size`. +Каждый кусок передается в `$callback` для обработки или вывода. + diff --git a/docs/ru/syntax.md b/docs/ru/syntax.md index 0f8741e..c9ca8fa 100644 --- a/docs/ru/syntax.md +++ b/docs/ru/syntax.md @@ -12,6 +12,8 @@ ## Переменные Переменные могут быть выведены на экран или могут быть использованы для функций, атрибутов, модификаторов внутри сложных выражений и т.д. +Переменные в Fenom представлены знаком доллара с последующим именем переменной. Имя переменной чувствительно к регистру. +Правильное имя переменной должно начинаться с буквы или символа подчеркивания и состоять из букв, цифр и символов подчеркивания в любом количестве. ### Использование переменных @@ -123,13 +125,6 @@ {"Hi, $username!"} выведет "Hi, Username!" ``` -Аналогично могут быть обработаны элемент массива или свойство объекта - -```smarty -{"Hi, $user.name!"} -{"Hi, $user->name!"} -``` - Для чего-либо более сложного, используйте сложный синтаксис. ##### Сложный синтаксис @@ -166,10 +161,10 @@ but if use single quote any template expressions will be on display as it is это означает, что если вы попытаетесь использовать другие управляющие последовательности, такие как `\r` или `\n`, они будут выведены как есть вместо какого-либо особого поведения. ```smarty -{'Hi, $foo'} outputs 'Hi, $foo' -{'Hi, {$foo}'} outputs 'Hi, {$foo}' -{'Hi, {$user.name}'} outputs 'Hi, {$user.name}' -{'Hi, {$user.name|up}'} outputs "Hi, {$user.name|up}" +{'Hi, $foo'} выводит 'Hi, $foo' +{'Hi, {$foo}'} выводит 'Hi, {$foo}' +{'Hi, {$user.name}'} выводит 'Hi, {$user.name}' +{'Hi, {$user.name|up}'} выводит "Hi, {$user.name|up}" ``` ### Целые числа @@ -205,149 +200,36 @@ but if use single quote any template expressions will be on display as it is {var $c = 7E-10} ``` +### Булев + +Это простейший тип. Булевое выражает истинность значения. Он может быть либо TRUE либо FALSE. +Для указания булевого значения, используйте ключевое слово TRUE или FALSE. Оба регистро-независимы. + +{set $a = true} + +### NULL + +Специальное значение NULL представляет собой переменную без значения. NULL - это единственно возможное значение типа null. + +Обычно возникают путаницы между NULL и FALSE, так как по роли они похожи, но разлицаются по принципу: +NULL - это отсутствие присутствия, а FALSE - присутвие отсутствия. + ### Операции Как и любой другой язык программирования/шаблонизации Fenom поддерживает множество различных операторов: -* [Арифметические операторы](./operators.md#arithmetic-operators) — `+`, `-`, `*`, `/`, `%` -* [Логические операторы](./operators.md#logical-operators) — `||`, `&&`, `!$var`, `and`, `or`, `xor` -* [Операторы сравнения](./operators.md#comparison-operators) — `>`, `>=`, `<`, `<=`, `==`, `!=`, `!==`, `<>` -* [Битовые операторы](./operators.md#bitwise-operators) — `|`, `&`, `^`, `~$var`, `>>`, `<<` -* [Операторы присвоения](./operators.md#assignment-operators) — `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `>>=`, `<<=` -* [Строковый оператор](./operators.md#string-operator) — `$str1 ~ $str2` -* [Тернарные операторы](./operators.md#ternary-operators) — `$a ? $b : $c`, `$a ! $b : $c`, `$a ?: $c`, `$a !: $c` -* [Проверяющие операторы](./operators.md#check-operators) — `$var?`, `$var!` -* [Оператор тестирование](./operators.md#test-operator) — `is`, `is not` -* [Оператор содержания](./operators.md#containment-operator) — `in`, `not in` +* Арифметические операторы — `+`, `-`, `*`, `/`, `%` +* Логические операторы — `||`, `&&`, `!$var`, `and`, `or`, `xor` +* Операторы сравнения — `>`, `>=`, `<`, `<=`, `==`, `!=`, `!==`, `<>` +* Битовые операторы — `|`, `&`, `^`, `~$var`, `>>`, `<<` +* Операторы присвоения — `=`, `+=`, `-=`, `*=`, `/=`, `%=`, `&=`, `|=`, `^=`, `>>=`, `<<=` +* Строковый оператор — `$str1 ~ $str2` +* Тернарные операторы — `$a ? $b : $c`, `$a ! $b : $c`, `$a ?: $c`, `$a !: $c` +* Проверяющие операторы — `$var?`, `$var!` +* Оператор тестирование — `is`, `is not` +* Оператор содержания — `in`, `not in` -Подробнее об [операторах](./operators.md) - -### Set variable - -```smarty -{var $foo = "bar"} -{var $foo = "bar"|upper} {* apply modifier *} -{var $foo = 5} -{var $foo = $x + $y} -{var $foo = $x.y[z] + $y} -{var $foo = strlen($a)} {* work with functions *} -{var $foo = myfunct( ($x+$y)*3 )} -{var $foo.bar.baz = 1} {* multidimensional value support *} -{var $foo = $object->item->method($y, 'named')} {* work with object fine *} -``` - -Using block tag - -```smarty -{var $foo} - content {$text|truncate:30} -{/var} -{var $foo|truncate:50} {* apply modifier to content *} - content {$text} -{/var} -``` - -Set array - -```smarty -{var $foo = [1, 2, 3]} numeric array -{var $foo = ['y' => 'yellow', 'b' => 'blue']} associative array -{var $foo = [1, [9, 8], 3]} can be nested -{var $foo = [1, $two, $three * 3 + 9]} -{var $foo = [$a, $d.c, $a + $f]} -{var $foo = ['y' => 'yellow', $color|upper => $colors[ $color ]} -{var $foo = [1, [$parent, $a->method()], 3]} -``` - -See also [{var}](./tags/var.md) documentation. - - -### Static method support - -```smarty -{Lib\Math::multiple x=3 y=4} static method as tag -{Lib\Math::multiple(3,4)} inline static method -{12 + Lib\Math::multiple(3,4)} -{12 + 3|Lib\Math::multiple:4} static method as modifier -``` - -You may disable call static methods in template, see in [security options](./settings.md) option `deny_static` - -### Set variable - -```smarty -{var $foo = "bar"} -{var $foo = "bar"|upper} {* apply modifier *} -{var $foo = 5} -{var $foo = $x + $y} -{var $foo = $x.y[z] + $y} -{var $foo = strlen($a)} {* work with functions *} -{var $foo = myfunct( ($x+$y)*3 )} -{var $foo.bar.baz = 1} {* multidimensional value support *} -{var $foo = $object->item->method($y, 'named')} {* work with object fine *} -``` - -Using block tag - -```smarty -{var $foo} - content {$text|truncate:30} -{/var} -{var $foo|truncate:50} {* apply modifier to content *} - content {$text} -{/var} -``` - -Set array - -```smarty -{var $foo = [1, 2, 3]} numeric array -{var $foo = ['y' => 'yellow', 'b' => 'blue']} associative array -{var $foo = [1, [9, 8], 3]} can be nested -{var $foo = [1, $two, $three * 3 + 9]} -{var $foo = [$a, $d.c, $a + $f]} -{var $foo = ['y' => 'yellow', $color|upper => $colors[ $color ]} -{var $foo = [1, [$parent, $a->method()], 3]} -``` - -See also [{var}](./tags/var.md) documentation. - - -## Scalar values - -### Strings - -When the string in double quotation marks, all the expressions in the string will be run. -The result of expressions will be inserted into the string instead it. - -```smarty -{var $foo="Username"} -{var $user.name="Username"} -{"Hi, $foo"} outputs "Hi, Username" -{"Hi, {$foo}"} outputs "Hi, Username" -{"Hi, {$user.name}"} outputs "Hi, Username" -{"Hi, {$user.name|up}"} outputs "Hi, USERNAME" -{"Hi, {$user->getName(true)}"} outputs Hi, Username -{var $message = "Hi, {$user.name}"} -``` - -but if use single quote any template expressions will be on display as it is - -```smarty -{'Hi, $foo'} outputs 'Hi, $foo' -{'Hi, {$foo}'} outputs 'Hi, {$foo}' -{'Hi, {$user.name}'} outputs 'Hi, {$user.name}' -{'Hi, {$user.name|up}'} outputs "Hi, {$user.name|up}" -``` - -### Numbers - -```smarty -{2|pow:10} -{var $magick = 5381|calc} -{0.2|round} -{1e-6|round} -``` +Подробнее об [операторах](./operators.md). ## Modifiers @@ -368,53 +250,11 @@ but if use single quote any template expressions will be on display as it is [List of modifiers](./main.md#modifiers) -## Tags +## Функции -Basically, tag seems like +## Компиляторы -```smarty -{FUNCNAME attr1 = "val1" attr2 = $val2} -``` - -Tags starts with name and may have attributes - -Это общий формат функций, но могут быть исключения, например функция [{var}](./tags/var.md), использованная выше. - -```smarty -{include file="my.tpl"} -{var $foo=5} -{if $user.loggined} - Welcome, {$user.name}! -{else} - Who are you? -{/if} -``` - -В общем случае аргументы принимают любой формат переменных, в том числе результаты арифметических операций и модификаторов. - -```smarty -{funct arg=true} -{funct arg=5} -{funct arg=1.2} -{funct arg='string'} -{funct arg="string this {$var}"} -{funct arg=[1,2,34]} -{funct arg=$x} -{funct arg=$x.c} -``` - -```smarty -{funct arg="ivan"|upper} -{funct arg=$a.d.c|lower} -``` - -```smarty -{funct arg=1+2} -{funct arg=$a.d.c+4} -{funct arg=($a.d.c|count+4)/3} -``` - -### Ignoring template code +### Игнорирование кода В шаблонизаторе Fenom используются фигурные скобки для отделения HTML от кода Fenom. Если требуется вывести текст, содержащий фигурные скобки, то есть следующие варианты это сделать: diff --git a/docs/ru/tags/cycle.md b/docs/ru/tags/cycle.md index c47a8fb..d1733ee 100644 --- a/docs/ru/tags/cycle.md +++ b/docs/ru/tags/cycle.md @@ -1,6 +1,9 @@ -Tag {cycle} +Тег {cycle} =========== +Тег {cycle} используется для прохода через множество значений. +С его помощью можно легко реализовать чередование двух или более заданных значений. + ```smarty {for $i=$a.c..}
diff --git a/docs/ru/tags/extends.md b/docs/ru/tags/extends.md index b89d439..44124c3 100644 --- a/docs/ru/tags/extends.md +++ b/docs/ru/tags/extends.md @@ -1,7 +1,7 @@ -Tag {extends} [RU] -================== +Тег {extends} +============= -Тег `{extends}` реализует наследование шаблонов, иерархия, обратная {include}. То есть шаблон сам выбирает своего родителя. +Тег `{extends}` реализует [наследование](../inheritance.md) шаблонов, иерархия, обратная {include}. То есть шаблон сам выбирает своего родителя. ### {extends} @@ -11,15 +11,15 @@ Tag {extends} [RU] {extends 'parent.tpl'} ``` -Имя родительского шаблона может быть задан динамически, в этом случае производительность отрисовки может снизиться. - +**Замечание:** +Имя родительского шаблона может быть задан динамически, но в этом случае производительность шаблона значительно снижается. ```smarty {extends $parent_tpl} ``` ### {block} -Блок указывает фрагмент шаблона, который будет передан родителю. Имя блока может быть задано как явно +Блок указывает фрагмент шаблона, который будет передан родителю. Имя блока должно быть задано явно: ```smarty {block bk1}content 1{/block} @@ -27,17 +27,6 @@ Tag {extends} [RU] {block 'bk2'}content 2{/block} ``` -так и не явно, но в данном случае пострадает производительность - -```smarty -{block "bk{$number}"}content {$number}{/block} -... -{if $condition} - {block "bk-if"}content, then 'if' is true{/block} -{else} - {block "bk{$fail}"}content, then 'if' is false{/block} -{/if} -``` ### {use} @@ -47,36 +36,12 @@ Tag {extends} [RU] {use 'blocks.tpl'} ``` - ### {parent} -Planned. Not supported yet. Feature #5. - ```smarty {block 'block1'} content ... {parent} content ... {/block} -``` - -### Performance - -Алгоритм реализации наследования шаблонов может работать в разных режимах, в зависимости от условий. -Каждый режим имеет свою производительность. - -1. **Максимальная** производительность: - * Имена шаблонов в теге {extends } заданы явно, без использования переменных и условий. - * Имена блоков заданы явно, без использования переменных, условий и не вложены ни в какой другой тег. -2. **Средняя** производительность: - * Имена шаблонов в теге {extends } заданы явно, без использования переменных и условий. - * Имена блоков заданы **не** явно, с использованием переменныч, условий или могут быть вложенные в другие теги. -3. **Низкая** производительность: - * Имена шаблонов в теге {extends } заданы **не** явно, с использованием переменных и условий. - * Имена блоков заданы явно, без использования переменных, условий и не вложены ни в какой другой тег. -4. **Минимальная** производительность: - * Имена шаблонов в теге {extends } заданы **не** явно, с использованием переменных и условий. - * Имена блоков заданы **не** явно, с использованием переменных, условий или могут быть вложенные в другие теги. - -Режим может идти только на понижение, при изменении условий во время прохождения по иерархии шаблонов. -При любом режиме работы не используется буферизация данных, то есть данные выводятся сразу. +``` \ No newline at end of file diff --git a/docs/ru/tags/filter.md b/docs/ru/tags/filter.md index 35a8bb0..9754deb 100644 --- a/docs/ru/tags/filter.md +++ b/docs/ru/tags/filter.md @@ -1,7 +1,7 @@ -Tags {filter} +Тег {filter} ============= -Позволяет применить модификаторы на фрагмент шаблона +Тег {filter} позволяет применить модификаторы на фрагмент шаблона ```smarty {filter|strip_tags|truncate:20} diff --git a/docs/ru/tags/for.md b/docs/ru/tags/for.md index d5aa1ee..60ffd47 100644 --- a/docs/ru/tags/for.md +++ b/docs/ru/tags/for.md @@ -1,4 +1,4 @@ -Tag {for} +Тег {for} ========= ```smarty diff --git a/docs/ru/tags/foreach.md b/docs/ru/tags/foreach.md index 8fde3f1..88ea7bf 100644 --- a/docs/ru/tags/foreach.md +++ b/docs/ru/tags/foreach.md @@ -1,5 +1,5 @@ -Tag {foreach} [RU] -================== +Тег {foreach} +============= ```smarty {foreach $list as [$key =>] $value [index=$index] [first=$first] [last=$last]} diff --git a/docs/ru/tags/if.md b/docs/ru/tags/if.md index 72069d3..4af7ff2 100644 --- a/docs/ru/tags/if.md +++ b/docs/ru/tags/if.md @@ -1,5 +1,5 @@ -Tag {if} [RU] -============= +Тег {if} +======== Реализация оператора [if](http://docs.php.net/if) из PHP @@ -33,7 +33,7 @@ Tag {if} [RU] {/if} ``` -Код, расположенный после тега `{elseif}` будет выполнен/выведен, если выражение вернуло значение приводимое к **FALSE**, - приводимое к **TRUE** +Код, расположенный после тега `{elseif}` будет выполнен/выведен, если выражение вернуло значение приводимое к **FALSE**, а - приводимое к **TRUE** ### {else} @@ -46,4 +46,4 @@ Tag {if} [RU] ``` Код, расположенный после тега `{else}` будет выполнен/выведен, если выражение вернуло значение приводимое к **FALSE** -В тестируемых выражениях могут быть использованы логические операторы , что позволяет обрабатывать сочетания нескольких условий. \ No newline at end of file +В тестируемых выражениях могут быть использованы логические операторы, что позволяет обрабатывать сочетания нескольких условий. \ No newline at end of file diff --git a/docs/ru/tags/ignore.md b/docs/ru/tags/ignore.md index f80860d..4ef9abb 100644 --- a/docs/ru/tags/ignore.md +++ b/docs/ru/tags/ignore.md @@ -1,4 +1,4 @@ -Tag {ignore} +Тег {ignore} ============ {ignore} tags allow a block of data to be taken literally. diff --git a/docs/ru/tags/include.md b/docs/ru/tags/include.md index 50a68d7..f9e62a5 100644 --- a/docs/ru/tags/include.md +++ b/docs/ru/tags/include.md @@ -1,29 +1,35 @@ Tag {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. +Тэги `{include}` используются для включения других шаблонов в текущий. Любые переменные, доступные в текущем шаблоне, доступны и во включаемом. ```smarty {include "about.tpl"} ``` -If you need to set yours variables for template list them in attributes. +Вы также можете передать переменные в подключаемый шаблон в виде атрибутов. +Любая переменная, переданная в подключаемый шаблон, доступны только в области видимости подключаемого файла. +Переданные переменные имеют преимущество перед существующими переменными с аналогичными именами. ```smarty -{include "about.tpl" page=$item limit=50} +{include "pagination.tpl" count=$total_pages current=$.get.page} ``` -All variables changed in child template has no affect to variables in parent template. +Все значения присвоенных переменных восстанавливаются после того, как подключаемый шаблон отработал. +Это значит, что вы можете использовать все переменные из подключающего шаблона в подключаемом, но изменения переменных внутри подключаемого шаблона не будут видны внутри подключающего шаблона после команды {include}. ### {insert} -The tag insert template code instead self. +В отличии от `{include}` тег `{insert}` не вызывает дочерний шаблон во время отрисовки, в ставляет код дочернего шаблона в родительский на момент компиляции. +Это позволяет сэкономить ресурсы на проверке и чтении шаблона. Однако такой формат подключения шаблона имеет ограничения. +Имя шаблона должно быть задано явно, без использования переменных и выражений: -* No dynamic name allowed. -* No variables as attribute allowed. -* Increase performance because insert code as is in compilation time. +```smarty +{insert 'pagination.tpl'} {* отработает *} +{insert $pagination} {* вызовет ошибку *} +``` -For example, main.tpl: +Рассмотрим тега `{insert}` на примере. Допустим шаблон `main.tpl` имеет следующий код: ```smarty a: {$a} @@ -31,13 +37,13 @@ a: {$a} c: {$c} ``` -b.tpl: +`b.tpl`: ``` b: {$b} ``` -Code of `b.tpl` will be inserted into `main.tpl` as is: +Компилятор увидит шаблон `main.tpl` таким: ```smarty a: {$a} diff --git a/docs/ru/tags/macro.md b/docs/ru/tags/macro.md index b6d3a05..602a5f8 100644 --- a/docs/ru/tags/macro.md +++ b/docs/ru/tags/macro.md @@ -1,5 +1,5 @@ -Tag {macro} [RU] -================ +Тег {macro} +=========== Макросы - фрагмент шаблона который можно повторить сколь угодно раз и в каком угодно месте. Макросы не имеют общего пространства имен с шаблоном и могут оперировать только переданными переменными. diff --git a/docs/ru/tags/set.md b/docs/ru/tags/set.md new file mode 100644 index 0000000..c498092 --- /dev/null +++ b/docs/ru/tags/set.md @@ -0,0 +1,81 @@ +Тег {set} +========= + +### {set} + +Тег {set} используется для установки значения переменной в процессе выполнения шаблона. + +```smarty +{set $var=(expr)} +``` + +```smarty +{set $var} + ... any content ... +{/set} +``` + +```smarty +{set $var|modifiers} + ... any content ... +{/set} +``` + +Имя переменной `$var` должно соответствовать [принятому правилу именования переменных](../syntax.md#Переменные). +Выражение `expr` может быть любое сочетание [переменных](../syntax.md#Переменные), [скалярных значений](../syntax.md#Скалярные+значения) и массивов. + +```smarty +{set $v = 5} +{set $v = "value"} +{set $v = $x+$y} +{set $v = 4} +{set $v = $z++ + 1} +{set $v = --$z} +{set $v = $y/$x} +{set $v = $y-$x} +{set $v = $y*$x-2} +{set $v = ($y^$x)+7} + +{set $v = [1,2,3]} +{set $v = []} +{set $v = ["one"|upper => 1, 4 => $x, "three" => 3]} +{set $v = ["key1" => $y*$x-2, "key2" => ["z" => $z]]} + +{set $v = count([1,2,3])+7} +``` + +В качестве значения переменной можно задать результат отрисовки фрагмента шаблона: + +```smarty +{set $v} + Some long {$text|trim} +{/var} +``` + +Такой вариант создания позволяет применить модификаторы к данным переде тем как они будут сохранены в переменную: + +```smarty +{set $v|escape} {* применение можификатора к значению *} + Some long {$text|trim} +{/var} +``` + +### {add} + +Тег {add} делает тоже самое что и тег {set} за исключением того что сначало проверяет наличие переменной и если переменной нет — задет новое значение. + +```smarty +{add $var = 'value'} +``` +Работу тега можнно описать следующим образом: +```smarty +{if $var is not set} + {set $var = 'value'} +{/if} +``` + +### {var} + +Тег {var} старое название тега {set}, сейчас это одно и тоже. + + diff --git a/docs/ru/tags/switch.md b/docs/ru/tags/switch.md index bca6c87..2ae5719 100644 --- a/docs/ru/tags/switch.md +++ b/docs/ru/tags/switch.md @@ -1,46 +1,61 @@ -Tag {switch} +Тег {switch} ============ -The `{switch}` tag is similar to a series of `{if}` statements on the same expression. -In many occasions, you may want to compare the same variable (or expression) with many different values, -and execute a different piece of code depending on which value it equals to. This is exactly what the `{switch}` tag is for. +Тег `{switch}` подобен серии операторов `{if}` с одинаковым условием. +Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений, +и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). +Это именно тот случай, для которого удобен тег `{switch}`. -Tag `{switch}` accepts any expression. But `{case}` accepts only static scalar values or constants. +Тег `{switch}` в качестве аргумента принимает любое выражение. +Каждый возможный случай описывается тегом `{case value}` значения `value` которых могут быть только явно заданные скалярные значения. +Случаи могут повторятся, в этом случае блоки для которых повторялся случай будут последовательно выполнены по направлению сверху вниз. +Случай `default` подразумевает обработку если ни один случай не произошел. ```smarty {switch } -{case } +{case value1} ... -{case , , ...} +{case value2, value3, ...} ... -{case } +{case value3} ... {case default, } ... {/switch} ``` -For example, +Рассмотрим пример: ```smarty -{switch $type} -{case 'new'} - It is new item -{case 'current', 'new'} - It is new or current item -{case 'current'} - It is current item -{case 'new', 'newer'} - It is new item, again -{case default} - I don't know the type {$type} +{switch $color} +{case 'red', 'scarlet'} + Оттенок красного цвета +{case 'green', 'harlequin'} + Оттенок зеленого цвета +{case 'black', 'grey', 'gray'} + Черный цвет +{case 'white', 'grey', 'gray'} + Белый цвет +{case default, 'unknown'} + Неизвестный цвет {/switch} ``` -if `$type = 'new'` then template output +если задать `$color = 'red'` результатом будет: ``` -It is new item -It is new or current item -It is new item, again +Оттенок красного цвета +``` + +для случая `$color = 'grey'` будут вызваны два бока: + +``` +Черный цвет +Белый цвет +``` + +случаи `$color = 'yellow'` и `$color = 'unknown'` будут обработаны последним блоком: + +``` +Неизвестный цвет ``` \ No newline at end of file diff --git a/docs/ru/tags/var.md b/docs/ru/tags/var.md deleted file mode 100644 index 879e317..0000000 --- a/docs/ru/tags/var.md +++ /dev/null @@ -1,64 +0,0 @@ -Tag {var} -========= - -The tag {var} is used for assigning template variables during the execution of a template. - -```smarty -{var $var=EXPR} -``` - -```smarty -{var $var} - ... any content ... -{/var} -``` - -```smarty -{var $var|modifiers} - ... any content ... -{/var} -``` - -Variable names follow the same rules as other labels in PHP. -A valid variable name starts with a letter or underscore, followed by any number of letters, numbers, or underscores. - -```smarty -{var $v = 5} -{var $v = "value"} - -{var $v = $x+$y} -{var $v = 4} -{var $v = $z++ + 1} -{var $v = --$z} -{var $v = $y/$x} -{var $v = $y-$x} -{var $v = $y*$x-2} -{var $v = ($y^$x)+7} -``` - -Creating array - -```smarty -{var $v = [1,2,3]} -{var $v = []} -{var $v = ["one"|upper => 1, 4 => $x, "three" => 3]} -{var $v = ["key1" => $y*$x-2, "key2" => ["z" => $z]]} -``` - -Getting function result into variable - -```smarty -{var $v = count([1,2,3])+7} -``` - -Collect the output of the template into a variable - -```smarty -{var $v} - Some long {$text|trim} -{/var} - -{var $v|escape} {* apply modifier to variable*} - Some long {$text|trim} -{/var} -``` diff --git a/src/Fenom.php b/src/Fenom.php index 31f12d9..554f40b 100644 --- a/src/Fenom.php +++ b/src/Fenom.php @@ -229,10 +229,20 @@ class Fenom 'type' => self::INLINE_COMPILER, 'parser' => 'Fenom\Compiler::tagInsert' ), - 'var' => array( // {var ...} + 'var' => array( // {var ...} 'type' => self::BLOCK_COMPILER, - 'open' => 'Fenom\Compiler::varOpen', - 'close' => 'Fenom\Compiler::varClose' + 'open' => 'Fenom\Compiler::setOpen', + 'close' => 'Fenom\Compiler::setClose' + ), + 'set' => array( // {set ...} + 'type' => self::BLOCK_COMPILER, + 'open' => 'Fenom\Compiler::setOpen', + 'close' => 'Fenom\Compiler::setClose' + ), + 'add' => array( // {add ...} + 'type' => self::BLOCK_COMPILER, + 'open' => 'Fenom\Compiler::setOpen', + 'close' => 'Fenom\Compiler::setClose' ), 'block' => array( // {block ...} {parent} {/block} 'type' => self::BLOCK_COMPILER,