Donnerstag, 22. Dezember 2011

Typoscript Variablen in der Form Extension auslesen

In Forum auf Typo3.net war es schon beschrieben, aber ich will hier noch mal kurz darauf eingehen, wie man die Stelle findet und warum die Lösung nicht immer zu nutzen ist.

Mit verschiedenen Extensions in Typo3 4.5 war es problemlos möglich Variablen mit Hilfe von Typoscript vorzubelegen:
{TSFE:fe_user|user|email}
Und ähnliche Werte konnte man öfter finden.
In der neuen Form ist das nicht mehr möglich. Laut diesem Issue (http://forge.typo3.org/issues/25931) im Forge liegt das an dem Securitykonzept der Extension. Die Idee der neuen Form ist offensichtlich, dass man auch Redakteuren erlaubt Forms zu erstellen. Diese wären dann in der Lage mittels Variablen eigenen Code einzuschleusen, vermute ich. Ich bin jetzt zu bequem diese Lücke gedanklich voll durchzudenken.

Für alle, bei denen es keine Redakteure gibt, hier die Quick & Dirty Lösung, mittels der man Variablen „erlauben“ kann. Alles was es braucht ist in sysext/form/Classes/ Domain/Factory/Typoscript.php in der Funktion reconstituteElement als erste Zeile folgendes:
 $arguments['value']= $this->getLocalConentObject()->insertData($arguments['value']);  

So kann dann mittels Typoscript zum Beispiel auf Werte des TSFE oder auch auf Werte, die per URL übergeben wurden, zugreifen.

 10 = Fieldset  
 10 {  
 10 = hidden  
 10.value = {TSFE:fe_user|user|email}  
 20 = hidden  
 20.value = {gp:receiverID}  
 }  


Die erste Zeile gibt die Emailadresse des eingeloggten Users zurück. Die zweite Zeile sucht in der URL nach dem Parameter receiverID und gibt deren Wert zurück. Also bspw. den Wert 23, wenn die URL so aussieht:  index.html?receiverID=23

Die Übergabe über die URL ist natürlich nicht frei von Risiken, weil jeder Nutzer hier natürlich die Werte ändern könnte. Deshalb sollte man sich genau überlegen, wann man mittels gp:… auf URL Übergaben vertraut.

Meine zugegebenermaßen sehr einfachen Tests ergaben, dass hier keine Risiken existieren. Weil jeglicher Code ja vorher bereits in HTML Sonderzeichen umgewandelt wird. Trotzdem sollte man diese Variante nur sparsam einsetzen. Wozu ich es  nutze, schreibe ich im nächsten Artikel.

Hintergrund
Wie aber findet man die Stelle in der Extension an der die Anpassung vorgenommen werden muss? In extBase Extensions kann man dazu eigentlich  in der ext_localconf.php anfangen und sich dann via Controller-Classes weiter hangeln. Für die Form Extension gilt das leider nicht ganz, weil der Einstieg etwas komplizierter ist, da die Form Extension das Standardform-Element und dessen Funktionen teilweise überschreibt.  Ein Blick in den Controller schadet aber auch nicht. Im Ordner form/Classes/Controller/ gibt es 2 Dateien: Form.php und Wizard.php. Form.php  klingt vielversprechend (wir wollen ja nicht den Backend Wizard bearbeiten).

In dieser Datei gibt es die Funktion cObjGetSingleExt, diese wird laut Kommentar 2 mal aufgerufen und trägt diesen Namen, weil der Typo3 Core das verlangt.
Am Ende ruft sie die Funktion execute() auf, die wiederrum die Funktion renderForm aufruft, wenn noch kein PostEvent stattgefunden hat (das wird in showForm() überprüft).
RenderForm ruft jetzt die Funktion buildModelFromTyposcript() des Objekts $this->typoscriptFactory auf. Klingt schon sehr nach dem, was wir wollen. Das Objekt $this->typoscriptFactory wird noch immer in Form.php erstellt und zwar mit der Zeile:

 t3lib_div::makeInstance('tx_form_Domain_Factory_Typoscript');  

Also suchen wir jetzt in Classes/Domain/Factory/Typoscript.php nach der Funktion “buildModelFromTyposcript“.
In dieser Funktion scheint die Methode createElement vielversprechend, zumal sie auch die Variable $typoscript enthält, in der die Werte, die wir im Formwizard eingegeben haben, enthalten sind. Das findet man heraus, indem man sich mittels der Extension debugster oder der php Funktion print_r() die Werte der Variable ausgeben lässt. In dem $typoscript Array sind wir daran interessiert, dass die Werte in 'value' umgeformt werden. An der Stelle ist die Extension etwas komplexer, weil reconstituteElement mehrfach rekursiv durchlaufen wird. Da die Funktion insertData() aber den Eingabewert unverändert zurück gibt, wenn es keine Variable {TSFE....} ist, kann einfach am Anfang der Funktion die besagte Zeile:
$arguments['value']= $this->getLocalConentObject()->insertData($arguments['value']);
Stehen.

Eine gute Beschreibung für extBase und Fluid habe ich jetzt auch noch bei Mittwald gefunden: http://www.mittwald.de/fileadmin/pdf/extbase_fluid.pdf
Ist zwar etwas älter, aber immer noch aktuell.

Keine Kommentare:

Kommentar veröffentlichen