2011-01-05 5 views
13

Je ne suis généralement pas un gars Smarty, donc je suis un peu coincé. Je veux renvoyer l'index d'un tableau, mais je veux l'incrémenter chaque fois que je lui fais écho.Comment puis-je incrémenter une variable Smarty?

C'est ce que je ...

<ul> 
    {foreach from=$gallery key=index item=image} 
    <li> 
     <img src="{$image}" alt="" id="panel-{$index++}" /> 
    </li> 
    {/foreach} 
</ul> 

Il ne fonctionne pas.

Est-ce la meilleure façon de procéder pour pré-traiter la baie avant de la transmettre à Smarty?

Y a-t-il un moyen de le faire en utilisant Smarty?

+2

Mais puisque vous obtenez 'index' de la boucle foreach, vous voulez dire que c'est juste par 1 en fait? – mario

+0

@mario Ouais, c'est ce que je veux. – alex

+0

Vous pouvez également utiliser '{counter start = 1}' à la place de l'index. – mario

Répondre

23

Vous pouvez faire quelque chose comme ce qui suit:

<ul> 
    {foreach from=$gallery key=index item=image name=count} 
    <li> 
     <img src="{$image}" alt="" id="panel-{$smarty.foreach.count.index}" /> 
    </li> 
    {/foreach} 
</ul> 

À partir de zéro, index est l'indice courant de tableau.

C'est probablement la meilleure façon de s'y prendre, cependant, d'utiliser simplement une counter en dehors d'une boucle foreach vous pouvez utiliser counter, comme ceci:

{counter start=0 skip=1 assign="count"} 

Pour incrémenter il suffit d'appeler {counter} à chaque itération .

{counter} 
{*Can then use the $count var*} 
    {if $count is div by 4} 
     {*do stuff*} 
    {/if} 
+1

+1 merci Russell! – alex

+0

Et si je dois incrémenter et décrémenter le compteur? – Gio2k

+0

Et si vous en avez plus d'une sur une page? Le comptage commencera à partir de '0' à nouveau. – karadayi

0

le $index++ ne l'incrémenterait-il pas après l'écho? Ou $index++ AVANT de vous faire écho.

3

Si c'est Smarty 2 (qui, de la syntaxe foreach vous l'utilisez ressemble), vous pouvez donner la boucle foreach un nom puis utilisez {$smarty.foreach.name.index}

comme tant

<ul> 
    {foreach from=$gallery key=index item=image name=foo} 
    <li> 
     <img src="{$image}" alt="" id="panel-{$smarty.foreach.foo.index}" /> 
    </li> 
    {/foreach} 
</ul> 

L'indice commence à zéro, si vous voulez une séquence qui commence à 1 utiliser .iteration au lieu de .index

Je n'ai pas utilisé smarty depuis un bon moment maintenant mais j'ai toujours trouvé la documentation officielle très bonne avec beaucoup d'exemples http://www.smarty.net/docsv2/en/language.function.foreach.tpl

0

En supposant que vous exécutez par foo $, ce qui est un tableau avec les options d'index et l'itération

{foreach from=$foo item=bar name=humbug} 
    {$smarty.foreach.humbug.index} 
    {$smarty.foreach.humbug.iteration} 
{/foreach} 

La première colonne sont les résultats de l'indice, la deuxième colonne sont les résultats d'itération

0 - 1 
1 - 2 
2 - 3 
3 - 4 
4 - 5 

Cela signifie que l'index commence à 0 en tant qu'indice de tableau, alors que l'itération est le nombre d'itérations de la boucle qui commence à 1.

Une instance dans laquelle l'utilisation d'une valeur incorrecte entraînerait des problèmes consiste à afficher quelque chose dans des lignes de 4 ou toute autre quantité dans une table.

L'utilisation de index provoquerait une table mal agencée. Vous obtiendrez un changement de ligne immédiat sur la première itération de la boucle (index 0) qui se corrigera à la 5ème itération (index 4) mais uniquement dans le cadre de la disposition actuelle, ce qui signifie que votre première rangée ne comportera qu'une seule cellule il. chaque autre rangée aurait 4 cellules et les données dans chaque cellule après la première rangée apparaîtraient dans les cellules de la table 4 plus tard que ce qu'elle devrait faire.

{if $smarty.foreach.humbug.index is div by 4} 
    </tr><tr> 
{/if} 

utilisant itération définirait le changement de ligne donnant correctement rangées égales de 4 jusqu'à ce que la dernière itération ou la boucle foreach. Après la boucle foreach, vous devez simplement ajouter une ligne de table plus proche pour terminer la dernière ligne.

J'espère que cela aide quelqu'un.

0
{foreach from=$foo item=bar name=humbug} 
{$smarty.foreach.humbug.index} 
{$smarty.foreach.humbug.iteration} 
{/foreach} 

ou

{foreach from=$foo item=bar name=berlin} 
{$smarty.foreach.berlin.index} 
{$smarty.foreach.berlin.iteration} 
{/foreach} 
0

Vous pouvez utiliser {counter}

{counter} est utilisé pour imprimer un compteur. {counter} se souviendra du nombre de à chaque itération. Vous pouvez ajuster le nombre, l'intervalle et la direction du nombre, ainsi que déterminer si imprimer la valeur ou non. Vous pouvez exécuter plusieurs compteurs simultanément par en fournissant un nom unique pour chacun d'eux. Si vous ne donnez pas de nom, le nom « par défaut » sera utilisé

source: http://www.smarty.net/docsv2/en/language.function.counter.tpl

Utilisation:

{counter start=0 print=false assign="count"} 

<ul> 
{foreach from=$listing.products item="product"} 
    {counter} 
    {if $count === 1} 
    <p>Count is 1</p> 
    {/if} 
{/foreach} 
</ul> 
Questions connexes