Get Smarty

Donate

Paypal

Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Advertisement

{foreach},{foreachelse}

{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

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

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

Свойство 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

Свойство 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

show используется как параметр для {foreach}. show - это булевое значение. Если оно равно FALSE, результат работы {foreach} не будет отображен. Если присутствует директива {foreachelse}, её содержимое будет отображено.

.total

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.

Comments
No comments for this page.

Advertisement

Sponsors [info]

Sponsors