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