Freemarker: Liste aus gruppierten Zeilen, Zugriff auf vorletztes Element

Hallo,

kurze Frage:


Ich gruppiere mir einen PlentyGetOrderStatusHistory nach OrderID, und liste dabei die verschiedenen Status in der Gruppierung alle semikolon-getrennt auf.

3.0;0.0;5.0;5.02;5.01;5.09;5.0;5.02;5.04;8.0


Ich will jetzt das vorletzte Element ermitteln (und auf eine andere Spalte vergleichen), wie gehe ich am besten vor?


Spontan versucht habe ich es mit:

<#assign statuslist>
<#list StatusID?split(";") as status>
${status};
</#list></#assign>
statuslist.[-1]

...aber das schluckt er nicht. Könnt ihr mir auf die Sprünge helfen?

Grüße Daniel

Im Grunde will ich nur abfangen, dass wenn ich einen Status in Synesty ändere, und während der Laufzeit sich in Plenty der Status wieder ändert, ich das überschreibe (weil die API so lahm ist).


Eine bessere Lösung hab ich dazu nicht gefunden, wenns da ein besseres best-practice gibt, nehm ich natürlich auch das ;-)

Die negativen Indices aus Python gibt es leider nicht, vermisse die auch. Du musst mit der size-Funktion arbeiten, sieht in deinem Falle so aus:

statuslist[statuslist?size-2]

Hier ein kurzes Beispiel: https://apps.synesty.com/transformy?m=5dc3e640d6ce4dcf8f06067cbbe4601b

Zur Best-Practice: Soweit ich weiß, ist in solchen Fällen das beste, den Flow häufig auszuführen und in jeder Flowausführung nur einen OrderStatus zu verarbeiten. Dadurch minimiert man die Chance, dass sich während der Verarbeitung etwas am Status ändert. Das ist natürlich nicht immer möglich und kostet eine ganze Menge an Flowruns.

Vielleicht hat das Synesty-Team noch einen besseren Vorschlag.

Hallo Daniel,


du hast hier einen kleinen Denkfehler gemacht.


Wenn du per <#list>${value}</#list> etwas schreibst, kommt ein String raus. Der String ist hier somit kein Array auf dem du zugreifen kannst per [-1]. Um also auf das Array zuzugreifen kannst du das direkt per assign speichern ohne da vorher durch zu iterieren.

Soweit ich weiß ist [-1] keine Valide expression, zumindest sehe ich dazu nichts in der Freemarker Doku.

Versuch es doch stattdessen so wie von Gustav vorgeschlagen hiermit:

<#assign status = StatusID?split(";")>
<#if status?size gte 2>${status[status?size -2]}</#if>

Beachte hierbei noch, dass es eventuell kein vorletztes Element gibt.


Viele Grüße

Stefan Helme