Mit UserFunc kann man PHP Code per TypoScript einbinden. Doch je nach Version werden UserFuncs anders eingebunden:
- Tutorial für Version 10 und 11: https://www.auxweb.de/aktuelles/userfunc-tutorial
- 8.7: http://typo3blogger.de/userfuncs-per-typoscript-in-typo3-8-7-einbinden/
- 7.6: mein Tutorial für 7.6
- 6.2: nicht getestet, müsste mit dem 4.5er laufen
- 4.5: dieses Tutorial hier
userFunc Tutorial für TYPO3 Version 4.5
Eine „user_func“ kann an jeder Stelle im TypoScript verwendet werden, um PHP Code einzubinden. Los geht es mit diesem Tutorial, da werden schon mal die einfachsten Prinzipien erklärt: http://www.typo3wizard.com/de/snippets/allgemeine-probleme-und-loesungen/einfache-userfunc.html
Jetzt habe ich das ganze etwas ausgebaut:
1. Code includieren
includeLibs.user_mylinks = EXT:veranstaltungen/user_teaserlink.php
Zuerst muss ich den Pfad zu meiner Datei definieren. Nach dem includeLibs steht der Name der Klasse.
2. Funktion oder Klasse programmieren
class user_mylinks { var $cObj;// The backReference to the mother cObj object set at call time function main($content, $conf) { $value = $conf['value']; return $content; } function makeTeaserLink() { $link = trim($this->cObj->data["image_link"]); $outputlink = ""; if (strpos($link,"www.") === 0) { $outputlink = "http://".$link; } else { $outputlink = $link; } return '$outputlink'; } }
Hier verwende ich eine einfache Funktion, um Links zu parsen, da mir die String-Funktionen im TypoScript fehlen. Die Funktion macht in echt natürlich einiges mehr, aber dann wird es unübersichtlich.
Wichtig ist hier: Die Klasse muss mit „user_“ beginnen, sonst passiert gar nichts!
3. Einbindung in TypoScript
Die Einbindung in TypoScript geht sehr einfach über:
10 = USER 10.userFunc = user_mylinks->makeTeaserLink oder 10 = USER 10.userFunc = user_myfunction
Variante 1 ist eine Klasse, da muss der Name der Klasse mit „user_“ beginnen. Variante 2 ist eine Funktion, da muss der Funktionsname mit „user_“ beginnen.
Oder man bindet es mit einer lib ein, wie im ersten Tutorial gezeigt:
temp.info = USER temp.info { userFunc =user_mylinks->main value=atest color=#11FAAA } page.XX<temp.info
Daten übergeben
In der Funktion hat man Zugriff auf „data“ aus TypoScript, was sehr praktisch in einer Datenbankabfrage ist:
20 = CONTENT 20 { table = tt_content select { pidInList = this orderBy = sorting where= colPos=1 languageField = sys_language_uid } renderObj = COA renderObj { 10 = USER 10.userFunc = user_mylinks->makeTeaserLink } }
Wenn ich jetzt in der userFunc $this->cObj->data["image_link"]
aufrufe, bekomme ich den Wert aus dem jeweiligen Datenbankeintrag. In diesem Beispiel manipuliere ich den eingetragenen Link aufs Bild.
Das erste Tutorial zeigt außerdem, wie man Daten aus value über $conf[„value“] verwendet. In den Kommentaren findet sich außerdem ein Hinweis wie man GET-Parameter abfragen kann.
Man kann die userFunc auch in Conditions verwenden, dazu gibt es hier ein Beispiel. Allerdings würde ich das nicht in die localconf, sondern eine eigene Datei schreiben. Dazu muss ich nur das include aus Schritt 1 hinzufügen.
Achtung: bei Conditions sind nur Funktionen, keine Klassen erlaubt: http://dmitry-dulepov.com/article/interesting-issue-with-conditions.html
Links:
- Tutorial: http://www.typo3wizard.com/de/snippets/allgemeine-probleme-und-loesungen/einfache-userfunc.html
- TSRef: http://typo3.org/documentation/document-library/core-documentation/doc_core_tsref/4.3.0/view/1/7/#id2526581
- Conditions: http://www.typo3-tutorials.org/tutorials/typoscript/userfunc-eigene-condition.html
- Conditions: http://dmitry-dulepov.com/article/interesting-issue-with-conditions.html
- Mit TypoScript am Ende – Userfunc hilft: http://typo3blogger.de/mit-typoscript-am-ende-userfunc-hilft/
Pingback: userFunc Tutorial Update - TYPO3 Entwickler-BlogTYPO3 Entwickler-Blog
Eine UserFunc für die Inhalte von TMENU wird mit itemArrayProcFunc aufgerufen:
http://www.blogix.net/2008/10/12/typo3-navigation-mit-eigenem-php-skript-beeinflussen/
Ach ja, insertData = 1 hilft evtl. das data Feld mit Inhalt zu füllen.
Hi Arne,
ich glaube da läufst du in ein TypoScript Grundsatzproblem. Vermutlich wird deine UserFunc aufgerufen, bevor der Teil den du gepostet hast ausgeführt wurde.
TypoScript ist ja vom Prinzip her ein Array, und kein Programmiercode. Und wie die Reihenfolge beim Abarbeiten der Array-Einträge ist weiß ich nicht.
Schau mal ob es hilft, ihn in ein temp Objekt zu packen. Außerdem gibt es die Reihenfolge: 10. kommt vor 20., und auf welcher Ebene dein Objekt ist: 10.10 oder 10.10.10.
Evtl. hilft es auch das USER Objekt durch USER_INT oder PHP_SCRIPT zu ersetzen: http://www.typo3.net/tsref/cobject/user/
Wie genau das abgearbeitet wird und ob man die Reihenfolge beeinflussen kann müsstest aber jemanden fragen der sich mit Typo3 Core auskennt.
Wenn es irgendwie geht würde ich ansonsten das parsen vom String in PHP machen:
http://at.php.net/manual/de/function.explode.php
LG Andrea
Hallo Andrea,
danke für die flinke Antwort. Das Beispiel funktioniert, allerdings nur, wenn das feste Werte sind. Da war mein Pseudocode wohl auch doof für… es kommt schlicht nichts geparstes in der userFunc an.
Bei mir zum Beispiel geht es konkret um ein Textfeld, das ich splitte und von dem ich mir dann den x. Eintrag nehme.
So sieht das konkret aus (hoffe, es kommt richtig an):
Das ist der Dump des Arrays und bildet 1:1 auch das ab, was ich per TS vorgebe. Nur eben leider vor und nicht nach dem Parsen. Ich kriege meine Vorgaben überliefert, aber nicht das Ergebnis. Scheint mir irgendwie unlösbar zu sein :-/ Herauskommen sollte eigentlich etwas wie
EEE-111-222-333-444
aus einem String wie
ABC#DEF#EEE-111-222-333-444#GHI
(oder so ähnlich)
Hi Arne,
damit kann ich die myVar übergeben:
In der Funktion gibt var_dump($conf) folgendes:
Damit steht der Wert Test in $conf["value."]["value"]:
Mist, da hat der wohl was beim Kommentieren geschluckt. Vielleicht so besser:
In 10.myVar steht dann "TEXT" statt "test", egal wie ich es übergebe (auch myVar.value etc. klappt nicht).
Hi,
in Deinem Beispiel werden Werte direkt dem assoziativen Array $conf zugewiesen. Siehe:
[…]
userFunc =user_mylinks->main
value=atest
color=#11FAAA
[…]
Weißt Du zufällig einen Weg, auch Werte aus Variablen als Variable an die userFunc zu übergeben? In folgendem Beispiel
myVar = TEXT
myVar.value = test
10 = USER
10.userFunc = user_myClass->main
10.myVar cObj funktioniert in meinem Fall nicht als Workaround, da ich in einer bestimmten Zeile in einem FCE von TemplaVoila hänge und nur das gesamte TV-Objekt bekomme, nicht aber gezielt diese Zeile.