Template-Pfade via Flexform setzen

Früher war alles so einfach… Für Plugins konnte einfach in einem Flexform-Feld eine Template-Datei angegeben werden, und schwupps war die via TypoScript gesetzte Datei für dieses eine Content-Element überschrieben. Das wohl bekannteste Beispiel hierfür ist die Extension News (tt_news).

Die Zeiten haben sich geändert. Mit Extbase/Fluid ist Vieles flexibler und einfacher geworden: wir können Dank Partials HTML-Schnipsel wiederverwenden, können Dank der Overrides Kaskaden für Template-Pfade in TypoScript festlegen – aber wie kann gelöst werden, dass ein einzelnes Content-Element ein anderes Template bekommen soll?

Weiterlesen

Translate-ViewHelper und Fluid-Inline-Notation in Attributen

Eigentlich ganz simpler Fall: in ein Sprachlabel soll eine Variable eingesetzt werden, die wiederum per ViewHelper zuvor verändert werden soll. Ein typisches Beispiel ist eine Anzeige der letzten Aktualisierung.

Die einfache Variante des ViewHelpers ohne eine ViewHelper-Anwendung auf das Argument:

<f:translate key="last_updated" arguments="{0: update_timestamp}" />

Möchte man ViewHelper in Inline Notation innerhalb des arguments-Attributs anwenden, so sind die Array-Werte innerhalb des Arrays in Singlequotes zu fassen (und darin befindliche Singlequotes ggf. zu escapen):

<f:translate key="last_updated" extensionName="{extensionName}" arguments="{0: '{update_timestamp->f:format.date(format:\'d.m.Y H:i\')}'}" />

Link-Feld: CSS-Klasse hinzufügen mittels Fluid

Sinn und Zweck: aus dem Link-Feld des Backends (in dem neben der Zielseite auch target-, CSS-Klasse und title-Attribut stehen kann) den Wert an Link-Viewhelper übergeben, dabei aber eine zusäztliche CSS-Klasse anhängen.

<vhs:if.string.isNumeric value="{field.link}">
  <f:then>
    <dce:typolink parameter="{field.link} - link" />
  </f:then>
  <f:else>
    <dce:typolink parameter="{vhs:format.regularExpression(pattern: '/^([^ ]+)\s+([^ ]+)((\s+-)|(\s+[^ ]*)) (.+)/Ui', replacement: '\1 \2 \"link\5\" \6', subject: '{field.link}')}" />
  </f:else>
</vhs:if.string.isNumeric>

Update 2014-04-07

Nette Idee, aber die Tücken liegen wie so oft im Detail. Die Kombinationsmöglichkeiten aus internem Link/externem Link, Linkziel (target) gegeben/nicht-gegeben, Linktitle gegeben/nicht-gegeben und CSS-Klasse gegeben/nicht-gegeben ergeben, sind derart groß, dass der reguläre Ausdruck von oben doch nicht immer greift (z.B. falls nur eine externe URL gegeben ist).

Mehrere Variablen an Fluid cObject-ViewHelper übergeben

Fluid kann vieles, aber manchmal will man doch auf TypoScript zurückgreifen und innerhalb eines Fluid-Templates ein cObject verwenden. An TypoScript können via data-Attribut auch Daten übergeben werden.

<f:cObject typoscriptObjectPath="lib.singleTest" data="{'Hello world'}"></f:cObject>
lib.singleTest = TEXT
lib.singleTest.current = 1

Was aber, wenn man verschiedene Objekte/Array/Strings an TypoScript übergeben möchte?
Eigentlich ganz einfach: die Daten als (neues) Array übergeben und mittels field ansprechen:

<f:cObject typoscriptObjectPath="lib.multipleTest" data="{hello: 'Hello', world: 'world'}"></f:cObject>
lib.multipleTest = COA
lib.multipleTest {
    10 = TEXT
    10.field = hello
    10.noTrimWrap = || |
    20 = TEXT
    20.field = world
}

Update: Gilt auch für Partials

Selbiges gilt auch, um an Partials mehrere Argumente zu übergeben:

<f:render partial="social" arguments="{settings : settings, fbLink:fbLink}"/>