Silverstripe und Formulare

Formulare machen eine Webseite zu einem Kommunikationsmedium. Die Webseite liefert nicht nur Informationen an die Nutzer, sondern die Nutzer können wiederum Informationen an die Seite zurückliefern. Im schönsten Fall für den Betreiber einer Seite sind das Kreditkarteninformationen ;)
Hinter jeder Interaktionsmöglichkeit steckt immer ein Formular, das aus Feldern, Checkboxen, Dropdownmenüs, Radiobuttons und einem Bestätigungsbutton („absenden", „spiechern") besteht. Ein gutes Formular versucht zudem Benutzerfehler oder Benutzermissbrach zu vermeiden, indem es die eingegebenen Daten validiert. Um Rechenkapazitäten des Servers zu schonen sollte die Validierung browserseitig mit JavaScript geschehen. Für den Fall, dass der Benutzer JavaScript im Browser deaktiviert hat, muss aber die serverseitige Validierung greifen.
All das bietet in Silverstripe die Klasse „Form". Des weiteren werden die zur Erstellung eines Formulars die Klassen „FieldSet", „FormAction" und Unterklassen der Klasse „FormField".

Was soll erreicht werden?

Im folgenden will ich beispielhaft den Code für ein Kontaktformular, in das der Benutzer einen Namen, eine Emailadresse und eine Textnachricht eingeben kann. Alle drei Felder sollen Pflichtfelder sein. Die Emailadresse soll auf korrekte Syntax validiert werden. Alle Felder sollen vor der Eingabe schadhaften Codes gefeit sein.

Wie kommt man zum Ziel?

Im Controller muss eine Methode definiert werden, die als Rückgabewert das Formular liefert.

function contactForm() {
$fields = new FieldSet(
new TextField("Name"),
new EmailField("Email"),
new TextareaField("Text")
);

Erläuterung: Die Klasse Fieldset parst den Rahmen des Formulars. Sie bekommt als Parameter Instanzen von Feldklassen. TextField parst ein einfaches Input Feld. EmailField stellt Methoden zur Validierung auf eine Emailadresse bereit. TextareaField parst einen Textarea.

	$actions = new FieldSet(new FormAction("sendEmail", "absenden"));

Erläuterung: Hier wird der Submit-Button definiert. Die Eingaben werden an die Methode sendEmail übergeben. Der zweite Parameter von FormAction ist die Beschriftung des Submit-Buttons.

	$requiredFields = new RequiredFields("Name", "Email", "Text");

Erläuterung: Hier werden die Pflichtfelder des Formulars definiert. Sind diese nicht ausgefüllt, wird die Eingabe nicht weiter verarbeitet und eine Fehlermeldung erschient jenseits des betreffenden Feldes.

	return new Form(
$this,
"contactForm",
$fields,
$actions,
$requiredFields);
}

Die Methode „contactForm" liefert letztendlich eine Instanz der Klasse Form zurück. Dieser werden als Parameter der aufrufende Controller, der Methodenname, die Felder, die Verarbeitungsmethode und die Pflichtfelder übergeben.

Es muss eine Methode definiert werden, die die Formulareingabe verarbeitet ("sendEmail"). Sie verschickt eine Bestätigunsmail an den Benutzer und eine Mail an den Seitenbetreiber.

function sendEmail() {
$from = `admin@emailadresse.com`;
$to = $data[`Email`];
$subject = „Ihre Anfrage an uns";
$body = $data[`Text`];
$email = new Email($from, $to, $subject, $body);
$email->sendPlain();
}

Was wurde erreicht?

Die eingegebenen Daten lassen sich über die globale Variable $data ansprechen. $body muss natürlich noch mit weiterem Text versehen werden, aber ich glaube es dürfte klar sein, wo die Reise hin geht. Es fehlt noch eine zweite Email an den Seitenbetreiber aber auch das muss ich glaube ich nicht näher ausführen. Im Template muss jetzt nur noch mit $contactForm die Formularmethode aufgerufen werden.

Sind jetzt schon alle Ziele erreicht? Ja. Silverstripe parst ein sauberes Formular, das schon browserseitig validiert wird. Schaltet man JavaScript im Browser ab, erfolgt die Validierung serverseitig.

Ich finde hier werden einmal mehr die Vorteile der objektorientierten Programmierung sichtbar. Für eine eigentlich recht komplizierte Sache genügen sehr wenige Programmzeilen.

 

Tags: