Tech 25. Apr. 2012

TYPO3: Inhaltelemente mit Trennern und Wrappern - auch für Insert Record

Bei speziellen Designanforderungen ist es ab und zu nötig, einzelne Inhaltelemente mit Wrappern zu versehen oder mit Separatoren - z.B. Trennlinien zwischen allen Elementen, aber natürlich nur dazwischen und nicht etwa über oder unter allen Elementen.

Der Weg dahin führt über einen Marker, den man pauschal auf alle Content Elemente setzt und anschließend über eine Split Funktion mit den gewünschten Tags und Wrappern ersetzt.

Der Umweg ist nötig, da man zwar pauschal einen marker an alle Elemente hängen kann, die Wrapper aber erst beim Rendern des Inhalts für die jeweilige Seite bzw. Spalte gesetzt werden können.

Hier ein TypoScript Snipplet (wie es auch anderswo in ähnlicher Form im Netz zu finden ist), wie man das erste Inhaltelement von weiteren folgenden unterscheiden kann.

# sets a marker to each content element to place various wrapper on the elements
tt_content.stdWrap.outerWrap = |###SPLITTER###

10 = CONTENT
10 {
	table = tt_content
	select {
		orderBy = sorting
		where = colPos=1
		languageField = sys_language_uid
	}
	stdWrap {
		required = 1
		split {
			token = ###SPLITTER###
			cObjNum = 1 |*| 2 |*| 3
			1.current = 1
			1.wrap = <div class="ce-wrapper ce-first"> | </div>
			2.current = 1
			2.wrap = <hr class="separator" /><div class="ce-wrapper"> | </div>
			3.current = 1 
		}
	}
}

Nun schließt sich aber ein Seiteneffekt an: Was passiert mit dem Element “Datensatz einfügen” (auch als Insert Record oder Shortcut bekannt)? Leider wird dieses Element beim Theming fast immer vernachlässigt, obwohl es den Redakteuren ein extrem gutes Feature bietet, um bspw. Teaser zu verwalten. Denn i.d.R. werden viele Teaser auf mehreren Seiten in identischer Form verwendet.

Der o.g. Code führ leider dazu, dass das Wrapping ineinander geschachtelt ausgeführt wird. Das lässt sich aber zum Glück einfach vermeiden, indem man den Marker für alle Elemente, welche per Insert Record eingefügt wurden, wieder entfernt.

# remove the splitter wrapper for insert record elements, to avoid double wrapper rendering
tt_content.shortcut.20.0.conf.tt_content.stdWrap.outerWrap = |

Dann bleibt nur noch eine Lücke im Konzept: Wenn man per Insert Record mehrere Elemente kombiniert - was in manchen Fällen schon sinnvoll sein kann - dann fehlen die Trennlinien zwischen diesen Elementen. D.h., ein Insert Record Element egal mit wie vielen Referenzen wird in diesem Ansatz erst einmal nur als ein Element behandelt.

Wer eine Lösung hat, kann diese gerne an mich schicken - ich ergänze meinen Blog Eintrag gerne.