2016-05-27 46 views
5

Silverstripe dispone di helper per ottenere il primo e l'ultimo elemento in un loop e la posizione/conteggio dell'elemento corrente nel loop.Come ottenere il penultimo elemento in loop

Anche se non riesco a trovare come scattare quando è la penultima voce ...

ho provato cose banali (che aveva di solito lavorano nella maggior parte delle lingue) come

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

Questo non funziona, AFAIK a differenza di JavaScript o PHP o qualsiasi altra cosa non è possibile schiacciare un -1 per ottenere il penultimo oggetto in un loop/array.

Cosa dovrei fare per ottenere questo risultato?

risposta

5

È possibile utilizzare $FromEnd per quello. Restituirà la distanza alla fine di una lista. Per impostazione predefinita, questo inizia con 1, allo stesso modo di $Pos. Quindi l'ultimo elemento in una lista è $FromEnd == 1. Il penultimo elemento di una lista sarebbe $FromEnd == 2.

È anche possibile passare l'indice iniziale come parametro alla funzione, quindi selezionare anche il penultimo elemento: $FromEnd(0) == 1.

Nel modello, questo sarebbe simile a questa:

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

In generale, ho quasi mai usato questi metodi. Se è correlato alla formattazione corretta degli articoli, consiglio di utilizzare CSS invece (ad esempio nth-child, nth-last-of-type ecc.).

+0

Wicked! Posso chiederti dove hai scoperto di questo? Non l'ho mai visto nei documenti. Per quanto riguarda l'ultimo bit - anche io CSS tutto ciò è sempre possibile ma sto usando questo per creare più contenitori all'interno di un singolo ciclo e diffondere i dati tra di loro; quindi questo non è qualcosa per cui CSS sarebbe l'ideale perché sto lavorando con la struttura attuale del modello, non con il suo stile. – Freemium

+1

@Freemium Ah capisco. Ho esaminato l'API di ['SSViewer_BasicIteratorSupport'] (http://api.silverstripe.org/3.3/class-SSViewer_BasicIteratorSupport.html). L'approccio più complesso sarebbe stato quello di aggiungere il proprio 'TemplateIteratorProvider' – bummzack

+1

per il successivo @bummzack citato vedi anche http://stackoverflow.com/questions/14096216/pos-from-bottom-inside-loop-dataobjects – munomono

0

Tnks! E ha funzionato anche per me ...

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