В smarty включены несколько встроенных функций. Встроенные функции интегрированы в язык шаблонов. Нельзя создавать пользовательские функции с такими же названиями или как-либо модифицировать встроенные функции.
capture используется для того, чтобы присвоить вывод шаблона какой-либо переменной вместо его вывода на экран. Любое содержание между {capture name=«foo»} и {/capture} сохраняется в переменную, указанную в атрибуте name. Затем его можно использовать в шаблоне с помощью специальной переменной $smarty.capture.foo, где foo - значение, переданное атрибуту name. Если аттрибут name не указан, то используется default. Каждая команда {capture} должна иметь пару {/capture}. capture поддерживает вложение.
{capture name=banner} {include file="get_banner.tpl"} {/capture} {if $smarty.capture.banner} <tr> <td> {$smarty.capture.banner} </td> </tr> {/if}
Циклы foreach являются альтернативой циклам section . Циклы foreach используются для прохождения по одному массиву. Синтаксис foreach намного проще, чем section , но его можно использовать только для одного массива. Тэг foreach должен иметь в пару тэг /foreach . Обязательные параметры - from и item . Название цикла foreach может быть любой последовательностью букв, цифр и знаков подчеркиваний _. Циклы foreach могут быть вложенные, и имена вложенных циклов должны быть уникальные. Переменная from (обычно массив значений) указывает количество итераций цикла. foreachelse выполняется, если нету значений в переменной from .
Имя аттрибута | Тип | Обязателен | По умолчанию | Описание |
---|---|---|---|---|
from | строка (string) | Да | n/a | Имя массива, по которому надо пройтись |
item | строка (string) | Да | n/a | Имя переменной, которая будет выступать в качестве значения текущего елемента |
key | строка (string) | Нет | n/a | Имя переменной, которая будет выступать в качестве ключа текущего елемента |
name | строка (string) | Нет | n/a | Название цикла foreach для доступа к его свойствам |
{* выводятся все значния массива $custid *} {foreach from=$custid item=curr_id} id: {$curr_id}<br> {/foreach}
Циклы foreach имеют свои свойства, доступ к которым реализуется через {$smarty.foreach.foreachname.varname}, где foreachname это название цикла (значение аттрибута name ), а varname - имя свойства.
Количество отработанных итераций. Отсчет начинается с 1 и увеличивается на единицу на каждой итерации.
first устанавливается в true, если текущая итерация первая.
last устанавливается в true, если текущая итерация последняя.
Аттрибут show может принимать логические значения (истина или ложь). Если ложь, то цикл foreach не будет отображаться. Если присутствует тэг foreachelse, то он будет отображен.
total хранит количество итераций цикла. Может быть использовано как в цикле, так и вне его..
Тэги include используются для включения других шаблонов в текущий. Любые переменные, доступные в текущем шаблоне, доступны и во включаемом. Тэг include должен иметь аттрибут «file», который указывает имя ресурса шаблона.
Имя аттрибута | Тип | Обязателен | По умолчанию | Описание |
---|---|---|---|---|
file | строка (string) | Да | n/a | Имя файла шаблона для включения |
assign | строка (string) | Нет | n/a | Имя переменной, которой присвоится вывод шаблона |
[var …] | [var type] | Нет | n/a | Переменные, переданные в локальную область включаемого шаблона |
Опциональный аттрибут assign указывает, что вывод шаблона будет присвоен переменной вместо отображения.
{include file="header.tpl"} {* тело шаблона *} {include file="footer.tpl"}
Вы также можете передать переменные в подключаемый шаблон в виде атрибутов. Любая переменная, переданная в подключаемый шаблон, доступны только в области видимости подключаемого файла. Переданные переменные имеют преимущество перед существующими переменными с аналогичными именами.
{include file="header.tpl" title="Main Menu" table_bgcolor="#c0c0c0"} {* тело шаблона *} {include file="footer.tpl" logo="http://my.domain.com/logo.gif"}
Конструкция if в Smarty такая же гибкая, как и аналогичная конструкциия в php, только с несколько расширенными возможностями. with a few added features for the template engine. Каждый тэг if должен иметь пару /if . else и elseif так же допустимы. «eq», «ne», «neq», «gt», «lt», «lte», «le», «gte» «ge», «is even», «is odd», «is not even», «is not odd», «not», «mod», «div by», «even by», «odd by», »==», »!=», »>», »<», »<=», »>=» – допустимые квалификаторы условий. Они должны быть отделены от окружающих елементов пробелами.
{if $name eq "Fred"} Welcome Sir. {elseif $name eq "Wilma"} Welcome Ma'am. {else} Welcome, whatever you are. {/if} {* пример с логикой ИЛИ ("or") *} {if $name eq "Fred" or $name eq "Wilma"} ... {/if} {* аналогичен предыдущему *} {if $name == "Fred" || $name == "Wilma"} ... {/if} {* следующий синтаксис не будет работать. квалификаторы условий должны быть отделены от окружающих элементов пробелами *} {if $name=="Fred" || $name=="Wilma"} ... {/if} {* допускаются скобки *} {if ( $amount < 0 or $amount > 1000 ) and $volume >= #minVolAmt#} ... {/if} {* можно также вызывать встроенные функции php *} {if count($var) gt 0} ... {/if} {* проверка значения на четность *} {if $var is even} ... {/if} {if $var is odd} ... {/if} {if $var is not odd} ... {/if} {* проверка на делимость на 4 *} {if $var is div by 4} ... {/if} {* проверка на "четность" групируя по 2. т.е., 0=четно, 1=четно, 2=нечетно, 3=нечетно, 4=четно, 5=четно, и т.д. *} {if $var is even by 2} ... {/if} {* 0=четно, 1=четно, 2=четно, 3=нечетно, 4=нечетно, 5=нечетно, и т.д. *} {if $var is even by 3} ... {/if}
Тэг Literal позволяет указать блок данных, который не должен быть обработан Smarty. Это удобно для вывода javascript кода, когда символы { и } могут быть не правильно поняты парсером шаблонов. Все, что окружено тэгами {literal} и {/literal} не обрабатывается и просто отображается как есть.
{literal} <script language=javascript> <!-- function isblank(field) { if (field.value == '') { return false; } else { document.loginform.submit(); return true; } } // --> </script> {/literal}
Секции используются для обхода массива данных. Все тэги section должны иметь в пару тэг /section . Обязательные параметры: name и loop . Имя секции может быть какой угодно последовательностью букв, цифр и знаков подчеркиваний. Секции могут быть вложенными. Имена вложенных секций должны отличаться друг от друга. Переменная цикла (обычно массив) определяет количество итериций цикла. Когда отображаем переменную цикла, имя секции должно быть указана после имени переменной в квадратных скобках []. Тэг sectionelse выполняется, когда переменная цикла пуста.
Имя аттрибута | Тип | Обязателен | По умолчанию | Описание |
---|---|---|---|---|
name | строка (string) | Да | n/a | Название секции |
loop | [$variable_name] | Да | n/a | Имя переменной цикла, для определения количества итераций цикла. |
start | целое (integer) | Нет | 0 | Индекс позиции, с которой будет начинаться цикл. Если значение отрицательное, то начальная позиция вычисляется от конца массива. Например, если в переменной цикла 7 элементов и значение атрибута start равно -2, то начальный индекс будет 5. Неверные значения (значения, вне массива) автоматически обрезаются до ближайшего верного значения. |
step | целое (integer) | Нет | 1 | Значение шага, которое используется для прохода по массиву. Например, step=2 указывает обход массива по элементам 0,2,4… Если шаг отрицателен, то обход массива будет производится в обратном направлении. |
max | целое (integer) | Нет | 1 | Максимальное количество итераций цикла. |
show | логический (boolean) | Нет | true | Указывает, показывать или нет эту секцию |
{* этот пример выведет все значения массива $custid *} {section name=customer loop=$custid} id: {$custid[customer]}<br> {/section}
{* Переменная цикла определяет только количество итераций цикла. Вы имеете доступ к любой переменной шаблона в секции. Этот пример подразумевает, что каждый из массивов $custid, $name и $address содержат одинаковое количество значений *} {section name=customer loop=$custid} id: {$custid[customer]}<br> name: {$name[customer]}<br> address: {$address[customer]}<br> <p> {/section}
{* имя секции может быть любым и используется для указания данных в секции *} {section name=mydata loop=$custid} id: {$custid[mydata]}<br> name: {$name[mydata]}<br> address: {$address[mydata]}<br> <p> {/section}
{* секции могут быть неограничено вложеннымиas. С помощью вложенных секций вы можете организовать доступ к комплексным стрктурам информации, таким как многомерные массивы. В данном примере $contact_type[customer] является массивом, где содержатся типа контактов данного клиент. *} {section name=customer loop=$custid} 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} <p> {/section}
{* Пример вывода ассоциативного массива. *} {section name=customer loop=$contacts} name: {$contacts[customer].name}<br> home: {$contacts[customer].home}<br> cell: {$contacts[customer].cell}<br> e-mail: {$contacts[customer].email}<p> {/section}
{* sectionelse обработается, когда $custid не содержит значений *} {section name=customer loop=$custid} id: {$custid[customer]}<br> {sectionelse} there are no values in $custid. {/section}
Секции также имеют свои собственные аттрибуты, которые определяют определенные настройки секции. Они указываются примерно так: {$smarty.section.sectionname.varname}
index хранит текущий индекс цикла, начиная с 0 (или значения аттрибута start), и увеличивается на единицу (или на значение аттрибута step).
{section name=customer loop=$custid} {$smarty.section.customer.index} id: {$custid[customer]}<br> {/section}
index_prev хранит предыдущий индекс цикла. На первой итерации устанавливается в -1.
index_next хранит следующий индекс цикла. На последней итерации цикла будет иметь значение на единицу больше текущего индекса (или на другое значение, если указан аттрибут step).
iteration хранит текущую итерацию цикла.
first имеет значение истина, если текущая итерация цикла - первая.
last имеет значение истина, если текущая итерация цикла - последняя. one.
rownum хранит текущую итерацию цикла, начиная с 1. rownum - синоним для iteration.
total хранит количество всех итераций цикла. Может быть использвован как в секции, так и после нее.
Часто вебдизайнеры сталкиваются с проблемой, что пробелы и переносы строк влияют на отображение HTML в броузере («фишки» броузера), то есть может понадобится склеить все теги в шаблоне вместе, чтобы получить желаемый результат. Но в результате получается нечитаемый или трудноредактируемый шаблон.
В выводимом тексте, заключенном между тэгами {strip} и {/strip}, удаляются повторные пробелы и переносы строк, перед отображением. Так вы можете сохранив шаблон читаемым не волноваться насчет лишних пробелов.
{* следующее будет выведено в виде одной строки *} {strip} <table border=0> <tr> <td> <a href="{$url}"> <font color="red">This is a test</font> </a> </td> </tr> </table> {/strip}