{section},{sectionelse}

Секции используются для обхода массивов данных (так же, как и {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>&nbsp;</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

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

index_prev используется для отображения предыдущего индекса цикла На первой итерации он установлен в -1.

index_next

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

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>&nbsp;</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.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

rownum используется для отображения текущего номера итерации цикла, начиная с единицы. Это синоним свойства iteration, они работа идентично.

loop

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 используется в качестве параметра секции. 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

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.

    Поддержать сайт на родительском проекте КГБ