Теги Fenom

Тег {autoescape}

Задает индивидуальное значение параметра auto_escape на фрагмент шаблона:

{autoescape true}
    ...
    Text: {$text} {* значение переменной $text будет заэкранированно *}
    ...
{/autoescape}

Так же смотите тег {raw} и параметр тега :raw

Тег {autotrim}

Задает индивидуальное значение параметра auto_trim на фрагмент шаблона:

{autotrim true}
    ...
    Text: {$text}
    ...
{/autotrim}

Тег {cycle}

Тег {cycle} используется для прохода через множество значений. С его помощью можно легко реализовать чередование двух или более заданных значений.

{for $i=1 to=6}
    <div class="{cycle ["odd", "even"]}">
{/for}


{for $i=1 to=6}
    <div class="{cycle ["odd", "even"] index=$i}">
{/for}

Тег {do}

Выполнить произвольноые выражение без вывода результата на экран

{do $count++}
{do $object->method()}

Тег {extends}

Тег {extends} реализует наследование шаблонов, иерархия, обратная {include}. То есть шаблон сам выбирает своего родителя.

{extends}

Родительский шаблон можно задать единожды и до объявления какого-либо блока.

{extends 'parent.tpl'}

Замечание: Имя родительского шаблона может быть задан динамически, но в этом случае производительность шаблона значительно снижается.

{extends $parent_tpl}

{block}

Блок указывает фрагмент шаблона, который будет передан родителю. Имя блока должно быть задано явно:

{block 'bk1'}content 1{/block}
...
{block 'bk2'}content 2{/block}

{use}

Что бы импортировать блоки из другого шаблона используйте тег {use}:

{use 'blocks.tpl'}

{parent}

{block 'block1'}
  content ...
  {parent}
  content ...
{/block}

{paste}

Вставка кода блока в любое место через тег {paste}

{block 'b1'}
  ...
{/block}

{paste 'b1'}

{$.block}

Проверка наличия блока через глобальную переменную $.block

{if $.block.header}
    ...
{/if}

Тег {filter}

Тег {filter} позволяет применить модификаторы на фрагмент шаблона

{filter|strip_tags|truncate:20}
Remove all HTML <b>tags</b> and truncate {$text} to 20 symbols
{/filter}

Тег {for}

{for $counter=<start> to=<end> [step=<step>] [index=$index] [first=$first] [last=$last]}
   {* ...code... *}
   {break}
   {* ...code... *}
   {continue}
   {* ...code... *}
{forelse}
   {* ...code... *}
{/for}

{for}

Переменная $counter принимает значение и увеличивает своё значение на на каждой итерации цикла пока не достигнет или не станет больше . является необязательным аргументом. Если не указан, считается равным единице. $index имеет значение номера текущей итерации. Первая итерация имеет номер 0. $first равно TRUE, если итерация первая. $last равно TRUE, если итерация последняя.

Поля <start>, <end>, <step> могут быть числами, или переменными, значение которых приводится к числовому. Значением параметров index, first, last может быть только переменная (допускаются вложенности на подобии $a.b.c, но массив $a.b должен быть объявлен).

{break}

Тег {break} используется для выхода из цикла до достижения последней итерации. Если в цикле встречается тег {break}, цикл завершает свою работу, и далее выполняется код, следующий сразу за блоком цикла

{continue}

Тег {continue} используется для прерывания текущей итерации. Если в цикле встречается тег {continue}, часть цикла, следующая после тега, не выполняется, и начинается следующая итерация. Если текущая итерация была последней, цикл завершается.

{forelse}

Тег {forelse} ограничивает код, который должен быть выполнен, если сочетание полей , и не обеспечивают ни одной итерации.

Тег {foreach}

Тег foreach предоставляет простой способ перебора массивов. Foreach работает только с массивами, объектами и интервалами.

{foreach $list [as [$key =>] $value] [index=$index] [first=$first] [last=$last]}
   {* ...code... *}
   {break}
   {* ...code... *}
   {continue}
   {* ...code... *}
{foreachelse}
   {* ...code... *}
{/foreach}

{foreach}

Перебор значений массива $list:

{foreach $list as $value}
 <div>{$value}</div>
{/foreach}

{foreach 1..7 as $value} {* так же хорошо работает и с интервалами *}
 <div>№{$value}</div>
{/foreach}

Перебор ключей и значений массива $list:

{foreach $list as $key => $value}
 <div>{$key}: {$value}</div>
{/foreach}

Получение номера (индекса) итерации, начиная с 0

{foreach $list as $value}
 <div>№{$value@index}: {$value}</div>
{/foreach}

