Zum Inhalt springen

Iteration zurücksetzen?

Erstellt am 13. Februar 2015 · 5 Antworten · letzte Antwort am 19. Februar 2015

Tags: Fluid, ViewHelper, Frage

lammic ·

Hi zusammen,

ich versuche mich gerade an einem Fluid-Template und mir stellt sich die Frage ob ich bei einer foreach Schleife nach Prüfung einer Condition den Itarationwert auf 0 setzen kann, damit ich isFirst und isLast abfragen kann.
Ich habe leider nichts zu dem Thema gefunden. Das ist doch aber eigentlich nichts ungewöhnliches, oder?

Gruß
Michael

lammic ·

Klingt schon etwas um die Ecke gedacht.. wenn du nur jedes Xte Element irgendwie markieren willst (ein anderer Grund erschließt sich mir gerade nicht), dann schau dir mal dieses Beispiel an (unterste Lösung): http://stackoverflow.com/questions/16564475/typo3-fluid-conditions-while-looping-array

Ich wills mal kurz erklären. Ich möchte gerne in Powermail die Fieldsets durch die Layoutangabe differenzieren. Damit möchte ich eine vorgegebene Optik realisieren.
Angenommen ich habe 5 Fieldsets (in Powermail heißt das Seiten), zwei davon haben keine Layoutzuordnung, drei bekommen das Layout "Grid".
Um die Fieldsets mit dem Layout "Grid" möchte ich einen DIV-Container haben, dazu muss ich aber wissen, wieviele Fieldsets es nun mal gibt, um den DIV-Container an der richtigen Stelle zu öffnen und wieder zu schließen. Das könnte ich ja dann mit iteration.isFirst und iteration.isLast abfragen. Aber das geht ja nur, wenn der Wert der Iteration bei der Condition wieder von vorne beginnt.
War das verständlich? 🙂😉

jenses ·

Frag' doch direkt den Wert von iteration ab,
und öffne dein DIV z.B. wenn iteration==2 und schließe es, wenn iteration==5 ?

lammic ·
jenses schrieb

Frag' doch direkt den Wert von iteration ab,
und öffne dein DIV z.B. wenn iteration==2 und schließe es, wenn iteration==5 ?

Das wäre sicherlich die einfachste, aber doch unflexibelste Lösung. Es ist ja nicht ausgeschlossen, dass der Redakteur ein neues Formular erstellt mit einem völlig anderen aussehen.
Offensichtlich gibt es da keine systemseitige Lösung, daher habe ich das jetzt per CSS gelöst. Ist zwar nicht die sauberste Lösung, aber es funktioniert und darauf kommt es ja letztlich an ;-)

jenses ·

Da mache es doch so:
du speicherst in einer Variable xyz, ob das aktuelle Element das Layout grid hat.
Beim nächsten Cycle vergleichst du xyz mit dem Feld Layout des aktuellen Element -
sind beide grid, passiert nichts,
ist xyz grid und aktuelles Layout ein anderer Wert, schließt du das DIV,
ist xyz ein anderer Wert und aktuelles Layout grid , öffnest du das DIV

Dummycode:

var xyz='';
<f:for each="{array}" as="foo">
  if(foo.layout != xyz AND foo.layout=='grid') {
    <div class="grid">
  }
  if(foo.layout != xyz AND foo.layout!='grid') {
    </div>
  }
  xyz=foo.layout
   {foo}
</f:for>