2016-05-27 22 views
5

Silverstripeには、ループ内の最初と最後の項目、およびループ内の現在の項目の位置/カウントを取得するヘルパーがあります。ループ内の最後の項目を取得する方法

私はそれが最後の項目に2番目だ時にキャプチャする方法を見つけることはできませんが...

私は、このような

など些細なもの(通常、ほとんどの言語で働くのだ )を試してみました
<!-- Right now I know the total is 11, so result should be 10 --> 
<!-- Total value will always vary so needs to be dynamically worked out --> 

<% if $Pos == $TotalItems-1 %> 
    $Pos 
<% end_if %> 

    && 

<% if $Last-1 %> 
    $Pos 
<% end_if %> 

これは動作しません。AFAIKはJavaScriptやPHPと異なり、ループ/配列内の最後の2番目の項目を取得するために-1をスラップできません。

これを達成するには何が必要ですか?

答えて

5

これには$FromEndを使用できます。リストの終わりまでの距離が返されます。デフォルトでは、これは$Posと同じ方法で1で始まります。リストの最後の項目は$FromEnd == 1です。リストの2番目の最後の項目は$FromEnd == 2です。

また、開始インデックスをパラメータとして関数に渡すこともできるため、最後の2番目の項目:$FromEnd(0) == 1が選択されます。テンプレートで

、これは次のようになります。

<% if $FromEnd(0) == 1 %> 
<%-- conditional stuff for the second-last item --%> 
<% end_if %> 

<% if $FromEnd(0) < 2 %> 
<%-- conditional stuff for the two last items in a list --%> 
<% end_if %> 

一般的に、私はほとんどこれらのメソッドを使用することはありません。アイテムを適切にフォーマットすることに関連する場合は、代わりにCSSを使用するようアドバイスします(例:nth-childnth-last-of-typeなど)。

+0

ウィッキッド!あなたがこれについて知ったところを尋ねてもいいですか?ドキュメントでそれを見たことがない。最後のビットについては、私もこれまで可能だったCSSをすべて使っていましたが、私はこれを使って単一のループ内に複数のコンテナを作成し、それらの間にデータを分散します。これは、CSSのスタイルではなく、テンプレートの実際の構造を扱っているので、CSSが理想的なものではありません。 – Freemium

+1

@Freemiumああそうだ。私は['SSViewer_BasicIteratorSupport'](http://api.silverstripe.org/3.3/class-SSViewer_BasicIteratorSupport.html)のAPIを見てきました。より複雑なアプローチは、あなた自身の 'TemplateIteratorProvider'を追加することでした。上記の後の@bummzackのために – bummzack

+1

も参照してください。http://stackoverflow.com/questions/14096216/pos-from-bottom-inside-loop-dataobjects – munomono

0

Tnks!そしてそれはまた私のために働いた...

<% if $FromEnd(0) != 0 %> 
    <%-- conditional stuff for all items but the last one in a list --%> 
<% end_if %> 
関連する問題