{section},{sectionelse}
Секции используются для обхода
массивов данных
(так же, как и {foreach}).
Каждый тег {section} должен иметь пару
{/section}. Обязательными параметрами являются
name и loop. Имя цикла
{section} может быть любым, состоящим из букв, цифр и знаков
подчеркивания. Циклы {section} могут быть вложенными
и имена вложенных {section} должны быть уникакльными между собой.
Переменная loop (обычно - массив значений)
определяет количество итераций цикла.
При печати переменных внутри секции, имя секции должно быть указано
рядом с именем переменной внутри квадратных скобок [].
{sectionelse} выполняется в том случае, если
параметр loop не содержит значений.
Пример 7-19. {section}
<?php
$data = array(1000,1001,1002); $smarty->assign('custid',$data);
?>
|
{* этот пример напечатает все значения массива $custid *}
{section name=customer loop=$custid}
id: {$custid[customer]}<br />
{/section}
<hr />
{* этот пример напечатает все значения массива $custid в обратном порядке *}
{section name=foo loop=$custid step=-1}
{$custid[foo]}<br />
{/section} |
Результат выполнения данного примера:
id: 1000<br />
id: 1001<br />
id: 1002<br />
<hr />
id: 1002<br />
id: 1001<br />
id: 1000<br /> |
Ещ╦ немного примеров без присвоенного массива.
{section name=foo start=10 loop=20 step=2}
{$smarty.section.foo.index}
{/section}
<hr />
{section name=bar loop=21 max=6 step=-2}
{$smarty.section.bar.index}
{/section} |
Результат выполнения данного примера:
10 12 14 16 18
<hr />
20 18 16 14 12 10 |
|
Пример 7-20. Переменная loop команды {section}
<?php
$id = array(1001,1002,1003); $smarty->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);
?>
|
{*
переменная loop определяет только количество итераций.
вы можете получать доступ к любой переменной из шаблона внутри секции.
Этот пример предполагает, что $custid, $name и $address все являются
массивами, содержащими одинаковое количество значений
*}
{section name=customer loop=$custid}
<p>
id: {$custid[customer]}<br />
name: {$name[customer]}<br />
address: {$address[customer]}
</p>
{/section} |
Результат выполнения данного примера:
<p>
id: 1000<br />
name: John Smith<br />
address: 253 N 45th
</p>
<p>
id: 1001<br />
name: Jack Jones<br />
address: 417 Mulberry ln
</p>
<p>
id: 1002<br />
name: Jane Munson<br />
address: 5605 apple st
</p> |
|
Пример 7-21. именование {section} {*
имя секции может быть любым, так как оно используется для обращения к
данным в пределах секции
*}
{section name=anything loop=$custid}
<p>
id: {$custid[anything]}<br />
name: {$name[anything]}<br />
address: {$address[anything]}
</p>
{/section} |
|
Пример 7-22. вложенные секции
<?php
$id = array(1001,1002,1003); $smarty->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); ?>
|
{*
секции могут иметь вложенность любой глубины. Используя вложенные секции,
вы можете обращаться к сложным структурам данных, таким как многомерные
массивы. В этом примере $contact_type[customer] - это массив
типов контактов для текущего клиента.
*}
{section name=customer loop=$custid}
<hr>
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}
{/section} |
Результат выполнения данного примера:
<hr>
id: 1000<br />
name: John Smith<br />
address: 253 N 45th<br />
home phone: 555-555-5555<br />
cell phone: 666-555-5555<br />
e-mail: john@myexample.com<br />
<hr>
id: 1001<br />
name: Jack Jones<br />
address: 417 Mulberry ln<br />
home phone: 123-456-4<br />
web: www.example.com<br />
<hr>
id: 1002<br />
name: Jane Munson<br />
address: 5605 apple st<br />
cell phone: 0457878<br /> |
|
Пример 7-23. секции и ассоциативные массивы
<?php
$data = array( array('name' => '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);
?>
|
{*
Это пример вывода ассоциативного массива
данных внутри секции
*}
{section name=customer loop=$contacts}
<p>
name: {$contacts[customer].name}<br />
home: {$contacts[customer].home}<br />
cell: {$contacts[customer].cell}<br />
e-mail: {$contacts[customer].email}
</p>
{/section} |
Результат выполнения данного примера:
<p>
name: John Smith<br />
home: 555-555-5555<br />
cell: 666-555-5555<br />
e-mail: john@myexample.com
</p>
<p>
name: Jack Jones<br />
home phone: 777-555-5555<br />
cell phone: 888-555-5555<br />
e-mail: jack@myexample.com
</p>
<p>
name: Jane Munson<br />
home phone: 000-555-5555<br />
cell phone: 123456<br />
e-mail: jane@myexample.com
</p> |
Базы данных (например, PEAR или ADODB)
<?php
$sql = 'select id, name, home, cell, email from contacts'; $smarty->assign('contacts',$db->getAll($sql) );
?>
|
{*
выводим результат запроса к БД в таблицу
*}
<table>
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
{section name=co loop=$contacts}
<tr>
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
<td>{$contacts[co].name}</td>
<td>{$contacts[co].home}</td>
<td>{$contacts[co].cell}</td>
<td>{$contacts[co].email}</td>
<tr>
{/section}
</table> |
|
Пример 7-24. {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 используется для отображения текущего индекса массива,
начиная с нуля (или с атрибута start, если он был указан) и увеличиваясь
на единицу (или на значение атрибута step, если он был указан).
Техническое Замечание:
Если атрибуты step и start не указаны, то index
аналогичен атрибуту секции iteration, кроме того,
что начинается с 0, а не с 1.
Пример 7-25. свойства {section} index {* к вашему сведению, $custid[customer.index] и $custid[customer] означают одно и то же *}
{section name=customer loop=$custid}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section} |
Результат выполнения данного примера:
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br /> |
|
index_prev
index_prev используется для отображения предыдущего индекса цикла
На первой итерации он установлен в -1.
index_next
index_next используется для отображения следующего индекса цикла
На последней итерации он вс╦ же на единицу больше текущего (или на другое
значение, если указан атрибут step).
Пример 7-26. свойства {section} index_next и index_prev
<?php
$data = array(1001,1002,1003,1004,1005); $smarty->assign('custid',$data);
?>
|
{* к вашему сведению, $custid[cus.index] и $custid[cus] означают одно и то же *}
<table>
<tr>
<th>index</th><th>id</th>
<th>index_prev</th><th>prev_id</th>
<th>index_next</th><th>next_id</th>
</tr>
{section name=cus loop=$custid}
<tr>
<td>{$smarty.section.cus.index}</td><td>{$custid[cus]}</td>
<td>{$smarty.section.cus.index_prev}</td><td>{$custid[cus.index_prev]}</td>
<td>{$smarty.section.cus.index_next}</td><td>{$custid[cus.index_next]}</td>
</tr>
{/section}
</table> |
Результатом выполнения этого примера будет таблица, содержащая следующее:
index id index_prev prev_id index_next next_id
0 1001 -1 1 1002
1 1002 0 1001 2 1003
2 1003 1 1002 3 1004
3 1004 2 1003 4 1005
4 1005 3 1004 5 |
|
iteration
iteration используется для отображения текущего номера итерации цикла.
Замечание:
Это значение не зависит от свойств start, step и max, в отличие от
свойства index.
Кроме того, итерации начинаются с единицы, а не с нуля, как индексы.
rownum - это синоним к
свойству iteration, они работают одинаково.
Пример 7-27. свойство {section} iteration
<?php
// array of 3000 to 3015 $id = range(3000,3015); $smarty->assign('custid',$id);
?>
|
{section name=cu loop=$custid start=5 step=2}
iteration={$smarty.section.cu.iteration}
index={$smarty.section.cu.index}
id={$custid[cu]}<br />
{/section} |
Результат выполнения данного примера:
iteration=1 index=5 id=3005<br />
iteration=2 index=7 id=3007<br />
iteration=3 index=9 id=3009<br />
iteration=4 index=11 id=3011<br />
iteration=5 index=13 id=3013<br />
iteration=6 index=15 id=3015<br /> |
Этот пример использует свойство iteration для
вывода заголовка таблицы через каждые пять строчек
(использует {if}
с оператором mod - остаток от деления).
<table>
{section name=co loop=$contacts}
{if $smarty.section.co.iteration % 5 == 1}
<tr><th> </th><th>Name></th><th>Home</th><th>Cell</th><th>Email</th></tr>
{/if}
<tr>
<td><a href="view.php?id={$contacts[co].id}">view<a></td>
<td>{$contacts[co].name}</td>
<td>{$contacts[co].home}</td>
<td>{$contacts[co].cell}</td>
<td>{$contacts[co].email}</td>
<tr>
{/section}
</table> |
|
first
Параметр first установлен в true, если текущая итерация секции
является первой.
last
Параметр last установлен в true, если текущая итерация секции
является последней.
Пример 7-28. свойства {section} first и last
Этот пример проходит циклом по массиву $customers,
выводит заголовок на первой итерации и футер на последней
(использует свойство {section} total)
{section name=customer loop=$customers}
{if $smarty.section.customer.first}
<table>
<tr><th>id</th><th>customer</th></tr>
{/if}
<tr>
<td>{$customers[customer].id}}</td>
<td>{$customers[customer].name}</td>
</tr>
{if $smarty.section.customer.last}
<tr><td></td><td>{$smarty.section.customer.total} customers</td></tr>
</table>
{/if}
{/section} |
|
rownum
rownum используется для отображения текущего номера итерации цикла,
начиная с единицы. Это синоним свойства iteration, они работа идентично.
loop
loop используется для отображения последнего номера индекса, по которому
проходила итерация секции. Это свойство может быть использовано как внутри,
так и вне секции.
Пример 7-29. свойство {section} index {section name=customer loop=$custid}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
There were {$smarty.section.customer.loop} customers shown above. |
Результат выполнения данного примера:
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
There were 3 customers shown above. |
|
show
show используется в качестве параметра секции.
show является булевым значением, true или false.
Если false, секция не будет отображена. Если присутствует секция {sectionelse},
вместо этого будет отображена она.
Пример 7-30. атрибут {section} show {*
$show_customer_info (true/false) может быть передан из приложения 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} |
Результат выполнения данного примера:
1 id: 1000<br />
2 id: 1001<br />
3 id: 1002<br />
the section was shown. |
|
total
total используется для отображения количества итераций, через которые
пройдет эта секция. Это свойство может быть использовано как внутри, так
и вне секции.
Пример 7-31. свойство {section} 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. |
Результат выполнения данного примера:
0 id: 1000<br />
2 id: 1002<br />
4 id: 1004<br />
There were 3 customers shown above. |
|
См. также
{foreach}
и
$smarty.section.