или

{foreach $list as $value index=$index}
 <div>№{$index}: {$value}</div>
{/foreach}

Определение первой итерации:

{foreach $list as $value}
 <div>{if $value@first} first item {/if} {$value}</div>
{/foreach}

или

{foreach $list as $value first=$first}
 <div>{if $first} first item {/if} {$value}</div>
{/foreach}

Переменная $value@first будет иметь значение TRUE, если текущая итерация является первой. Определение последней интерации:

{foreach $list as $value}
 <div>{if $value@last} last item {/if} {$value}</div>
{/foreach}

или

{foreach $list as $value last=$last}
 <div>{if $last} last item {/if} {$value}</div>
{/foreach}

Переменная $value:last будет иметь значение TRUE, если текущая итерация является последней.

Замечание: Использование last требует от $list быть countable.

{break}

Тег {break} используется для выхода из цикла до достижения последней итерации. Если в цикле встречается тег {break}, цикл завершает свою работу, и далее, выполняется код, следующий сразу за блоком цикла

{continue}

Тег {continue} используется для прерывания текущей итерации. Если в цикле встречается тег {continue}, часть цикла, следующая после тега, не выполняется, и начинается следующая итерация. Если текущая итерация была последней, цикл завершается.

{foreachelse}

Тег {foreachelse} ограничивает код, который должен быть выполнен, если итерируемый объект пуст.

{var $list = []}
{foreach $list as $value}
 <div>{if $last} last item {/if} {$value}</div>
{foreachelse}
 <div>empty</div>
{/foreach}

В блоке {foreachelse}...{/foreach} использование {break}, {continue} выбросит исключение Fenom\CompileException при компиляции

Тег {if}

Реализация оператора if из PHP

{if <expression>}
   {* ...code... *}
{elseif <expression>}
   {* ...code... *}
{else}
   {* ...code... *}
{/if}

{if}

{if <expression>}
    {*...some code...*}
{/if}

Код, расположенный в теге {if} будет выполнен/выведен если выражение возвращает значение приводимое к TRUE

{elseif}

{if <expression1>}
    {*...some code...*}
{elseif <expression2>}
    {*...some code...*}
{/if}

Код, расположенный после тега {elseif} будет выполнен/выведен, если выражение вернуло значение приводимое к FALSE, а - приводимое к TRUE

{else}

{if <expression>}
    {*...some code...*}
{else}
    {*...some code...*}
{/if}

Код, расположенный после тега {else} будет выполнен/выведен, если выражение вернуло значение приводимое к FALSE В тестируемых выражениях могут быть использованы логические операторы, что позволяет обрабатывать сочетания нескольких условий.

 

Тег {include}

Тэги {include} используются для включения других шаблонов в текущий. Любые переменные, доступные в текущем шаблоне, доступны и во включаемом.

{include "about.tpl"}

Вы также можете передать переменные в подключаемый шаблон в виде атрибутов. Любая переменная, переданная в подключаемый шаблон, доступны только в области видимости подключаемого файла. Переданные переменные имеют преимущество перед существующими переменными с аналогичными именами.

{include "pagination.tpl" count=$total_pages current=$.get.page}

Все значения присвоенных переменных восстанавливаются после того, как подключаемый шаблон отработал. Это значит, что вы можете использовать все переменные из подключающего шаблона в подключаемом, но изменения переменных внутри подключаемого шаблона не будут видны внутри подключающего шаблона после команды {include}.

Если требуется сохранить результат отрисовки шаблона в переменную то используйте $.fetch($templates, $values):

{set $data = $.fetch('user.tpl', ["name" => $data.name, "email" => $data.email])}

{insert}

В отличии от {include} тег {insert} не вызывает дочерний шаблон во время отрисовки, а вставляет код дочернего шаблона в родительский на момент компиляции. Это позволяет сэкономить ресурсы на проверке и чтении шаблона. Однако такой формат подключения шаблона имеет ограничения. Имя шаблона должно быть задано явно, без использования переменных и выражений:

{insert 'pagination.tpl'} {* отработает *}
{insert $pagination} {* вызовет ошибку *}

Рассмотрим тега {insert} на примере. Допустим шаблон main.tpl имеет следующий код:

a: {$a}
{insert 'b.tpl'}
c: {$c}

b.tpl:

b: {$b}

Компилятор увидит шаблон main.tpl таким:

a: {$a}
b: {$b}
c: {$c}

Тег {macro}

Макросы - фрагмент шаблона который можно повторить сколь угодно раз и в каком угодно месте. Макросы не имеют общего пространства имен с шаблоном и могут оперировать только переданными переменными.

