Erweiterung der Formularfunktionen

1. Einleitung

Das Adventure PHP Framework beinhaltet bereits alle üblichen Formular-Elemente, es sind jedoch sicher nicht alle Spezialfälle abgedeckt. Um die Funktionen der mitgelieferten Formular-Tags einfach erweitern zu können, wurde im Release 1.7-BETA das Tag <form:addtaglib /> eingeführt. Mit Hilfe dieser Taglib können beliebige weitere Taglibs eingebunden werden. Diese können dann dazu genutzt werden, die für den aktuellen Anwendungsfall gewünschte Funktionalität nachzurüsten.

Das vorliegende Tutorial möchte an Hand von zwei Beispielen aufzeigen, wie der neue Tag genutzt werden kann und welche Möglichkeiten sich dadurch ergeben. Im ersten Beispiel wird ein einfaches Tag vorgestellt, mit dem das Datum im Formular als verstecktes Feld mitgeführt wird und das Formular auf invalid setzt, wenn dieses innerhalb von einer konfigurierbaren Zeit abgeschickt wird. Das dritte Kapitel zeigt, wie mit ein CAPTCHA-Tag implementiert werden kann.


2. Anti-SPAM-Tag

2.1. Idee

Eine sehr einfache, jedoch verhältnismäßig wirkungsvolle Möglichkeit, einen SPAM-Schutz für ein Formular zu erstellen, ist es, die Zeit zu messen, die ein Benutzer benötigt, um ein Formular auszufüllen. Wird das Formular in zu kurzer Zeit ausgefüllt - etwa durch einen Bot - so wird das Formular als invalide gekennzeichnet und nicht abgeschickt. Wird mindestend die konfigurierte Zeit für das Ausfüllen benötigt, wird das Abschicken akzeptiert.

Nachteil dieser Vorgehensweise ist, dass die Zeit, die als minimale Ausfüllzeit hinterlegt wird, empirisch bestimmt werden muss. Das kann im schlechtesten Fall dazu führen, dass ein Benutzer ein Formular nochmals abschicken muss.


2.2. Umsetzung

Für die Umsetzung der unter 2.1. beschriebenen Idee wird im Folgenden ein neues Tag erstellt, das das Formular als invalid kennzeichnet, wenn die Zeit zwischen Aufruf und Absenden zu kurz ist. Da jedes Formular eine individuelle Ausfüllzeit besitzt, wird im Tag ein Attribut vorgesehen, mit dem die Ausfüllzeit konfigurierbar gestaltet wird. Die Signatur des Tags hat damit folgende Gestalt:
APF-Template
<form:antispam minfilltime="..." />
Vor der Verwendung des Tags muss dieser innerhalb des <html:form />-Tags per
APF-Template
<form:addtaglib namespace="..." prefix="form" class="antispam" >
bekannt gemacht werden.

