section,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 Указывает, показывать или нет эту секцию

Секции используются для обхода массива данных. Все тэги section должны иметь в пару тэг /section . Обязательные параметры: name и loop . Имя секции может быть какой угодно последовательностью букв, цифр и знаков подчеркиваний. Секции могут быть вложенными. Имена вложенных секций должны отличаться друг от друга. Переменная цикла (обычно массив) определяет количество итериций цикла. Когда отображаем переменную цикла, имя секции должно быть указана после имени переменной в квадратных скобках []. Тэг sectionelse выполняется, когда переменная цикла пуста.

Пример 7-15. section

{* этот пример выведет все значения массива $custid *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
{/section}

OUTPUT:

id: 1000<br>
id: 1001<br>
id: 1002<br>

Пример 7-16. section loop variable

{* Переменная цикла определяет только количество итераций цикла.
   Вы имеете доступ к любой переменной шаблона в секции.
   Этот пример подразумевает, что каждый из массивов $custid, $name и $address 
   содержат одинаковое количество значений *}
{section name=customer loop=$custid}
	id: {$custid[customer]}<br>
	name: {$name[customer]}<br>
	address: {$address[customer]}<br>
	<p>
{/section}


OUTPUT:

id: 1000<br>
name: John Smith<br>
address: 253 N 45th<br>
<p>
id: 1001<br>
name: Jack Jones<br>
address: 417 Mulberry ln<br>
<p>
id: 1002<br>
name: Jane Munson<br>
address: 5605 apple st<br>
 <p>

Пример 7-17. имена секций

{* имя секции может быть любым и используется для указания 
   данных в секции *}
{section name=mydata loop=$custid}
	id: {$custid[mydata]}<br>
	name: {$name[mydata]}<br>
	address: {$address[mydata]}<br>
	<p>
{/section}

Пример 7-18. вложенные секции

{* секции могут быть неограничено вложенными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}


OUTPUT:

id: 1000<br>
name: John Smith<br>
address: 253 N 45th<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: john@mydomain.com<br>
<p>
id: 1001<br>
name: Jack Jones<br>
address: 417 Mulberry ln<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jack@mydomain.com<br>
<p>
id: 1002<br>
name: Jane Munson<br>
address: 5605 apple st<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jane@mydomain.com<br>
 <p>

Пример 7-19. секции и ассоциативные массивы

{* Пример вывода ассоциативного массива. *}
{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}


OUTPUT:

name: John Smith<br>
home: 555-555-5555<br>
cell: 555-555-5555<br>
e-mail: john@mydomain.com<p>
name: Jack Jones<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jack@mydomain.com<p>
name: Jane Munson<br>
home phone: 555-555-5555<br>
cell phone: 555-555-5555<br>
e-mail: jane@mydomain.com<p>

Пример 7-20. sectionelse

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

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

ЗАМЕЧАНИЕ: Начиная со Smarty версии 1.5.0, синтаксис аттрибутов секций изменился с {%sectionname.varname%} на {$smarty.section.sectionname.varname}. Старый синтаксис пока поддерживается, но вы встретите только новый стиль в примерах данного руководства.

index

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

Техническое Замечание: Если аттрибуты step и start не указаны, то index аналогичен аттрибуту секции iteration, кроме того, что начинается с 0, а не с 1.

Пример 7-21. аттрибут секции index

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


	OUTPUT:

	0 id: 1000<br>
	1 id: 1001<br>
 2 id: 1002<br>

index_prev

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

Пример 7-22. аттрибут секции index_prev

{section name=customer loop=$custid}
	{$smarty.section.customer.index} id: {$custid[customer]}<br>
	{* FYI, $custid[customer.index] and $custid[customer] are identical in meaning *}
	{if $custid[customer.index_prev] ne $custid[customer.index]}
    	The customer id changed<br>
	{/if}
	{/section}


	OUTPUT:

	0 id: 1000<br>
    	The customer id changed<br>
	1 id: 1001<br>
    	The customer id changed<br>
	2 id: 1002<br>
     The customer id changed<br>

index_next

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

Пример 7-23. аттрибут секции index_next

{section name=customer loop=$custid}
	{$smarty.section.customer.index} id: {$custid[customer]}<br>
	{* FYI, $custid[customer.index] and $custid[customer] are identical in meaning *}
	{if $custid[customer.index_next] ne $custid[customer.index]}
    	The customer id will change<br>
	{/if}
	{/section}


	OUTPUT:

	0 id: 1000<br>
    	The customer id will change<br>
	1 id: 1001<br>
    	The customer id will change<br>
	2 id: 1002<br>
     The customer id will change<br>

iteration

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

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

Пример 7-24. аттрибут секции iteration

{section name=customer loop=$custid start=5 step=2}
	current loop iteration: {$smarty.section.customer.iteration}<br>
	{$smarty.section.customer.index} id: {$custid[customer]}<br>
	{* FYI, $custid[customer.index] and $custid[customer] are identical in meaning *}
	{if $custid[customer.index_next] ne $custid[customer.index]}
    	The customer id will change<br>
	{/if}
	{/section}


	OUTPUT:

	current loop iteration: 1
	5 id: 1000<br>
    	The customer id will change<br>
	current loop iteration: 2
	7 id: 1001<br>
    	The customer id will change<br>
	current loop iteration: 3
	9 id: 1002<br>
     The customer id will change<br>

first

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

Пример 7-25. аттрибут секции first

{section name=customer loop=$custid}
	{if $smarty.section.customer.first}
    	<table>
	{/if}

	<tr><td>{$smarty.section.customer.index} id:
        	{$custid[customer]}</td></tr>

	{if $smarty.section.customer.last}
    	</table>
	{/if}
	{/section}


	OUTPUT:

	<table>
	<tr><td>0 id: 1000</td></tr>
	<tr><td>1 id: 1001</td></tr>
	<tr><td>2 id: 1002</td></tr>
 </table>

last

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

Пример 7-26. аттрибут секции last

{section name=customer loop=$custid}
	{if $smarty.section.customer.first}
    	<table>
	{/if}

	<tr><td>{$smarty.section.customer.index} id:
        	{$custid[customer]}</td></tr>

	{if $smarty.section.customer.last}
    	</table>
	{/if}
	{/section}


	OUTPUT:

	<table>
	<tr><td>0 id: 1000</td></tr>
	<tr><td>1 id: 1001</td></tr>
	<tr><td>2 id: 1002</td></tr>
 </table>

rownum

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

Пример 7-27. аттрибут секции rownum

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


	OUTPUT:

	1 id: 1000<br>
	2 id: 1001<br>
 3 id: 1002<br>

loop

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

Пример 7-28. аттрбут секции index

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

	There were {$smarty.section.customer.loop} customers shown above.

	OUTPUT:

	0 id: 1000<br>
	1 id: 1001<br>
	2 id: 1002<br>

 There were 3 customers shown above.

show

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

Пример 7-29. аттрибут секции show

{* $show_customer_info может быть передана из PHP программы
	укаызвая, показывать или нет эту секцию *}
	{section name=customer loop=$custid show=$show_customer_info}
	{$smarty.section.customer.rownum} id: {$custid[customer]}<br>
	{/section}

	{if $smarty.section.customer.show}
	the section was shown.
	{else}
	the section was not shown.
	{/if}


	OUTPUT:

	1 id: 1000<br>
	2 id: 1001<br>
	3 id: 1002<br>

 the section was shown.

total

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

Пример 7-30. аттрибут секции total

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

	There were {$smarty.section.customer.total} customers shown above.

	OUTPUT:

	0 id: 1000<br>
	2 id: 1001<br>
	4 id: 1002<br>

 There were 3 customers shown above.