What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
{foreach}
используется для работы как с
ассоциативным,
так и с числовыми массивами, в отличие от функции
{section}
,
которая предназначена для работы
исключительно с числовыми массивами.
Синтаксис функции {foreach}
намного проще, чем
{section}
,
но она может работать только с одним массивом
одновременно. Каждый тэг {foreach}
должен иметь
закрывающую пару {/foreach}
.
Имя атрибута | Тип | Обязателен | По умолчанию | Описание |
---|---|---|---|---|
from | array | Да | n/a | Массив, по которому надо пройтись |
item | string | Да | n/a | Имя переменной, которая будет значением текущего елемента |
key | string | Нет | n/a | Имя переменной, которая будет ключом текущего елемента |
name | string | Нет | n/a | Название цикла foreach для доступа к его свойствам |
Атрибуты from
и item
являются обязательными.
Параметр name
цикла {foreach}
может состоять из букв, цифр и знака подчеркивания, как и
переменные PHP.
Циклы {foreach}
могут быть вложенными при условии, что
их имена будут уникальными.
Атрибут from
, обычно являющийся массивом,
определяет количество проходов цикла {foreach}
.
Блок {foreachelse}
выполняется в том случае, если
в параметре from
нет значений.
У циклов {foreach}
также есть собственные переменные,
которые обрабатывают свойства.
Доступ к ним можно получить таким образом:
{$smarty.foreach.name.property}
, где
“name” - атрибут name
функции
{foreach}
.
Атрибут name
необходим только в том случае,
когда у вас есть необходимость обращаться к свойствам
{foreach}
, в отличие от функции
{section}
.
Обращение к свойствам {foreach}
с неопределенным
name
не вызывает ошибки, но ведёт к непредсказуемым
результатам.
{foreach}
имеет следующие свойства:
index
,
iteration
,
first
,
last
,
show
и
total
.
Example 7.5. Атрибут item
<?php $arr = array(1000, 1001, 1002); $smarty->assign('myArray', $arr); ?>
Шаблон для отображения $myArray
в виде
ненумерованного списка
<ul> {foreach from=$myArray item=foo} <li>{$foo}</li> {/foreach} </ul>
Результат выполнения данного примера:
<ul> <li>1000</li> <li>1001</li> <li>1002</li> </ul>
Example 7.6. Пример работы атрибутов item
и key
<?php $arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding'); $smarty->assign('myArray', $arr); ?>
Шаблон для отображения $myArray
в виде пар ключ/значение,
как foreach
в PHP.
<ul> {foreach from=$myArray key=k item=v} <li>{$k}: {$v}</li> {/foreach} </ul>
Результат выполнения данного примера:
<ul> <li>9: Tennis</li> <li>3: Swimming</li> <li>8: Coding</li> </ul>
Example 7.7. {foreach} с ассоциативным атрибутом item
<?php $items_list = array(23 => array('no' => 2456, 'label' => 'Salad'), 96 => array('no' => 4889, 'label' => 'Cream') ); $smarty->assign('items', $items_list); ?>
Шаблон для отображения элементов $items
, в котором
$myId
используется в URL'е
<ul> {foreach from=$items key=myId item=i} <li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li> {/foreach} </ul>
Результат выполнения данного примера:
<ul> <li><a href="item.php?id=23">2456: Salad</li> <li><a href="item.php?id=96">4889: Cream</li> </ul>
Example 7.8. {foreach} со вложенными item
и key
В Smarty передан такой массив, ключ которого содержит ключ для каждого перебираемого значения.
<?php $smarty->assign('contacts', array( array('phone' => '1', 'fax' => '2', 'cell' => '3'), array('phone' => '555-4444', 'fax' => '555-3333', 'cell' => '760-1234') )); ?>
Шаблон для отображения $contact
.
{foreach name=outer item=contact from=$contacts} <hr /> {foreach key=key item=item from=$contact} {$key}: {$item}<br /> {/foreach} {/foreach}
Результат выполнения данного примера:
<hr /> phone: 1<br /> fax: 2<br /> cell: 3<br /> <hr /> phone: 555-4444<br /> fax: 555-3333<br /> cell: 760-1234<br />
Example 7.9. Пример использования {foreachelse} при работе с базой данных
Пример работы с базой данных (при помощи PEAR или ADODB) в скрипте поиска, результаты которого передаются в Smarty.
<?php $search_condition = "WHERE name LIKE '$foo%' "; $sql = 'SELECT contact_id, name, nick FROM contacts '.$search_condition.' ORDER BY name'; $smarty->assign('results', $db->getAssoc($sql) ); ?>
Шаблон отобразит сообщение “Ничего не найдено” при помощи
{foreachelse}
в случае, если поиск не дал результатов.
{foreach key=cid item=con from=$results} <a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br /> {foreachelse} Ничего не найдено {/foreach}
index
contains the current array index, starting with zero.
Example 7.10. index
example
{* The header block is output every five rows *} <table> {foreach from=$items key=myId item=i name=foo} {if $smarty.foreach.foo.index % 5 == 0} <tr><th>Title</th></tr> {/if} <tr><td>{$i.label}</td></tr> {/foreach} </table>
iteration
содержит значение текущей итерации цикла
и всегда начинается с единицы, в отличие от
index
.
Это значение увеличивается на единицу с каждой следующей итерацией.
Example 7.11. Примеры работы с iteration
и index
{* этот шаблон выведет 0|1, 1|2, 2|3, ... и т.д. *} {foreach from=$myArray item=i name=foo} {$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration}, {/foreach}
Свойство first
равно TRUE
, если текущая итерация
{foreach}
- первая.
Example 7.12. Пример использования свойства first
{* отображаем "НОВОЕ" напротив первого элемента, иначе id *} <table> {foreach from=$items key=myId item=i name=foo} <tr> <td>{if $smarty.foreach.foo.first}НОВОЕ{else}{$myId}{/if}</td> <td>{$i.label}</td> </tr> {/foreach} </table>
Свойство last
равно TRUE
, если текущая итерация
{foreach}
- последняя.
Example 7.13. Пример использования свойства last
{* Добавляем горизонтальную полосу (<hr />) в конце списка *} {foreach from=$items key=part_id item=prod name=products} <a href="#{$part_id}">{$prod}</a>{if $smarty.foreach.products.last}<hr />{else},{/if} {foreachelse} ... content ... {/foreach}
show
используется как параметр для {foreach}
.
show
- это булевое значение.
Если оно равно FALSE
, результат работы {foreach}
не будет отображен.
Если присутствует директива {foreachelse}
, её содержимое
будет отображено.
total
содержит общее количество итераций,
которое пройдет данный цикл {foreach}
.
Его можно использовать во время или после выполнения {foreach}
.
Example 7.14. Пример использования свойства total
{* отображаем количество отображенных строк в конце *} {foreach from=$items key=part_id item=prod name=foo} {$prod.name}<hr/> {if $smarty.foreach.foo.last} <div id="total">{$smarty.foreach.foo.total} предметов</div> {/if} {foreachelse} ... что-то другое ... {/foreach}
См. также
{section}
и
$smarty.foreach
.