{macro}

Обявление макроса происходит при помощи блочного тега {macro}

{macro plus($x, $y, $z=0)}
    x + y + z = {$x + $y + $z}
{/macro}

Вызов макроса происходит при помощи строкового тега {macro}. Аргументы передаются стандартно, как атрибуты в HTML тегах

{macro.plus x=$num y=100}

Во время рекурсивного вызова используйте суффикс macro что бы обратиться к текущему макросу:

{macro plus($x, $y, $z=0)}
    ...
    {macro.plus x=2 y=$y}
    ...
{/macro}

{import}

Для использования маросов в другом шаблоне необходимо их импортировать при помощи тега {import}

{import 'math.tpl'}

При импорте можно указать другое пространство имен что бы можно было использовать одноименные макросы из разных шаблонов

{import 'math.tpl' as math}
...
{math.plus x=5 y=100}

Пространство имен макросов может совпадать с названием какого-либо тега, в данном случае ничего плохого не произойдет: будет вызван макрос, а тег не исчезнит При необходимости можно импортировать только необходимые макросы, явно указав в теге {import}

{import [plus, minus, exp] from 'math.tpl' as math}

Тег {raw}

Тег {raw <expression>} позволяет вывести результат выражения без экранирования.

{autoescape true}
    ...
    {$var|up} {* escape *}
    {raw $var|up} {* unescape *}
    ...
    {"name is: <b>{$name|low}</b>"} {* escape *}
    {raw "name is: <b>{$name|low}</b>"} {* unescape *}
    ...
{/autoescate}

Для функций используйте параметр тега :raw:

{autoescape true}
    ...
    {my_func page=5} {* escape *}
    {my_func:raw page=5} {* unescape *}
    ...
{/autoescape}

Тег {set}

{set}

Тег {set} используется для установки значения переменной в процессе выполнения шаблона.

{set $var=(expr)}
{set $var}
  ... any content ...
{/set}
{set $var|modifiers}
  ... any content ...
{/set}

Имя переменной $var должно соответствовать принятому правилу именования переменных. Выражение expr может быть любое сочетание переменных, скалярных значений и массивов.

{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}

В качестве значения переменной можно задать результат отрисовки фрагмента шаблона:

{set $v}
    Some long {$text|trim}
{/set}

Такой вариант создания позволяет применить модификаторы к данным перед тем как они будут сохранены в переменную:

{set $v|escape} {* применение можификатора к значению *}
    Some long {$text|trim}
{/set}

{add}

Тег {add} делает тоже самое что и тег {set} за исключением того что сначала проверяет наличие переменной и если переменной нет — задет новое значение.

{add $var = 'value'}

Работу тега можно описать следующим образом:

{if $var is not set}
    {set $var = 'value'}
{/if}

{var}

Тег {var} старое название тега {set}, сейчас это одно и тоже.

Тег {switch}

Тег {switch} подобен серии операторов {if} с одинаковым условием. Во многих случаях вам может понадобиться сравнивать одну и ту же переменную (или выражение) с множеством различных значений, и выполнять различные участки кода в зависимости от того, какое значение принимает эта переменная (или выражение). Это именно тот случай, для которого удобен тег {switch}.

Тег {switch} в качестве аргумента принимает любое выражение. Каждый возможный случай описывается тегом {case value} значения value которых могут быть только явно заданные скалярные значения. Случаи могут повторятся, в этом случае блоки для которых повторялся случай будут последовательно выполнены по направлению сверху вниз. Случай default подразумевает обработку если ни один случай не произошел.

{switch <condition>}
{case value1}
    ...
{case value2, value3, ...}
    ...
{case value3}
    ...
{case default, <value1>}
    ...
{/switch}

Рассмотрим пример:

{switch $color}
{case 'red', 'scarlet'}
    Оттенок красного цвета
{case 'green', 'harlequin'}
    Оттенок зеленого цвета
{case 'black', 'grey', 'gray'}
    Черный цвет
{case 'white', 'grey', 'gray'}
    Белый цвет
{case default, 'unknown'}
    Неизвестный цвет
{/switch}

если задать $color = 'red' результатом будет:

Оттенок красного цвета

для случая $color = 'grey' будут вызваны два бока:

Черный цвет
Белый цвет

случаи $color = 'yellow' и $color = 'unknown' будут обработаны последним блоком:

Неизвестный цвет

Тег {unset}

Удаляет переменные.

{unset $a} единичное удаление

{unset $a $b $c.d.e} множественное удаление