Zum Inhalt springen

<f:for> verschachteln mit <f:if> ?

Erstellt am 30. März 2011 · 7 Antworten · letzte Antwort am 19. März 2013

Tags: Frage

Naderio ·

Hallo,

ich schreibe grad für meine Abschlussprüfung eine Bilderweiterung. Schreibe mir im Moment die Templates zusammen und stecke jetzt an einer Verschachtelung fest:

<f:for each="{galerieDaten.bilder}" as="bild">
<div class="galleryImage">
	<a href="fileadmin/Bilder/{bild.datei}">
		<img src="fileadmin/Bilder/{bild.datei}" alt="{f:if(condition: bild.altTag)}" />
	</a>
	<p class="imagetext">
		<f:if condition="{bild.titel}">
			<span class="imageTitle">{bild.titel}</span>
		</f:if>
		<f:if condition ="{bild.beschreibung}">
			<span class="imageDescription">{bild.beschreibung}</span>
		</f:if>
	</p>
</div>
</f:for>

Ich habe ein array {bild} und will mir zu jedem einen Titel und eine Beschreibung ausgeben WENN vorhanden.

wenn ich die beiden if-Abfragen raus nehme dann klappt es:

<f:if condition="{bild.titel}">
<span class="imageTitle">{bild.titel}</span>
</f:if>
<f:if condition ="{bild.beschreibung}">
<span class="imageDescription">{bild.beschreibung}</span>
</f:if>

allerdings bekomme ich eine Fehlermeldung wenn ich die Abfragen drin habe...

Hab ich da einen Denkfehler, oder geht das einfach im Moment noch nicht?

Fehlermeldung:
Templating tags not properly nested. Expected: Tx_Fluid_ViewHelpers_ForViewHelper; Actual: Tx_Fluid_ViewHelpers_IfViewHelper

MfG

Thomas

Naderio ·

Ach verdammt bin ich blöd...#angry#

Ich habe es jetzt mit Inline-Notation gelöst. So funktioniert es!
Wen es interessiert:

<span class="imageTitle">{f:if(condition: bild.titel, then: bild.titel)}</span>

Falls schon jemand drüber nachgedacht haben sollte, vielen Dank dafür #paralyzed#

harald1972 ·

Hallo,

zwar verstehe ich nicht, was hier als Problemlösung gemeint ist,
(ich verstehe auch diese inline-Notation nicht so ganz)
allerdings hat das Problem mit der Notation nichts zu tun.

Die Fehlermeldung: Templating tags not properly nested. ...
erscheint weil der <f:then> im <f:if> fehlt,
also nicht so:

<f:if condition="{foo}">
   {bar}
</f:if>

sondern:

<f:if condition="{foo}"><f:then>
   {bar}
</f:then><f:else>
   {baz}
</f:else></f:if>

Gruß Harald

karf ·
harald1972 schrieb

Hallo,

zwar verstehe ich nicht, was hier als Problemlösung gemeint ist,
(ich verstehe auch diese inline-Notation nicht so ganz)
allerdings hat das Problem mit der Notation nichts zu tun.

Die Fehlermeldung: Templating tags not properly nested. ...
erscheint weil der <f:then> im <f:if> fehlt,
also nicht so:

<f:if condition="{foo}">
   {bar}
</f:if>

sondern:

<f:if condition="{foo}"><f:then>
   {bar}
</f:then><f:else>
   {baz}
</f:else></f:if>

Gruß Harald

Das ist nicht korrekt. Sofern du keinen else-Fall brauchst funktioniert

<f:if condition="{foo}">
   {bar}
</f:if>

genauso gut.
das <f:then> brauchst du nur wenn du then und else unterscheiden musst.
selbst ein

<f:if condition="{foo}">
   <f:else>
   {bar}
   </f:else>
</f:if>

funktioniert. (ist identisch mit einem unless bzw. if not)

Warum das Ursprüngliche HTML von Naderio nicht funktioniert sehe ich aber gerade auch nicht.

kainobi ·

karf hat recht, am fehlenden <f:then> kann es nicht liegen. Evt. liegt es aber am img-Tag:

<img src="fileadmin/Bilder/{bild.datei}" alt="{f:if(condition: bild.altTag)}" />

Hier scheint mir die inline-if-condition unvollständig zu sein. Warscheinlich wird dadurch der Fehler verursacht.

harald1972 ·

Danke fürs Berichtigen :o

am fehlenden <f:then> liegts wohl nicht. Zumindest nicht an der Stelle.
Aber wie kainobi sagt: der inline-if ist unvollständig. Er hat eine Condition, aber kein 'then'.
In Naderios eigener Lösung vom 21.03.2011 steht 'then' drin.

karf ·

Nope daran liegt es definitiv nicht.

{f:if(condition: bild.altTag)} ist ein vollständiger Viewhelper, nur die Condition ist ein Pflichtfeld. (Sinn macht es natürlich wenig)

Ich habes jetzt mal ausprobiert, der Fehler lag am Leerzeichen nach dem condition des letzten if-viewhelpers

Also Original:

		<f:if condition ="{bild.beschreibung}">
			<span class="imageDescription">{bild.beschreibung}</span>
		</f:if>

Korrekt:

		<f:if condition="{bild.beschreibung}">
			<span class="imageDescription">{bild.beschreibung}</span>
		</f:if>

Ich bin mir nicht 100% Sicher wie es im XML Standard ist, aber ich denke das dies wohl ein Bug im Fluid Parser ist ...