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

{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 Указывает, показывать или нет эту секцию

Example 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

  

Example 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>

  

Example 7.32. именование {section}


{*
  имя секции может быть любым, так как оно используется для обращения к
  данным в пределах секции
*}
{section name=anything loop=$custid}
<p>
    id: {$custid[anything]}<br />
    name: {$name[anything]}<br />
    address: {$address[anything]}
</p>
{/section}

  

Example 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 />

  

Example 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>

  

Example 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}

Note

Начиная с версии Smarty 1.5.0, синтаксис переменных свойств сессий был изменен с {%sectionname.varname%} на {$smarty.section.sectionname.varname}. Старый синтаксис всё ещё поддерживается, но вы увидите лишь примеры нового синтаксиса.

index

index используется для отображения текущего индекса массива, начиная с нуля (или с атрибута start, если он был указан) и увеличиваясь на единицу (или на значение атрибута step, если он был указан).

Техническое Замечание

Если атрибуты step и start не указаны, то index аналогичен атрибуту секции iteration, кроме того, что начинается с 0, а не с 1.

Example 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).

Example 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 используется для отображения текущего номера итерации цикла.

Note

Это значение не зависит от свойств start, step и max, в отличие от свойства index. Кроме того, итерации начинаются с единицы, а не с нуля, как индексы. rownum - это синоним к свойству iteration, они работают одинаково.

Example 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, если текущая итерация секции является последней.

Example 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 используется для отображения последнего номера индекса, по которому проходила итерация секции. Это свойство может быть использовано как внутри, так и вне секции.

Example 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}, вместо этого будет отображена она.

Example 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 используется для отображения количества итераций, через которые пройдет эта секция. Это свойство может быть использовано как внутри, так и вне секции.

Example 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.

Comments
No comments for this page.

Advertisement

Sponsors [info]

Sponsors