Es gibt viele Formular Extensions, mit sehr vielen hilfreichen Funktionen. Damit verbunden ist jedoch auch die Wartung und Einrichtung. Bei manchen Projekten könnte die TYPO3 Standard Form Extension ausreichen. Zudem hat sich einiges verändert, seitdem diese auf Fluid basiert.
Heute möchte ich zeigen, wie man dynamisch Felder befüllt mit dem Standard TYPO3 Mail-Formular. Dies funktioniert mit ein bisschen Fluid und TypoScript.
Leider ist noch nicht alles dokumentiert und auch in den Extensions (Form, Fluid, Extbase, usw.) finden sich im Quellcode viele Hinweise hierauf (z. B. „@todo documentation“). Aus dem Grund habe ich die FORM Extension mal genauer unter die Lupe genommen und den Quellcode mir vorgenommen.
Als Beispiel möchte ich zeigen wie durch einen GET Parameter Daten aus einer Tabelle geladen werden und im Anschluss ein HIDDEN Feld befüllt wird.
Als erstes lege ich mir für ein paar Anpassungen an den Fluid Templates einige Ordner an. Mein FORM Basisordner für meine Anpassungen liegt zum Beispiel in: fileadmin/templates/form/
Dort wird ein Ordner „fluid“ erstellt mit folgenden Unterordnern und HTML Dateien:
- Default/PostProcessor/Mail/Html/FlatElements/Hidden.html
- Default/PostProcessor/Mail/Plain/FlatElements/Hidden.html
- Default/Show/FlatElements/Hidden.html
In der Datei fileadmin/templates/form/fluid/Default/Show/FlatElements/Hidden.html wird nun folgendes eingefügt:
<li class="csc-form-{model.elementCounter} csc-form-element csc-form-element-{model.elementTypeLowerCase}"> <f:form.hidden class="{model.additionalArguments.class}" dir="{model.additionalArguments.dir}" id="{model.additionalArguments.id}" lang="{model.additionalArguments.lang}" style="{model.additionalArguments.style}" title="{model.additionalArguments.title}" accesskey="{model.additionalArguments.accesskey}" tabindex="{model.additionalArguments.tabindex}" onclick="{model.additionalArguments.onclick}" name="{model.additionalArguments.prefix}[{model.additionalArguments.name}]" value="{f:if(condition:'{model.additionalArguments.renderValueAsTypoScript}',then:'{f:cObject(typoscriptObjectPath:\'{model.additionalArguments.value}\')}',else:'{model.additionalArguments.value}')}" additionalAttributes="{model.htmlAttributes}" /> </li>
Im Großen und Ganzen ist es von einem normalen INPUT Feld kopiert. Die entscheidende Veränderung findet bei dem „value“ Attribut statt. Dort wurde eine INLINE Condition hinzugefügt. Diese Condition überprüft, ob im TypoScript ein BOOLEAN Wert TRUE entspricht und rendert dann ein TypoScript Objekt, andernfalls wird normal weiter gemacht. Dazu später mehr!
Das HIDDEN Feld, soll auch in unserer E-Mail erscheinen. Im aktuellen original Fluid Template ist das Partial jedoch leer. Somit wird das Hidden Feld nicht in die E-Mail übernommen. Dies ändern wir wie folgt in unseren beiden PostProcessor Hidden.html Dateien: fileadmin/templates/form/fluid/Default/PostProcessor/Mail/Html/FlatElements/Hidden.html
<f:if condition="{model.showElement}"> <tr class="csc-form-{model.elementCounter} csc-form-element csc-form-element-{model.elementTypeLowerCase}"> <td style="width: 200px;"> <em>{model.additionalArguments.label}</em> </td> <td>{model.additionalArguments.value}</td> </tr> </f:if>
fileadmin/templates/form/fluid/Default/PostProcessor/Mail/Plain/FlatElements/Hidden.html
{namespace form=TYPO3\CMS\Form\ViewHelpers} <f:if condition="{model.showElement}"><form:plainMail labelContent="{model}" content="{model}" /></f:if>
Als nächstes muss der Form Extension mitgeteilt werden, dass wir weitere Partials nutzen möchten. Zudem soll mitgeteilt werden, dass das HIDDEN Feld für den Mailversand berücksichtigt werden soll.
plugin.tx_form { view.partialRootPaths.20 = fileadmin/templates/form/fluid/ settings.registeredElements.HIDDEN.visibleInMail = 1 }
Als nächstes sollte dem Mailformular mitgeteilt werden, wie mit dem HIDDEN Feld umgegangen werden soll:
tt_content.mailform = COA_INT tt_content.mailform { # Überschrift anzeigen wenn eine ID verfügbar ist 15 = RECORDS 15 { source.data = GP:wohnung # vor SQL Injection schützen source.intval = 1 tables = tx_myext_domain_model_wohnung conf.tx_myext_domain_model_wohnung = TEXT conf.tx_myext_domain_model_wohnung { field = ueberschrift wrap = <h2><strong>Wohnung: </strong>|</h2><p> </p> required = 1 } } # In dem Hidden.html partial wird das TypoScript nun gerendert 20.10 = HIDDEN 20.10 { name = wohnung value = lib.form.wohnungsdaten label.value = Wohnung # selbst definierte option für die IF Condition um zu entscheiden, # das die VALUE ein TypoScript Objekt-Pfad ist und nicht nur ein String. renderValueAsTypoScript = 1 } 25 = RESTORE_REGISTER }
Damit steht die dynamische Befüllung von Formularfeldern generell. Als abschließendes Beispiel und der Vollständigkeit hier das TypoScript Objekt welches den Wert (Value) für das Hidden Feld generiert:
# Wohnungsdaten auslesen lib.form.wohnungsdaten = RECORDS lib.form.wohnungsdaten { source.data = GP:wohnung # vor SQL Injection schützen source.intval = 1 tables = tx_myext_domain_model_wohnung conf.tx_ myext _domain_model_wohnung = COA conf.tx_ myext _domain_model_wohnung { 10 = TEXT 10.field = wohnungsnr 10.noTrimWrap = ||, | 20 < .10 20.field = objekt 30 < .10 30.field = ueberschrift 30.noTrimWrap = ||| } }
Wenn dieses TypoScript nun in dem ROOT Template ist, wird jedes Formular automatisch um das HIDDEN Feld erweitert, wenn es im Frontend den GET Parameter „wohnung“ erhält. Sprich: http://www.mydomain.de/kontakt.html?wohnung=23
Es ist somit nicht nötig das ganze Mail-Formular über TypoScript zusammen zu bauen. Der Backend Benutzer kann somit die Formulare nach Bedarf zusammensetzen und das Hidden Feld (oder andere Felder) werden dynamisch ergänzt.