{section},{sectionelse}
Les balises section sont utilisées pour
parcourir un tableau de données
(tout comme {foreach}).
Toutes les balises {section} doivent être utilisées
de paire avec les balises {/section}. Les paramètres
requis sont name et loop.
Le nom de la {section} est, selon votre choix, composé de lettres,
chiffres et underscores. Les sections peuvent être imbriquées,
mais leurs noms doivent être uniques. La variable de parcours
(généralement un tableau de données) détermine le nombre de fois
que la section sera parcourue. Lorsque l'on affiche une variable
dans une section, le nom de la section doit précéder
la variable entre crochets []. {sectionelse}
est exécuté lorsqu'aucune valeur n'est trouvée dans la variable à
parcourir.
Exemple 7-19. {section}
<?php
$data = array(1000,1001,1002); $smarty->assign('custid',$data);
?>
|
{* Cet exemple affiche toutes les valeurs du tableau $custid *}
{section name=customer loop=$custid}
id: {$custid[customer]}<br />
{/section}
<hr />
{* Affiche toutes les valeurs du tableau $custid dans le sens 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 /> |
Voici d'autres exemples sans tableaux assignés.
{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 |
|
Exemple 7-20. {section}, variable de parcours
<?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);
?>
|
{*
La variable de parcours détermine uniquement le nombre de fois que nous allons
rentrer dans la boucle. Vous pouvez accéder à toutes les variables du template
lorsque vous êtes dans une section. Cet exemple part du principe que
$idClient, $noms et $adresses sont tous des tableaux qui contiennent
autant de valeurs les uns que les autres.
*}
{section name=client loop=$idClient}
id : {$custid[customer]}<br />
nom : {$name[customer]}<br />
addresse : {$address[customer]}<br />
<p>
{/section} |
L'exemple ci-dessus affichera :
<p>
id : 1000<br />
nom : John Smith<br />
addresse : 253 N 45th
</p>
<p>
id : 1001<br />
nom : Jack Jones<br />
addresse : 417 Mulberry ln
</p>
<p>
id : 1002<br />
nom : Jane Munson<br />
addresse : 5605 apple st
</p> |
|
Exemple 7-21. nom de {section} {*
Le nom de la section peut être ce que vous voulez,
et est utilisé pour référencer les données depuis la section.
*}
{section name=monTableau loop=$idClient}
<p>
id: {$idCLient[monTableau]}<br />
name: {$noms[monTableau]}<br />
address: {$addresses[monTableau]}
</p>
{/section} |
|
Exemple 7-22. sections imbriquées
<?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);
?>
|
{*
Les sections peuvent être imbriquées à un nombre de niveaux illimité.
Grâce aux sections imbriquées, vous pouvez accéder à des structures de données
complexes, comme des tableaux multi-dimentionnels. Dans cet exemple,
$type_contact[client] est un tableau de type de contact pour le client
courant.
*}
{section name=client loop=$idClient}
<hr />
id: {$idClient[client]}<br />
nom: {$nom[client]}<br />
addresse: {$addresse[client]}<br />
{section name=contact loop=$type_contact[client]}
{$type_contact[client][contact]}: {$info_contact[client][contact]}<br />
{/section}
{/section} |
L'exemple ci-dessus affichera :
<hr />
id: 1000<br />
nom: John Smith<br />
addresse: 253 N 45th<br />
telephone: 555-555-5555<br />
telephone portable: 555-555-5555<br />
e-mail: john@myexample.com<br />
<hr />
id: 1001<br />
nom: Jack Jones<br />
addresse: 417 Mulberry ln<br />
telephone: 555-555-5555<br />
telephone portable: 555-555-5555<br />
e-mail: jack@myexample.com<br />
<hr />
id: 1002<br />
nom: Jane Munson<br />
addresse: 5605 apple st<br />
telephone: 555-555-5555<br />
telephone portable: 555-555-5555<br />
e-mail: jane@myexample.com<br />
<hr /> |
|
Exemple 7-23. Sections et tableaux associatifs
<?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);
?>
|
{*
Exemple d'affichage d'un tableau associatif dans une section
*}
{section name=client loop=$contacts}
<p>
nom: {$contacts[client].name}<br />
telephone: {$contacts[client].home}<br />
portable: {$contacts[client].cell}<br />
e-mail: {$contacts[client].email}
</p>
{/section} |
L'exemple ci-dessus affichera :
<p>
nom: John Smith<br />
telephone: 555-555-5555<br />
portable: 555-555-5555<br />
e-mail: john@myexample.com
</p>
<p>
nom: Jack Jones<br />
telephone: 555-555-5555<br />
portable: 555-555-5555<br />
e-mail: jack@myexample.com
</p>
<p>
nom: Jane Munson<br />
telephone: 555-555-5555<br />
portable: 555-555-5555<br />
e-mail: jane@myexample.com<p>
</p> |
|
Exemple avec une base de données (eg. en utilisant Pear ou Adodb)
<?php
$sql = 'select id, name, home, cell, email from contacts'; $smarty->assign('contacts',$db->getAll($sql) );
?>
|
{*
Affiche le résultat de la base de données dans un tableau
*}
<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>
{/section}
</table> |
Exemple 7-24. {sectionelse} {* sectionelse est exécuté s'il n'existe aucune valeur dans idClient *}
{section name=client loop=$idClient}
id: {$idClient[client]}<br />
{sectionelse}
Aucune valeur dans $idClient.
{/section} |
|
Les sections ont leur propre variable de gestion des propriétés.
Elles sont de la forme:
{$smarty.section.sectionname.varname}
Depuis Smarty 1.5.0, la syntaxe pour les propriétés des sections
a été changée de {%sectionname.varname%} à
{$smarty.section.nomSection.nomVariable}. L'ancienne syntaxe est toujours
supportée, mais vous ne verrez que des exemples avec la nouvelle syntaxe
dans le manuel.
index
Index est utilisé pour afficher l'index de parcours courant, commence par
0 (ou l'attribut start s'il est fourni), et s'incrémente de 1 (ou de la valeur
de l'attribut step s'il est fourni).
Note technique :
Si les attributs step et start ne sont pas modifiés, alors index
fonctionne de la même façon que iteration, à l'exception qu'il commence
par 0 plutôt que par 1.
Exemple 7-25. propriété de {section} index {* FYI, $custid[customer.index] et $custid[customer] sont identiques *}
{section name=client loop=$idClient}
{$smarty.section.client.index} id: {$idClient[client]}<br />
{/section} |
L'exemple ci-dessus affichera :
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br /> |
|
index_prev
index_prev est utilisé pour afficher l'index de parcours
précédent de la boucle. Au premier passage, il vaut -1.
index_next
index_next est utilisé pour afficher la valeur théorique suivante de
index. Dans la dernière boucle, celà reste la valeur incrémentée,
qui respecte l'attribut step si donné.
Exemple 7-26. propriété de {section} index_next et index_prev
<?php
$data = array(1001,1002,1003,1004,1005); $smarty->assign('custid',$data);
?>
|
{* FYI, $custid[cus.index] et $custid[cus] 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=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> |
L'exemple ci-dessus affichera :
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 est utilisé pour afficher la valeur courante de l'iteration.
NOTE: Cette valeur n'est pas affectée par les attributs start, step et
max, à l'inverse de la propriété index.
L'itération commence par
1 et non par 0 (comme le fait index). rownum est un alias de iteration,
ils fonctionnent de la même façon.
Exemple 7-27. propriété iteration de {section}
<?php
// Tableau de 3000 à 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} |
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 /> |
Cet exemple utilise la propriété iteration pour afficher
un block d'en-tête de tableau toutes les cinq lignes
(utilisez {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> |
|
first
first est à true lorsque la section est parcouru pour la première fois.
last
last est à true lorsque la section est parcourue pour la dernière fois.
Exemple 7-28. Propriété last et first de {section}
Cet exemple boucle le tableau $customers ;
affiche un block d'en-tête lors de la première itération et,
à la dernière, affiche un block de pied de page
(utilisation de 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
rownum, utilisé pour afficher la valeur courante de l'itération,
commence par 1. C'est un alias de iteration, ils fonctionnent de façon
identique.
loop
loop est utilisé pour afficher la dernière valeur de index que cette
section a utilisé. Peut être utilisé dans ou en dehors de la section.
Exemple 7-29. Propriété de {section} index {section name=client loop=$idClient}
{$smarty.section.client.index} id: {$idClient[client]}<br />
{/section}
Il y eu {$smarty.section.client.loop} clients d'affichés. |
L'exemple ci-dessus affichera :
0 id: 1000<br />
1 id: 1001<br />
2 id: 1002<br />
Il y eu 3 clients d'affichés. |
|
show
show est utilisé comme paramètre de section.
show est une valeur booléenne, true ou false.
Si show est à "false", la section ne sera pas affichée. Si un
{sectionelse} est présent, elle sera affichée.
Exemple 7-30. {section}, attribut show {*
$show_client_info a pu être passé par le script PHP,
pour déterminer si oui ou non on souhaite afficher la section
*}
{section name=client loop=$idClient show=$show_client_info}
{$smarty.section.client.rownum} id: {$idClient[client]}<br />
{/section}
{if $smarty.section.client.show}
la section a été affichée.
{else}
la section n'a pas été affichée.
{/if} |
L'exemple ci-dessus affichera :
1 id: 1000<br />
2 id: 1001<br />
3 id: 1002<br />
la section a été affichée. |
|
total
total est utilisé pour afficher le nombre d'itération que la section
va exécuter. Peut être utilisé dans ou en dehors de la section.
Exemple 7-31. {section}, propriété total {section name=client loop=$idClient step=2}
{$smarty.section.client.index} id: {$idClient[client]}<br />
{/section}
Il y eu {$smarty.section.client.total} clients affichés. |
L'exemple ci-dessus affichera :
0 id: 1000<br />
2 id: 1001<br />
4 id: 1002<br />
Il y eu 3 clients affichés. |
|
Voir aussi
{foreach} et
$smarty.section.