TYPO3 – for each Schleife Random Sortierung ausgeben
Leider ist es mit dem normalen TYPO3 Fluid nicht möglich eine for each Schleife als Random Sortierung auszugeben.
Hier benötigen wir die Extension VHS um das Fluid um weitere ViewHelper zu erweitern.
Installiert somit die Extension: VHS
Fügt dann in dem Fluid-Template wo die for each Schleife liegt, den namespace von der Ext:VHS hinzu:
{namespace v=FluidTYPO3\Vhs\ViewHelpers}
Tauscht nun den Fluid „f:for each“ Teil aus:
<f:for each="{addresses->v:iterator.sort(order: 'SHUFFLE', sortBy: 'company')}" as="address" iteration="iterator">
Info: Name der Variable tauschen und den sortBy Feld bearbeiten.
Erklärung:
order
ASC, DESC, RAND or SHUFFLE. RAND preserves keys, SHUFFLE does not – but SHUFFLE is faster
Beispiel/Beschreibung:
https://fluidtypo3.org/viewhelpers/vhs/master/Iterator/SortViewHelper.html
Da die meisten Fluid-Template in den Cache abgelegt werden, solltet Ihr ggf. das Template noch als „uncache“ ausgeben.
Dafür stellt die EXT:VHS einen weiteren VH zur Verfügung: v:render.uncache
Die komplette for:each sieht dann bei mir so aus:
<f:for each="{addresses->v:iterator.sort(order: 'SHUFFLE', sortBy: 'company')}" as="address" iteration="iterator"> <v:render.uncache partial="ListItem" arguments="{_all}"/> </f:for>
Nun sollte sich bei jedem Browser-Reload die Ausgaben unterscheiden.
Eure Meinung zu dem Artikel ist gefragt! Schreibt mir ein Kommentar
Ich freue mich auf einen Blick auf meine Amazon-Wunschliste. Vielen Dank!
Sebastian
Lieber Sebastian,
danke für den Artikel und danke, dass du mich auf dem Laufendem hältst. Ich konnte dadurch eine Menge Neues dazu lernen.
Gruß
TYPO3-Entwickler
Laut Doku des Uncache ViewHelpers wird nur der Inhalt neu gerendert – die zufällige Sortierung über for müsste also mit in das Partial, der Aufruf des Partials innerhalb von for dürfte keine zufällige Ausgabe bei jedem Page Reload erzeugen, sofern Caching an sich aktiv ist.
Zudem finde ich den Ansatz strukturell kritisch – die Steuerung der Sortierung von Daten ist eine typische Controller-Aufgabe und gehört nicht ins Template.
Im Controller hätte man dann auch die Möglichkeit, wenigstens ein kurzzeitiges Caching zu ermöglichen. Seiten mit höherem Traffic haben durch solche Maßnahmen ansonsten eine sehr große Last – hier würde schon eine Caching-Zeit von wenigen Sekunden merklich entlasten.