Встроенные функции в языке шаблонов Smarty

В smarty включены несколько встроенных функций. Встроенные функции интегрированы в язык шаблонов. Нельзя создавать пользовательские функции с такими же названиями или как-либо модифицировать встроенные функции.

capture

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,foreachelse

Циклы 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 - имя свойства.

iteration

Количество отработанных итераций. Отсчет начинается с 1 и увеличивается на единицу на каждой итерации.

first

first устанавливается в true, если текущая итерация первая.

last

last устанавливается в true, если текущая итерация последняя.

show

Аттрибут show может принимать логические значения (истина или ложь). Если ложь, то цикл foreach не будет отображаться. Если присутствует тэг foreachelse, то он будет отображен.

total

total хранит количество итераций цикла. Может быть использовано как в цикле, так и вне его..

include

Тэги 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,elseif,else

Конструкция 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

Тэг 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,sectionelse

Секции используются для обхода массива данных. Все тэги 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}

В рамках A.CMS наиболее часто употребимый способ для вывода списков данных.

{* sectionelse обработается, когда $custid не содержит значений *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
{sectionelse}
	there are no values in $custid.
{/section}

Секции также имеют свои собственные аттрибуты, которые определяют определенные настройки секции. Они указываются примерно так: {$smarty.section.sectionname.varname}

index

index хранит текущий индекс цикла, начиная с 0 (или значения аттрибута start), и увеличивается на единицу (или на значение аттрибута step).

{section name=customer loop=$custid}
    {$smarty.section.customer.index} id: {$custid[customer]}<br>
{/section}

index_prev

index_prev хранит предыдущий индекс цикла. На первой итерации устанавливается в -1.

index_next

index_next хранит следующий индекс цикла. На последней итерации цикла будет иметь значение на единицу больше текущего индекса (или на другое значение, если указан аттрибут step).

iteration

iteration хранит текущую итерацию цикла.

Значение не зависит от аттрибутов start, step и max, в отличии аттрибута index. Итерации также начинаются с 1, а не с 0, как index. rownum является синонимом для iteration

first

first имеет значение истина, если текущая итерация цикла - первая.

last

last имеет значение истина, если текущая итерация цикла - последняя. one.

rownum

rownum хранит текущую итерацию цикла, начиная с 1. rownum - синоним для iteration.

total

total хранит количество всех итераций цикла. Может быть использвован как в секции, так и после нее.

strip

Часто вебдизайнеры сталкиваются с проблемой, что пробелы и переносы строк влияют на отображение 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}

Следующая глава

 
smarty/smarty4.txt · Последние изменения: 14.02.2018 13:03 (внешнее изменение)