Wir haben auf typo3blogger bereits einige Beiträge die sich mit dem Einsatz von userFuncs in TypoScript und in conditions beschäftigen. Dennoch versuche ich das Thema einmal aus Sicht eines Beginners anhand eines konkreten Beispiels zu beleuchten.
Mit TypoScript lassen sich bereits eine Menge Anforderungen abdecken, aber leider eben noch nicht alle. Ein paar spezielle Anforderungen, die vielleicht in PHP einfach umzusetzen wären, vermisst man vielleicht regelmäßig (number_format(), stristr(), mktime(), str_replace(), …). In den beiden nachfolgenden Beispielen, versuche ich die Einbindung einer userFunc etwas transparenter zu machen.
Beispiel 1 – Schritt 1:
Ein einfaches Beispiel wäre die Ausgabe des aktuellen Seitennamens an einem festen Marker.
# pagetitle output lib.pageTitle = TEXT lib.pageTitle.field = title # output on marker ###PAGETITLE### page.10.marks.PAGETITLE < lib.pageTitle |
Beispiel 1 – Schritt 2:
Eventuell möchte man auf allen Seiten mit dem Namen „Detail“ einen anderen Titel anzeigen. Mit TypoScript kein Problem (Die Zeile mit dem Output an dem Marker habe ich an dieser Stelle weggelassen – siehe oben).
lib.pageTitle = CASE lib.pageTitle { key.field = title default = TEXT default.title = title Detail = TEXT Detail.value = Sie befinden sich innerhalb einer Detailansicht } |
Beispiel 1 – Schritt 3:
In unserem Fall wollen wir, sobald sich irgendwo im Titel das Wort „detail“ befindet, immer eine andere Ausgabe haben. Ein paar Zeilen PHP im Zusammenhang mit einer userFunc helfen sofort. Die PHP-Funktion stristr() bietet sich an.
In unserer eigenen Funktion müssen wir drei Dinge bereitstellen:
– Der zu überprüfende Text, der auch in den meisten Fällen zurückgegeben werden soll (außer bei „detail“)
– Der zu suchende Begriff – in unserem Fall „detail“
– Einen alternativen Text, falls der zu suchende Begriff gefunden wurde
Im nachfolgenden Beispiel wird zu Beginn mit includeLibs eine PHP Datei geladen, die unsere neue Funktion beinhaltet. Eine Funktion mit Namen stristrTypoScript() innerhalb einer Klasse user_misc wird direkt durch lib.pageTitle aufgerufen. Alle Werte innerhalb der userFunc (titleField, searchFor, foundText) stehen als einfaches Array in PHP zur Verfügung. Dabei fällt auf, dass sich searchFor von den beiden anderen Werten irgendwie unterscheidet:
– titleField (stdWrap mit TEXT)
– searchFor (String)
– foundText (stdWrap mit TEXT)
Bei titleField und foundText wird TypoScript nicht nur gelesen, sondern auch geparst und interpretiert, während bei searchFor lediglich ein Wert übergeben wird. Der Unterschied: Wir wollen die TypoScript Flexibilität auch bei titleField und bei foundText.
# include php file includeLibs.user_misc = fileadmin/user_misc.php lib.pageTitle = USER lib.pageTitle { userFunc = user_misc->stristrTypoScript userFunc { # whole string titleField = TEXT titleField.field = title # keyword to search for searchFor = detail # TypoScript if keyword found foundText = TEXT foundText.value = Sie befinden sich innerhalb einer Detailansicht } } |
Unsere PHP Datei mit Namen user_misc.php befindet sich im fileadmin Verzeichnis und hat nachfolgenden Inhalt.
<?php class user_misc { function stristrTypoScript($content = '', $conf = array()) { // config global $TSFE; $local_cObj = $TSFE->cObj; // cObject $conf = $conf['userFunc.']; // ts config $searchFor = $conf['searchFor']; // get string $titleField = $local_cObj->cObjGetSingle($conf['titleField'], $conf['titleField.']); // stdWrap for title $foundText = $local_cObj->cObjGetSingle($conf['foundText'], $conf['foundText.']); // stdWrap for alternative Text // let's go if (stristr($titleField, $searchFor)) { // if keyword found return $foundText; // return alternative text } else { // keyword not found return $titleField; // return title } } } ?> |
Beispiel 2 – Schritt 1:
Ein weit einfacheres Beispiel zeige ich im Zusammenhang mit number_format. Eine Zahl soll mit Hilfe einer userFunc formatiert zurückgegeben werden (wie es z.B. die Warenkorb Extension wt_cart macht). Wir wollen also eine Währung anzeigen – Anstatt 100 die Ausgabe 100,00 € oder eben anstatt 23.5 die Ausgabe 23,50 €.
Ein Feldinhalt könnte als Dezimalzahl (mit Punkt statt Komma) vorliegen und würde eben als solcher wieder ausgegeben werden.
zahl = TEXT zahl.field = number # Output: 23.4 |
Beispiel 2 – Schritt 2:
Über einen Wrap können wir ein Euro Zeichen hinten anfügen.
zahl = TEXT zahl.field = number zahl.field.wrap = | € # Output: 23.4 € |
Beispiel 2 – Schritt 3:
Nun zur Formatierung der Ausgabe über die PHP Funktion number_format().
includeLibs.user_misc = fileadmin/user_misc.php zahl = USER zahl.userFunc = user_misc->numberFormatTypoScript zahl { number = TEXT number.field = number } # Output: 23,40 |
<?php class user_misc { function numberFormatTypoScript($content = '', $conf = array()) { global $TSFE; $local_cObj = $TSFE->cObj; // cObject $conf = $conf['userFunc.']; // TS configuration $number = $local_cObj->cObjGetSingle($conf['number'], $conf['number.']); // get number return number_format($number, 2, ',', '.'); } } ?> |
Beispiel 2 – Schritt 4:
Dummerweise lässt sich eine userFunc nicht so einfach wrappen, weswegen wir für unser Euro Zeichen noch ein COA außen herumpacken sollten
includeLibs.user_misc = fileadmin/user_misc.php zahl = COA zahl { wrap = | € 10 = USER 10.userFunc = user_misc->numberFormatTypoScript 10.userFunc { number = TEXT number.field = number } } # Output: 23,40 € |
Beispiel 2 – Schritt 5:
Das I-Tüpfelchen wäre natürlich, wenn man die Parameter der Funktion number_format nicht hart in der userFunc hinterlegen würde, sondern auch noch über TypoScript verfügbar macht:
includeLibs.user_misc = fileadmin/user_misc.php zahl = COA zahl { wrap = | € 10 = USER 10.userFunc = user_misc->numberFormatTypoScript 10.userFunc { number = TEXT number.field = number decimal = 2 dec_point = , thousands_sep = . } } # Output: 23,40 € |
<?php class user_misc { function numberFormatTypoScript($content = '', $conf = array()) { global $TSFE; $local_cObj = $TSFE->cObj; // cObject $conf = $conf['userFunc.']; // TS configuration $number = $local_cObj->cObjGetSingle($conf['number'], $conf['number.']); // get number return number_format($number, $conf['decimal'], $conf['dec_point'], $conf['thousands_sep']); } } ?> |
Links zum Thema
- userFunc benutzen auf typo3blogger
- userFunc für conditions
- userFuncs bei TYPO3 Wizard
- TypoScript If, CASE, Conditions
Freue mich immer über jeden Kommentar…
Gruß aus dem verregneten München, Alex