{section},{sectionelse} Секции используются для обхода массивов данных (так же, как и {foreach}). Каждый тэг {section} должен иметь пару {/section}. Обязательными параметрами являются name и loop. Имя цикла {section} может быть любым, состоящим из букв, цифр и знаков подчеркивания. Циклы {section} могут быть вложенными и имена вложенных {section} должны быть уникакльными между собой. Переменная loop (обычно - массив значений) определяет количество итераций цикла. При печати переменных внутри секции, имя секции должно быть указано рядом с именем переменной внутри квадратных скобок []. {sectionelse} выполняется в том случае, если параметр loop не содержит значений. Имя атрибута Тип Обязателен По умолчанию Описание name string Да n/a Название секции loop mixed Да n/a Значение, определяющее количество итераций цикла. start integer Нет 0 Индекс позиции, с которой будет начинаться цикл. Если значение отрицательное, то начальная позиция вычисляется от конца массива. Например, если в переменной цикла 7 элементов и значение атрибута start равно -2, то начальный индекс будет 5. Неверные значения (значения, вне массива) автоматически обрезаются до ближайшего верного значения. step integer Нет 1 Значение шага, которое используется для прохода по массиву. Например, step=2 указывает обход массива по элементам 0,2,4... Если шаг отрицателен, то обход массива будет производится в обратном направлении. max integer Нет 1 Максимальное количество итераций цикла. show boolean Нет true Указывает, показывать или нет эту секцию {section} assign('custid',$data); ?> ]]> {/section}
{* этот пример напечатает все значения массива $custid в обратном порядке *} {section name=foo loop=$custid step=-1} {$custid[foo]}
{/section} ]]>
Результат выполнения данного примера: id: 1001
id: 1002

id: 1002
id: 1001
id: 1000
]]>
Ещё немного примеров без присвоенного массива. {section name=bar loop=21 max=6 step=-2} {$smarty.section.bar.index} {/section} ]]> Результат выполнения данного примера: 20 18 16 14 12 10 ]]>
Переменная loop команды {section} assign('custid',$id); $fullnames = array('John Smith','Jack Jones','Jane Munson'); $smarty->assign('name',$fullnames); $addr = array('253 N 45th', '417 Mulberry ln', '5605 apple st'); $smarty->assign('address',$addr); ?> ]]> id: {$custid[customer]}
name: {$name[customer]}
address: {$address[customer]}

{/section} ]]>
Результат выполнения данного примера: id: 1000
name: John Smith
address: 253 N 45th

id: 1001
name: Jack Jones
address: 417 Mulberry ln

id: 1002
name: Jane Munson
address: 5605 apple st

]]>
именование {section} id: {$custid[anything]}
name: {$name[anything]}
address: {$address[anything]}

{/section} ]]>
вложенные секции assign('custid',$id); $fullnames = array('John Smith','Jack Jones','Jane Munson'); $smarty->assign('name',$fullnames); $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); ?> ]]> id: {$custid[customer]}
name: {$name[customer]}
address: {$address[customer]}
{section name=contact loop=$contact_type[customer]} {$contact_type[customer][contact]}: {$contact_info[customer][contact]}
{/section} {/section} ]]>
Результат выполнения данного примера: id: 1000
name: John Smith
address: 253 N 45th
home phone: 555-555-5555
cell phone: 666-555-5555
e-mail: john@myexample.com

id: 1001
name: Jack Jones
address: 417 Mulberry ln
home phone: 123-456-4
web: www.example.com

id: 1002
name: Jane Munson
address: 5605 apple st
cell phone: 0457878
]]>
секции и ассоциативные массивы '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); ?> ]]> name: {$contacts[customer].name}
home: {$contacts[customer].home}
cell: {$contacts[customer].cell}
e-mail: {$contacts[customer].email}

{/section} ]]>
Результат выполнения данного примера: name: John Smith
home: 555-555-5555
cell: 666-555-5555
e-mail: john@myexample.com

name: Jack Jones
home phone: 777-555-5555
cell phone: 888-555-5555
e-mail: jack@myexample.com

