Секции используются для обхода массивов данных (так же, как и {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 | Указывает, показывать или нет эту секцию |
Пример 7.30. {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.31. Переменная 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.32. именование {section}
{* имя секции может быть любым, так как оно используется для обращения к данным в пределах секции *} {section name=anything loop=$custid} <p> id: {$custid[anything]}<br /> name: {$name[anything]}<br /> address: {$address[anything]} </p> {/section}
Пример 7.33. вложенные секции
<?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.34. секции и ассоциативные массивы
<?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.35. {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 используется для отображения текущего индекса массива, начиная с нуля (или с атрибута start, если он был указан) и увеличиваясь на единицу (или на значение атрибута step, если он был указан).
Техническое Замечание
Если атрибуты step и start не указаны, то index аналогичен атрибуту секции iteration, кроме того, что начинается с 0, а не с 1.
Пример 7.36. свойства {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 используется для отображения предыдущего индекса цикла На первой итерации он установлен в -1.
index_next используется для отображения следующего индекса цикла На последней итерации он всё же на единицу больше текущего (или на другое значение, если указан атрибут step).
Пример 7.37. свойства {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 используется для отображения текущего номера итерации цикла.
Замечание
Это значение не зависит от свойств start, step и max, в отличие от свойства index. Кроме того, итерации начинаются с единицы, а не с нуля, как индексы. rownum - это синоним к свойству iteration, они работают одинаково.
Пример 7.38. свойство {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 установлен в true, если текущая итерация секции является первой.
Параметр last установлен в true, если текущая итерация секции является последней.
Пример 7.39. свойства {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 используется для отображения текущего номера итерации цикла, начиная с единицы. Это синоним свойства iteration, они работа идентично.
loop используется для отображения последнего номера индекса, по которому проходила итерация секции. Это свойство может быть использовано как внутри, так и вне секции.
Пример 7.40. свойство {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 является булевым значением, true или false. Если false, секция не будет отображена. Если присутствует секция {sectionelse}, вместо этого будет отображена она.
Пример 7.41. атрибут {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 используется для отображения количества итераций, через которые пройдет эта секция. Это свойство может быть использовано как внутри, так и вне секции.
Пример 7.42. свойство {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.