What is Smarty?
Why use it?
Use Cases and Work Flow
Syntax Comparison
Template Inheritance
Best Practices
Crash Course
You may use the Smarty logo according to the trademark notice.
For sponsorship, advertising, news or other inquiries, contact us at:
Une {section}
sert à boucler dans des tableaux de données,
contrairement à {foreach}
qui est utilisé pour boucler dans un
simple tableau associatif.
Chaque balise {section}
doit aller de paire avec une
balise {/section}
fermante.
Nom attribut | Type | Requis | Défaut | Description |
---|---|---|---|---|
name | chaîne de caractère | Oui | n/a | Le nom de la section |
loop | mixed | Oui | n/a | Valeur qui détermine le nombre de fois que la boucle sera exécutée |
start | entier | Non | 0 | La position de l'index ou la section commencera son parcours. Si la valeur donnée est négative, la position de départ est calculée depuis la fin du tableau. Par exemple, s'il existe 7 valeurs dans le tableau à parcourir et que start est à -2, l'index de départ sera 5. Les valeurs incorrectes (en dehors de la portée du tableau) sont automatiquements tronquées à la valeur correcte la plus proche |
step | entier | Non | 1 | La valeur du pas qui sera utilisé pour parcourir le tableau.Par exemple, step=2 parcourera les indices 0,2,4, etc. Si step est négatif, le tableau sera parcouru en sens inverse |
max | entier | Non | n/a | Définit le nombre maximum de fois que le tableau sera parcouru |
show | booléen | No | TRUE |
Détermine s'il est nécessaire d'afficher la section ou non |
Les paramètres requis sont name
et loop
.
Le name
de la {section}
est, selon votre choix,
composé de lettres, chiffres et underscores, comme pour les
variables PHP.
Les sections peuvent être imbriquées mais leurs noms doivent être uniques.
L'attribut loop
, habituellement un tableau de valeurs,
détermine le nombre de fois que
{section}
doit boucler.
Lors de l'affichage d'une variable dans une {section}
, le nom de la
{section}
doit être fournis après le nom de la variable entre crochets [].
{sectionelse}
est exécuté lorsqu'aucune valeur n'est trouvée dans la variable à
parcourir.
{section}
a également ces propres variables qui gérent les propriétés
de la {section}
.
Ces propriétés sont accessibles comme ceci :
{$smarty.section.name.property}
où “name” est l'attribut name
.
Les propriétés de {section}
sont
index
,
index_prev
,
index_next
,
iteration
,
first
,
last
,
rownum
,
loop
,
show
,
total
.
Example 7.30. Boucler dans un simple tableau avec {section}
assign()
un tableau à Smarty
<?php $data = array(1000,1001,1002); $smarty->assign('custid',$data); ?>
Le template qui affiche le tableau
{* Cet exemple affichera toutes les valeurs du tableau $custid *} {section name=customer loop=$custid} id: {$custid[customer]}<br /> {/section} <hr /> {* Affiche toutes les valeurs du tableau $custid, en ordre inverse *} {section name=foo loop=$custid step=-1} {$custid[foo]}<br /> {/section}
L'exemple ci-dessus affichera :
id: 1000<br /> id: 1001<br /> id: 1002<br /> <hr /> id: 1002<br /> id: 1001<br /> id: 1000<br />
Example 7.31. {section} sans un tableau assigné
{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}
L'exemple ci-dessus affichera :
10 12 14 16 18 <hr /> 20 18 16 14 12 10
Example 7.32. Nommage d'une {section}
Le name
de la {section}
peut être ce que vous
voulez, voir les variables PHP.
Il sera utilisé pour référencer les données de la {section}
.
{section name=anything loop=$myArray} {$myArray[anything].foo} {$name[anything]} {$address[anything].bar} {/section}
Example 7.33. Boucler dans un tableau associatif avec {section}
Voici un exemple d'affichage d'un tableau associatif de données avec
{section}
. Ce qui suit est le script PHP assignant
le tableau $contacts
à Smarty.
<?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); ?>
Le template pour afficher $contacts
{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}
L'exemple ci-dessus affichera :
<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} démontrant l'utilisation de la variable loop
Cet exemple suppose que $custid
, $name
et $address
sont tous des tableaux contenant le même
nombre de valeurs. Tout d'abord, le script PHP qui assigne les tableaux à Smarty.
<?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 Abbey road', '417 Mulberry ln', '5605 apple st'); $smarty->assign('address',$addr); ?>
La variable loop
détermine uniquement le nombre
de fois qu'il faut boucler.
Vous pouvez accéder à n'importe quelle variable du template dans la
{section}
{section name=customer loop=$custid} <p> id: {$custid[customer]}<br /> name: {$name[customer]}<br /> address: {$address[customer]} </p> {/section}
L'exemple ci-dessus affichera :
<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. {section} imbriquée
Les sections peuvent être imbriquées autant de fois que vous le voulez. Avec les sections imbriquées, vous pouvez accéder aux structures de données complexes, comme les tableaux multi-dimentionnels. Voici un script PHP qui assigne les tableaux.
<?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); ?>
Dans ce template, $contact_type[customer] est un tableau de types de contacts.
{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}
L'exemple ci-dessus affichera :
<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.36. Exemple avec une base de données et {sectionelse}
Les résultats d'une recherche dans une base de données (e.g. ADODB ou PEAR) sont assignés à Smarty
<?php $sql = 'select id, name, home, cell, email from contacts ' ."where name like '$foo%' "; $smarty->assign('contacts', $db->getAll($sql)); ?>
Le template pour afficher le résultat de la base de données dans un tableau HTML
<table> <tr><th> </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> {sectionelse} <tr><td colspan="5">Aucun élément n'a été trouvé</td></tr> {/section} </table>
index
contient l'index courant du tableau, en commençant par zéro ou par
start
s'il est fourni. Il s'incrémente d'un en un ou de
step
s'il est fourni.
Si les propriétés step
et start
ne sont pas modifiés, alors le fonctionnement est le même que celui de la propriété
iteration
,
mise à part qu'il commence à zéro au lieu de un.
Example 7.37. Exemple avec la propriété index
$custid[customer.index]
et
$custid[customer]
sont identiques.
{section name=customer loop=$custid} {$smarty.section.customer.index} id: {$custid[customer]}<br /> {/section}
L'exemple ci-dessus affichera :
0 id: 1000<br /> 1 id: 1001<br /> 2 id: 1002<br />
index_next
est l'index de la prochaine boucle.
Lors de la prochaine boucle, il vaudra un de moins que l'index courant, suivant
la configuration de l'attribut step
, s'il est fourni.
Example 7.38. Exemple avec les propriétés index
, index_next
et index_prev
<?php $data = array(1001,1002,1003,1004,1005); $smarty->assign('rows',$data); ?>
Le template pour afficher le tableau ci-dessus dans un tableau HTML
{* $rows[row.index] et $rows[row] sont identiques *} <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=row loop=$rows} <tr> <td>{$smarty.section.row.index}</td><td>{$rows[row]}</td> <td>{$smarty.section.row.index_prev}</td><td>{$rows[row.index_prev]}</td> <td>{$smarty.section.row.index_next}</td><td>{$rows[row.index_next]}</td> </tr> {/section} </table>
L'exemple ci-dessus affichera un tableau HTML contenant :
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
contient l'itération courante de la boucle et commence à un.
Ceci n'est pas affecté par les propriétés {section}
start
, step
et
max
contrairement à la propriété
index
.
iteration
commence également à un au lieu de zéro
contrairement à index
.
rownum
est un alias de iteration
, ils sont identiques.
Example 7.39. Exemple avec la propriété iteration
<?php // array of 3000 to 3015 $id = range(3000,3015); $smarty->assign('arr',$id); ?>
Le template pour afficher tous les autres éléments du tableau $arr
comme
step=2
{section name=cu loop=$arr start=5 step=2} iteration={$smarty.section.cu.iteration} index={$smarty.section.cu.index} id={$custid[cu]}<br /> {/section}
L'exemple ci-dessus affichera :
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 />
Un autre exemple d'utilisation de la propriété
iteration
est d'afficher un bloc d'en-tête d'un tableau toutes
les 5 lignes.
Utilisez la fonction {if}
avec l'opérateur mod.
<table> {section name=co loop=$contacts} {if $smarty.section.co.iteration % 5 == 1} <tr><th> </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>
last
est défini à TRUE
si l'itération courante de la section est la dernière.
Example 7.40. Exemple avec les propriétés first
et last
Cet exemple boucle sur le tableau $customers
,
affiche un bloc d'en-tête lors de la première itération et, lors de la dernière,
affiche un bloc de pied de page. Utilise aussi la propriété
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
contient l'itération courante de la boucle,
commençant à un. C'est un alias de iteration
,
ils fonctionnent exactement de la même façon.
loop
contient le dernier index de la boucle de la section.
Il peut être utilisé dans ou après la {section}
.
Example 7.41. Exemple avec la propriété loop
{section name=customer loop=$custid} {$smarty.section.customer.index} id: {$custid[customer]}<br /> {/section} There are {$smarty.section.customer.loop} customers shown above.
L'exemple ci-dessus affichera :
0 id: 1000<br /> 1 id: 1001<br /> 2 id: 1002<br /> There are 3 customers shown above.
show
est utilisé en tant que paramètre à la section et est une valeur booléenne.
S'il vaut FALSE
, la section ne sera pas affichée. S'il y a un
{sectionelse}
, il sera affiché de façon alternative.
Example 7.42. Exemple avec la propriété show
Une valeur booléenne $show_customer_info
est passée
depuis l'application PHP, pour réguler l'affichage ou non de cette section.
{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}
L'exemple ci-dessus affichera :
1 id: 1000<br /> 2 id: 1001<br /> 3 id: 1002<br /> the section was shown.
total
contient le nombre d'itérations que cette
{section}
bouclera. Il peut être utilisé dans ou après une
{section}
.
Example 7.43. Exemple avec la propriété total
{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.
Voir aussi
{foreach}
et
$smarty.section
.