{foreach} est utilisé pour parcourir un
simple tableau associatif,
contrairement à {section}
qui effectue une boucle sur les tableaux de données.
La synthaxe pour
{foreach} est plus simple que
{section},
mais ne peut être utilisé que pour des tableau simple.
Chaque {foreach} doit aller de paire avec une balise fermante
{/foreach}.
| Nom attribut | Type | Requis | Defaut | Description |
|---|---|---|---|---|
| from | tableau | oui | n/a | Le tableau à parcourir |
| item | chaîne de caractère | Oui | n/a | Le nom de la variable "élément courant" |
| key | chaîne de caractère | Non | n/a | Le nom de la variable représentant la clef courante. |
| name | chaîne de caractère | Non | n/a | Le nom de la boucle foreach, qui nous permettra d'accéder à ses propriétés. |
Required attributes are
fromanditem.The
nameof the{foreach}loop can be anything you like, made up of letters, numbers and underscores, like PHP variables.{foreach}loops can be nested, and the nested{foreach}names must be unique from each other.The
fromattribute, usually an array of values, determines the number of times{foreach}will loop.{foreachelse}is executed when there are no values in thefromvariable.-
{foreach}loops also have their own variables that handle properties. These are accessed with:{$smarty.foreach.name.property}with “name” being thenameattribute.Note
The
nameattribute is only required when you want to access a{foreach} property, unlike{section}. Accessing a{foreach}property withnameundefined does not throw an error, but leads to unpredictable results instead. {foreach}properties areindex,iteration,first,last,show,total.
Example 7.5. L'attribut item
<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>
Template pour afficher $myArray dans une liste non-ordonnée.
<ul>
{foreach from=$myArray item=foo}
<li>{$foo}</li>
{/foreach}
</ul>
L'exemple ci-dessus affichera :
<ul> <li>1000</li> <li>1001</li> <li>1002</li> </ul>
Example 7.6. Utilisation des attributs item et key
<?php
$arr = array(9 => 'Tennis', 3 => 'Natation', 8 => 'Programmation');
$smarty->assign('myArray', $arr);
?>
Le template affiche le tableau $myArray comme paire clé/valeur,
comme la fonction PHP
foreach.
<ul>
{foreach from=$myArray key=k item=v}
<li>{$k}: {$v}</li>
{/foreach}
</ul>
L'exemple ci-dessus affichera :
<ul> <li>9: Tennis</li> <li>3: Natation</li> <li>8: Programmation</li> </ul>
Example 7.7. {foreach} avec un attribut associatif item
<?php
$items_list = array(23 => array('no' => 2456, 'label' => 'Salad'),
96 => array('no' => 4889, 'label' => 'Cream')
);
$smarty->assign('items', $items_list);
?>
Le template affiche $items avec
$myId dans l'URL.
<ul>
{foreach from=$items key=myId item=i}
<li><a href="item.php?id={$myId}">{$i.no}: {$i.label}</li>
{/foreach}
</ul>
L'exemple ci-dessus affichera :
<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} avec item et key
Assigne un tableau à Smarty, la clé contient la clé pour chaque valeur de la boucle.
<?php
$smarty->assign('contacts', array(
array('phone' => '1',
'fax' => '2',
'cell' => '3'),
array('phone' => '555-4444',
'fax' => '555-3333',
'cell' => '760-1234')
));
?>
Le template affiche $contact.
{foreach name=outer item=contact from=$contacts}
<hr />
{foreach key=key item=item from=$contact}
{$key}: {$item}<br />
{/foreach}
{/foreach}
L'exemple ci-dessus affichera :
<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. Exemple d'une base de données avec {foreachelse}
Exemple d'un script de recherche dans une base de données (e.g. PEAR ou ADODB), le résultat de la requête est assigné à 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) );
?>
Le template qui affiche “None found”
si aucun résultat avec {foreachelse}.
{foreach key=cid item=con from=$results}
<a href="contact.php?contact_id={$cid}">{$con.name} - {$con.nick}</a><br />
{foreachelse}
Aucun élément n'a été trouvé dans la recherche
{/foreach}
index contient l'index courant du tableau, en commançant par zéro.
Example 7.10. Exemple avec index
{* L'en-tête du block est affiché toutes les 5 lignes *}
<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 contient l'itération courante de la boucle et commence
toujours à 1, contrairement à
index.
Il est incrémenté d'un, à chaque itération.
Example 7.11. Exemple avec iteration et index
{* this will output 0|1, 1|2, 2|3, ... etc *}
{foreach from=$myArray item=i name=foo}
{$smarty.foreach.foo.index}|{$smarty.foreach.foo.iteration},
{/foreach}
first vaut TRUE si l'itération courante de
{foreach} est l'initial.
Example 7.12. Exemple avec first
{* affiche LATEST sur le premier élément, sinon, l'id *}
<table>
{foreach from=$items key=myId item=i name=foo}
<tr>
<td>{if $smarty.foreach.foo.first}LATEST{else}{$myId}{/if}</td>
<td>{$i.label}</td>
</tr>
{/foreach}
</table>
last est défini à TRUE si l'itération courante de
{foreach} est la dernière.
Example 7.13. Exemple avec last
{* Ajout une barre horizontale à la fin de la liste *}
{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}
... contenu ...
{/foreach}
show est utilisé en tant que paramètre à {foreach}.
show est une valeur booléenne. S'il vaut
FALSE, {foreach} ne sera pas affiché.
S'il y a un {foreachelse}, il sera affiché alternativement.
total contient le nombre d'itérations que cette boucle
{foreach} effectuera.
Il peut être utilisé dans ou après un {foreach}.
Example 7.14. Exemple avec total
{* affiche les lignes retournées à la fin *}
{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} items</div>
{/if}
{foreachelse}
... quelque chose d'autre ...
{/foreach}
Voir aussi
{section}
et $smarty.foreach.
