2016-05-27 6 views
5

Silverstripe hat Helfer, um das erste und letzte Element in einer Schleife zu erhalten, sowie die Position/Anzahl des aktuellen Elements in der Schleife. Wie kommt man zum zweitletzten Element in der Schleife?

Obwohl ich kann nicht finden, wie zu erfassen, wenn es die vorletzte Punkt ist ...

Ich habe triviale Dinge ausprobiert (, die in der Regel in den meisten Sprachen hatten arbeiten) wie

<!-- 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 %> 

Dies funktioniert nicht, AFAIK im Gegensatz zu JavaScript oder PHP oder was auch immer Sie nicht eine -1 schlagen können, um das zweitletzte Element in einer Schleife/Array zu erhalten.

Was müsste ich tun, um dies zu erreichen?

Antwort

5

Sie können $FromEnd dafür verwenden. Es wird die Entfernung bis zum Ende einer Liste zurückgeben. Standardmäßig beginnt dies mit 1, genauso wie es $Pos tut. Das letzte Element in einer Liste ist also $FromEnd == 1. Das vorletzte Element in einer Liste wäre $FromEnd == 2.

Sie können den Startindex auch als Parameter an die Funktion übergeben, so dass auch der vorletzte Eintrag ausgewählt wird: $FromEnd(0) == 1.

in Ihrer Vorlage, würde dies wie folgt aussehen:

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

Im Allgemeinen habe ich fast nie diese Methoden verwenden. Wenn es um die korrekte Formatierung von Elementen geht, rate ich stattdessen, stattdessen CSS zu verwenden (zB nth-child, nth-last-of-type usw.).

+0

Wicked! Darf ich fragen, wo Sie davon erfahren haben? Habe es noch nie in der Dokumentation gesehen. In Bezug auf das letzte Bit - ich auch CSS alles wo immer möglich, aber ich benutze dies um mehrere Container in einer einzigen Schleife zu erstellen und Daten über sie zu verteilen; CSS ist also nicht ideal, da ich mit der tatsächlichen Struktur der Vorlage arbeite, nicht mit deren Stil. – Freemium

+1

@Freemium Ah ich sehe. Ich habe die API von ['SSViewer_BasicIteratorSupport'] (http://api.silverstripe.org/3.3/class-SSViewer_BasicIteratorSupport.html) angeschaut. Der komplexere Ansatz wäre gewesen, einen eigenen 'TemplateIteratorProvider' – bummzack

+1

für den späteren @ bummzack hinzuzufügen, siehe auch http://stackoverflow.com/questions/14096216/pos-from-bottom-inside-loop-dataobjects – munomono

0

Tnks! Und es hat auch für mich funktioniert ...

<% if $FromEnd(0) != 0 %> 
    <%-- conditional stuff for all items but the last one in a list --%> 
<% end_if %> 
Verwandte Themen