2011-01-05 13 views
13

Zazwyczaj nie jestem facetem Smarty'ego, więc trochę utknąłem.Jak mogę zwiększyć zmienną Smarty?

Chcę echo indeks tablicy, ale chcę go zwiększyć za każdym razem, gdy echo to.

To jest to, co mam ...

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

To nie działa.

Czy jest to najlepszy sposób na wstępne przetworzenie macierzy przed przekazaniem jej Smarty?

Czy mogę to zrobić za pomocą Smarty?

+2

Ale skoro masz 'index' z pętli foreach, masz na myśli, że to jest po prostu od 1? – mario

+0

@mario Tak, właśnie tego chcę. – alex

+0

Można również użyć '{counter start = 1}' zamiast indeksu. – mario

Odpowiedz

23

Można zrobić coś jak następuje:

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

Zaczynając od zera, index jest obecny indeks tablicy.

To chyba najlepszy sposób, aby przejść o tym jednak, aby po prostu użyć counter zewnątrz w foreach pętli można użyć counter, tak:

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

Aby zwiększyć ją po prostu zadzwonić {counter} w każdej iteracji .

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

+1 dzięki Russell! – alex

+0

Co jeśli potrzebuję zwiększyć i zmniejszyć licznik? – Gio2k

+0

Co, jeśli masz więcej foreach na stronie? Zliczanie rozpocznie się ponownie od "0". – karadayi

0

Czy liczba $index++ nie zwiększy go po echo?

try ++$index; lub do $index++ ZANIM to echo.

3

Jeśli to smarty 2 (który od składni foreach używasz to wygląda) można dać pętli foreach nazwę, a następnie użyć {$smarty.foreach.name.index}

podobnie jak

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

Rozpocznie indeksowych na zero, jeśli chcesz sekwencji, która zaczyna się od 1 użyj .iteration zamiast .index

Nie używałem smarty już od jakiegoś czasu, ale zawsze uważałem, że oficjalna dokumentacja jest bardzo dobra z wieloma przykładami http://www.smarty.net/docsv2/en/language.function.foreach.tpl

0

Zakładając, że prowadzony przez $ foo, który jest tablicą z opcji indeksowych i iteracji

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

W pierwszej kolumnie są wyniki Indeksu, druga kolumna są wyniki iteracji

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

Oznacza to, że indeks zaczyna się od 0 jako indeks tablicy, gdzie w iteracji jest liczba iteracji pętli rozpoczynająca się od 1.

Instancja, w której użycie niewłaściwej wartości spowodowałoby problemy, powoduje wyświetlenie czegoś w wierszach 4 lub dowolnej innej wielkości w tabeli.

Korzystanie z indeksu spowodowałoby źle rozłożoną tabelę. Otrzymasz natychmiastową zmianę wiersza w pierwszej iteracji pętli (indeks 0), która poprawiłaby się w piątej iteracji (indeks 4), ale tylko w zakresie bieżącego układu, co oznacza, że ​​twój pierwszy wiersz miałby tylko 1 komórkę w to. każdy inny wiersz miałby 4 komórki, a dane w każdej komórce po pierwszym wierszu pojawiłyby się w komórce tabeli 4 później niż powinno.

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

Korzystanie iteracja byłoby rozłożyć zmianę wiersza prawidłowo dając równe rzędy 4 do ostatniej iteracji lub pętli foreach.

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

Po pętli foreach wystarczy dodać wiersz tabeli bliżej, aby ukończyć ostatni wiersz.

Mam nadzieję, że to pomoże komuś.

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

lub

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

Można użyć {counter}

{counter} służy do wydrukowania liczyć. {counter} zapamięta liczbę na każdej iteracji. Możesz ustawić liczbę, interwał i kierunek liczenia, a także określić, czy chcesz wydrukować wartość, czy nie. Możesz uruchomić wiele liczników jednocześnie przez , podając unikalną nazwę dla każdego z nich. Jeśli nie dostarczy nazwy, nazwa „default” zostaną wykorzystane

źródło: http://www.smarty.net/docsv2/en/language.function.counter.tpl

Zastosowanie:

{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>