Formulare mit Extbase und Fluid
Links
http://docs.typo3.org/typo3cms/ExtbaseGuide/Fluid/ViewHelper/Form/Index.html
Überblick
- Falls nicht vorhanden gewünschte Action registrieren (localconf) und im Controller anlegen
- Fluid Form erstellen
- Mit Absenden oder AJAC Call ausführen
Formular Felder im Fluid Template
Form Tag (Action)
Beispiel
<f:form action="BestimmteFormAction" controller="BestimmterControllerName" extension="AndererExtensionName" enctype="multipart/form-data"> Form-Felder </f:form>
Beispiel
<f:form action="create" object="{newProject}">
Projektname: <f:form.textbox property="name" />
<f:form.submit value="Speichern" />
</f:form>
Das Controller Attribut benötigt man nur dann, wenn der Controller der die Daten auswerten soll nicht zum aktuellen View gehört.
Name Attribute
Das name-Attribut wird automatisch für das Plugin passend umgewandelt.
<f:form.textfield name="myField" />
wird zu
<input type="text" name="tx_registierung_pi1[myField]" />
Sendet das Formular nun z.B. an einen Controller: showAction, stehen die Werte als Argumente zur Verfügung:
public function showAction() {
$args = $this->request->getArguments();
echo $args['myField];
}
Extbase vergleicht dabei zusätzlich automatisch die Felder aus dem Formular mit dem Model validiert automatisch.
Tipps und Tricks
Typo3/Fluid: Verschiedene Models über ein Formular bedienen
Quelle: http://www.muenster-webdesign.net/blog/typo3fluid-verschiedene-models-ueber-ein-formular-bedienen/ (2015-03)
Dank der form-ViewHelper lassen sich Formulare mittels Extbase/Fluid recht zügig umsetzen. Bei komplexeren Szenarien, bei denen in einem Formular mehrere verschiedene Models bedient werden sollen, stellt sich jedoch die Frage, wie sich dies umsetzen lässt.
Die Lösung liegt darin, mit “namebased input”-Felder zu arbeiten. Statt also wie üblich eine Eigenschaft im Fluid-Formular per “property”-Attribut an ein Objekt zu binden, definiert man stattdessen die Argumente “name” und “value” manuell.
Ein Beispiel. Ein Formular ist per “object”-Attribut an ein Objekt “schornsteinfeger” gebunden. Soll im Formular nun gleichzeitig eine Eigenschaft “aussentemperatur” eines Objekts “wetter” bedient werden, könnte das Ganze etwa so aussehen:
<f:form method="post" action="create" name="schornsteinfeger" enctype="multipart/form-data" object="{schornsteinfeger}">
<f:form.textbox name="wetter[aussentemperatur]" value={wetter.aussentemperatur} />
</f:form>
Felder validieren die nicht im Domain-Model vorhanden sind
Wenn man z.B. ein Captcha einbauen möchte braucht man Felder die nicht im Model sind. Die eingebauten Sicherheitsmechanismen in Extbase lassen dass aber nicht ohne weiteres zu. Hier wird ja automatisch jeder Wert mit dem Model abgeglichen. Möglichkeit 1 - Dummy Felder in das Model einbauen:
/** * CAPTCHA * * @var string * @validate NotEmpty, Tx_MyExt_Validation_Validator_CaptchaValidator */ protected $captcha;
Möglichkeit 2 - Validierer im Controller initialisieren
Statische Optionen in Selectboxen
http://docs.typo3.org/typo3cms/ExtbaseGuide/stable/Fluid/BestPractice/OptionsForSelect.html