name: Jane Munson
home phone: 000-555-5555
cell phone: 123456
e-mail: jane@myexample.com

]]>
Базы данных (например, PEAR или ADODB) assign('contacts',$db->getAll($sql) ); ?> ]]>  Name>HomeCellEmail {section name=co loop=$contacts} view {$contacts[co].name} {$contacts[co].home} {$contacts[co].cell} {$contacts[co].email} {/section} ]]>
{sectionelse} {sectionelse} there are no values in $custid. {/section} ]]> Секции так же имеют собственные переменные, которые содержат свойства секций. Они обозначаются так: {$smarty.section.sectionname.varname} Начиная с версии Smarty 1.5.0, синтаксис переменных свойств сессий был изменен с {%sectionname.varname%} на {$smarty.section.sectionname.varname}. Старый синтаксис всё ещё поддерживается, но вы увидите лишь примеры нового синтаксиса. index index используется для отображения текущего индекса массива, начиная с нуля (или с атрибута start, если он был указан) и увеличиваясь на единицу (или на значение атрибута step, если он был указан). Техническое Замечание Если атрибуты step и start не указаны, то index аналогичен атрибуту секции iteration, кроме того, что начинается с 0, а не с 1. свойства {section} index {/section} ]]> Результат выполнения данного примера: 1 id: 1001
2 id: 1002
]]>
index_prev index_prev используется для отображения предыдущего индекса цикла На первой итерации он установлен в -1. index_next index_next используется для отображения следующего индекса цикла На последней итерации он всё же на единицу больше текущего (или на другое значение, если указан атрибут step). свойства {section} index_next и index_prev assign('custid',$data); ?> ]]> indexid index_prevprev_id index_nextnext_id {section name=cus loop=$custid} {$smarty.section.cus.index}{$custid[cus]} {$smarty.section.cus.index_prev}{$custid[cus.index_prev]} {$smarty.section.cus.index_next}{$custid[cus.index_next]} {/section} ]]> Результатом выполнения этого примера будет таблица, содержащая следующее: iteration iteration используется для отображения текущего номера итерации цикла. Это значение не зависит от свойств start, step и max, в отличие от свойства index. Кроме того, итерации начинаются с единицы, а не с нуля, как индексы. rownum - это синоним к свойству iteration, они работают одинаково. свойство {section} iteration assign('custid',$id); ?> ]]> {/section} ]]> Результат выполнения данного примера: iteration=2 index=7 id=3007
iteration=3 index=9 id=3009
iteration=4 index=11 id=3011
iteration=5 index=13 id=3013
iteration=6 index=15 id=3015
]]>
Этот пример использует свойство iteration для вывода заголовка таблицы через каждые пять строчек (использует {if} с оператором mod - остаток от деления). {section name=co loop=$contacts} {if $smarty.section.co.iteration % 5 == 1}  Name>HomeCellEmail {/if}
view {$contacts[co].name} {$contacts[co].home} {$contacts[co].cell} {$contacts[co].email} {/section} ]]> first Параметр first установлен в true, если текущая итерация секции является первой. last Параметр last установлен в true, если текущая итерация секции является последней. свойства {section} first и last Этот пример проходит циклом по массиву $customers, выводит заголовок на первой итерации и футер на последней (использует свойство {section} total) idcustomer {/if} {$customers[customer].id}} {$customers[customer].name} {if $smarty.section.customer.last} {$smarty.section.customer.total} customers {/if} {/section} ]]> rownum rownum используется для отображения текущего номера итерации цикла, начиная с единицы. Это синоним свойства iteration, они работа идентично. loop loop используется для отображения последнего номера индекса, по которому проходила итерация секции. Это свойство может быть использовано как внутри, так и вне секции. свойство {section} index {/section} There were {$smarty.section.customer.loop} customers shown above. ]]> Результат выполнения данного примера: 1 id: 1001
2 id: 1002
There were 3 customers shown above. ]]>
show show используется в качестве параметра секции. show является булевым значением, true или false. Если false, секция не будет отображена. Если присутствует секция {sectionelse}, вместо этого будет отображена она. атрибут {section} show {/section} {if $smarty.section.customer.show} the section was shown. {else} the section was not shown. {/if} ]]> Результат выполнения данного примера: 2 id: 1001
3 id: 1002
the section was shown. ]]>
total total используется для отображения количества итераций, через которые пройдет эта секция. Это свойство может быть использовано как внутри, так и вне секции. свойство {section} total {/section} There were {$smarty.section.customer.total} customers shown above. ]]> Результат выполнения данного примера: 2 id: 1002
4 id: 1004
There were 3 customers shown above. ]]>
См. также {foreach} и $smarty.section.