Wie im Tutorial TagLibs erstellen beschrieben ist, muss für jeden Tag eine TagLib-Implementierung erstellt werden. Der Name der TagLib-Klasse ergibt sich dabei aus dem Präfix und der Klasse des Tags. Die Implementierung des Anti-Spam-Tags lautet damit form_taglib_antispam. Die Aufgabe der Klasse ist es nun, ein verstecktes Formularfeld hinzuzufügen, das speichert, wann das Formular ausgegeben worden ist. Weiterhin muss die Zeit zwischen dem letzten Request und der aktuellen Zeit vergleichen und bei Bedarf das Formular benachrichtigt werden. Der Code der Klasse stellt sich damit wie folgt dar:
PHP-Code
class form_taglib_antispam extends form_control { function form_taglib_antispam(){ } function onAfterAppend(){ // Attribute validieren if(!isset($this->__Attributes['minfilltime'])){ $FormName = $this->__ParentObject->getAttribute('name'); trigger_error('[form_taglib_antispam::onAfterAppend()] There is not attribute "minfilltime" given in the anti spam tag definition in form "'.$FormName.'"! Please provide the attribute mentioned containing the time in seconds the user needs to fill in the form.'); } // Formular als invalide markieren, falls die minimale Ausfuellzeit unterschritten wurde $AntiSpamName = $this->__getAntiSpamName(); if(isset($_REQUEST[$AntiSpamName])){ // Informationen ueber die aktuelle und die Zeit des letzten Aufrufs sammeln $CurrentTime = date('U'); $PreviousTime = $_REQUEST[$AntiSpamName]; $MinFillTime = $this->__Attributes['minfilltime']; // Formular als invalid markieren, falls notwenig if(($CurrentTime - $MinFillTime) < $PreviousTime){ $this->__ParentObject->set('isValid',false); } } } function transform(){ return ''; } function __getAntiSpamName(){ return strtolower($this->__ParentObject->getAttribute('name')).'_antispam'; } }
Die private Methode __getAntiSpamName() generiert den Namen des Feldes aus dem Namen des Formulars und dem Zusatz _antispam. Da der Name hart verdratet ist, darf das Anti-SPAM-Tag nur einmal pro Formular verwendet werden, da es sonst zu Überlagerungen kommt.


2.3. Beispiel

Wird der Button des Beispiel-Formulars innerhalb von weniger als 10 Sekunden geklickt, wird die Eingabe nicht akzeptiert und das Formular als invalid gekennzeichnet.

Das Formular ist valide!



Ein Manko der oben gezeigten Implementierung ist, dass ein auf Grund einer zu kurzen Ausfüllzeit als invalid gekennzeichnetes Formular beim zweiten Absenden erneut als invalid gekennzeichnet wird, da das Formular nach dem ersten Ausfüllen bereits gefüllt ist. Um dieses Problem zu umgehen, sollte der Status des Formulars ("Wurde das Formular schon einmal abgesendet?") in der Session mitgeführt werden.


3. CAPTCHA-Tag

3.1. Idee

Ähnlich dem im deutschsprachigen Forum unter http://forum.adventure-php-fra...p=125#p125 vorgestellten Konzept, soll in diesem Tutorial ein Tag erstellt werden, der zur erweiterten Validierung in ein Formular eingebunden werden kann. Der Tag soll zur generischen Verwendbarkeit folgende Attribute unterstützen:
  • button: Name des Buttons auf dessen Klick eine Validierung durchgeführt werden soll.
  • validate: "true", falls eine Validierung durchgeführt werden soll, "false" oder fehlendes Attribut, wenn keine Validierung gewünscht ist.
  • image_class: CSS-Klasse für das Captcha-Bild
  • image_style: CSS-Stile für das Captcha-Bild
  • text_class: CSS-Klasse für das Text-Feld
  • text_style: CSS-Stile für das Text-Feld
Aus den genannten Anforderungen ergibt sich folgende Tag-Beschreibung:
APF-Template
<form:captcha button = "" [validate = ""] [image_class = ""] [image_style = ""] [text_class = ""] [text_style = ""] />

3.2. Umsetzung

Um den Tag verwenden zu können, muss dieser dem Formular per
APF-Template
<form:addtaglib namespace="modules::captcha::pres::taglib" prefix="form" class="captcha" >
bekannt gemacht werden.


3.3. Beispiel

Das folgende Formular zeigt die Einsatzmöglichkeit des Tags. Aus Sicherheitsgründen generiert der Tag bei jedem Aufruf einen neuen Captcha-String.

Das Formular ist valide!

CAPTCHA


Kommentare

Möchten Sie den Artikel eine Anmerkung hinzufügen, oder haben Sie ergänzende Hinweise? Dann können Sie diese hier einfügen. Die bereits verfassten Anmerkungen und Kommentare finden Sie in der untenstehenden Liste.
Für diesen Artikel liegen aktuell keine Kommentare vor.