A {section}
is for looping over arrays of data,
unlike {foreach}
which is used to loop over a
single associative array.
Every {section} tag must be paired with
a closing {/section} tag.
Attribute Name
Type
Required
Default
Description
name
string
Yes
n/a
The name of the section
loop
mixed
Yes
n/a
Value to determine the number of loop iterations
start
integer
No
0
The index
position that the section will begin looping. If the
value is negative, the start position is calculated
from the end of the array. For example, if there are
seven values in the loop array and start is -2, the
start index is 5. Invalid values (values outside of the
length of the loop array) are automatically truncated
to the closest valid value.
step
integer
No
1
The step value that will be used to traverse the
loop array. For example, step=2 will loop on index
0,2,4, etc. If step is negative, it will step through
the array backwards.
max
integer
No
n/a
Sets the maximum number of times the section
will loop.
show
boolean
No
TRUE
Determines whether or not to show this section
Required attributes are name and loop.
The name of the {section} can be
anything you like, made up of letters, numbers and underscores, like
PHP variables.
{section}'s can be nested, and the nested
{section} names must be unique from each other.
The loop attribute,
usually an array of values, determines the number of times the
{section} will loop. You can also pass an integer
as the loop value.
When printing a variable within a {section}, the
{section}name must be given next
to variable name within [brackets].
{sectionelse} is
executed when there are no values in the loop variable.
A {section} also has its own variables that handle
{section} properties.
These properties are accessible as: {$smarty.section.name.property}
where "name" is the attribute name.
{* this example will print out all the values of the $custid array *}
{section name=customer loop=$custid}
id: {$custid[customer]}<br />
{/section}
<hr />
{* print out all the values of the $custid array reversed *}
{section name=foo loop=$custid step=-1}
{$custid[foo]}<br />
{/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>
Example 7-34. {section} demonstrating the loop variable
This example assumes that $custid, $name
and $address are all
arrays containing the same number of values. First the php script that assign's the
arrays to Smarty.
<p>
id: 1000<br />
name: John Smith<br />
address: 253 Abbey road
</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-35. Nested {section}'s
{section}'s can be nested as deep as you like. With nested {section}'s,
you can access complex data structures, such as multi-dimensional
arrays. This is an example .php script thats assign's the arrays.
index contains the current array index, starting with zero
or the start attribute if given. It increments by one or by
the step attribute if given.
Technical Note:
If the step and start
properties are not
modified, then this works the same as the iteration
property, except it starts at zero instead of one.
Example 7-37. {section} index property
FYI: $custid[customer.index] and
$custid[customer] are identical.
index_prev is the previous loop index.
On the first loop, this is set to -1.
.index_next
index_next is the next loop index. On the last
loop, this is still one more than the current index, respecting the
setting of the step attribute, if given.
Example 7-38. index, index_next
and index_prev properties
iteration contains the current loop iteration and starts at one.
Note:
This is not affected by the {section} properties
start, step and max,
unlike the index
property. iteration also starts with one instead of zero
unlike index. rownum is an alias to
iteration, they are identical.
Example 7-39. A section's iteration property
<?php // array of 3000 to 3015 $id = range(3000,3015); $smarty->assign('arr',$id); ?>
Template to output every other element of the $arr
array as step=2
first is set to TRUE if the current
{section} iteration is the initial one.
.last
last is set to TRUE
if the current section iteration is the final one.
Example 7-40. {section} property first and last
This example loops the $customers array,
outputs a header block on the first iteration and
on the last outputs the footer block. Also uses the
total property.
rownum contains the current loop iteration,
starting with one. It is an alias to iteration,
they work identically.
.loop
loop contains the last index number
that this {section}
looped. This can be used inside or after the {section}.
Example 7-41. {section} property loop
{section name=customer loop=$custid}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
There are {$smarty.section.customer.loop} customers shown above.
The above example will output:
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
There are 3 customers shown above.
.show
show is used as a parameter to section and is
a boolean value. If
FALSE, the section will not be displayed. If there is a
{sectionelse} present, that will be alternately displayed.
Example 7-42. show property
Boolean $show_customer_info has been passed from the PHP
application, to regulate whether or not this section shows.
{section name=customer loop=$customers show=$show_customer_info}
{$smarty.section.customer.rownum} id: {$customers[customer]}<br />
{/section}
{if $smarty.section.customer.show}
the section was shown.
{else}
the section was not shown.
{/if}
The above example will output:
1 id: 1000<br />
2 id: 1001<br />
3 id: 1002<br />
the section was shown.
.total
total contains the number of iterations that this
{section} will loop. This can be used inside or after a
{section}.
Example 7-43. total property example
{section name=customer loop=$custid step=2}
{$smarty.section.customer.index} id: {$custid[customer]}<br />
{/section}
There are {$smarty.section.customer.total} customers shown above.