web-dev-qa-db-ja.com

Smarty変数をインクリメントするにはどうすればよいですか?

私は通常Smartyの人ではないので、少し行き詰まっています。

配列のインデックスをエコーし​​たいのですが、エコーするたびにインクリメントしたいと思います。

これは私が持っているものです...

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

動作しません。

Smartyに渡す前に配列を前処理するためにこれを行う最良の方法はありますか?

Smartyを使用してこれを行う方法はありますか?

13
alex

次のようなことができます。

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

ゼロから始まり、indexは現在の配列インデックスです。

これはおそらく最善の方法ですが、foreachループの外側で counter を使用するには、次のようにcounterを使用できます。

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

インクリメントするには、反復ごとに{counter}を呼び出すだけです。

{counter}
{*Can then use the $count var*}
   {if $count is div by 4}
      {*do stuff*}
   {/if}
23
Russell Dias

それがsmarty2の場合(使用しているforeach構文からは次のようになります)、foreachループに名前を付けてから、{$smarty.foreach.name.index}を使用できます。

そのようです

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

インデックスはゼロから始まります。1から始まるシーケンスが必要な場合は、.indexの代わりに.iterationを使用してください。

私はしばらくsmartyを使用していませんが、公式ドキュメントには多くの例があり、常に非常に優れていることがわかりました http://www.smarty.net/docsv2/en/language.function.foreach.tpl

3
acqu13sce

インデックスと反復オプションを持つ配列である$ fooを実行すると仮定します

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

最初の列はインデックスの結果であり、2番目の列は反復の結果です

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

これは、インデックスが配列インデックスとして0から始まることを意味します。ここで、反復は1から始まるループ反復カウントです。

間違った値を使用すると問題が発生する場合は、4行またはその他の量のテーブルに何かを表示する場合です。

indexを使用すると、テーブルのレイアウトが不適切になります。ループの最初の反復(インデックス0)ですぐに行が変更され、5番目の反復(インデックス4)で自動的に修正されますが、現在のレイアウトのスコープ内でのみ、最初の行には1つのセルしかありません。それ。 1行おきに4つのセルがあり、最初の行の後のすべてのセルのデータが、本来より4セル遅れてテーブルに表示されます。

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

iterationを使用すると、行の変更が適切にレイアウトされ、最後の反復またはforeachループまで4の等しい行が与えられます。

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

Foreachループの後に、テーブル行を近くに追加するだけで、最終行が完成します。

これが誰かの助けになることを願っています。

0
Chris

$index++エコーの後にインクリメントしますか?

try ++$index;または$index++エコーする前に。

0
AnthonyHurst

{counter}を使用できます

{counter}は、カウントを出力するために使用されます。 {counter}は、各反復のカウントを記憶します。カウントの数、間隔、方向を調整したり、値を出力するかどうかを決定したりできます。それぞれに一意の名前を指定することにより、複数のカウンターを同時に実行できます。名前を指定しない場合は、「デフォルト」という名前が使用されます

ソース: http://www.smarty.net/docsv2/en/language.function.counter.tpl

使用法 :

{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>
0
{foreach from=$foo item=bar name=humbug}  
{$smarty.foreach.humbug.index}
{$smarty.foreach.humbug.iteration}
{/foreach}

または

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