| | | | |
| |||||||
KategorienArtikelWerkzeuge | AnsichtenAffenformular (Standardverfahren)Aus PHP.de Wiki
Dieser Artikel befindet sich noch in der Bearbeitung. Das sogenannte Affenformular ist eine Codebasis bei der Verarbeitung von Webformularen. Sein Hauptzweck ist die Erstellung einer grundlegenden Formularverarbeitung: Darstellung eines Forms, Prüfung des Status, Selbstaufruf mit wiederaufgefüllten Eingabefeldern. In jedem Fall registriert ein solcher Code einen erfolgreichen Submit (i.A. einen POST Request) und führt eine Folgeaktion (Parameterverarbeitung oder erneutes Darstellen des Formularcodes) aus. Ob eine Validierung der übertragenen Feldwerte noch zum Affenformular gehört ist Ansichtssache.
AbgrenzungIm Vergleich zu klassischer, einfacher Formularverarbeitung – Script 1 stellt Formular dar, ein Submit führt nach Script 2, das die Verarbeitung übernimmt – ergibt sich im Affenformular-Verfahren vor allem ein Mehrwert für den Anwender: das Wiederauffüllen von Feld-Werten. Das Script bietet damit
Beide Punkte werden durch eine klassische Fomularverarbeitung allenfalls ansatzweise erreicht. Der wichtige Faktor des Wiederauffüllens von Eingabefeldern kann dort nur durch JavaScript-basierte Rückwärtslinks oder den Back-Button des Browsers erreicht werden und ist damit von der Funktionalität des verwendeten Browsers abhängig. Herleitung aus einer Standard-FormularverarbeitungAm Anfang steht die klassische Formularverarbeitung. Wir haben ein HTML-basiertes Formularscript, dessen Form-Action auf ein serverbasiertes Aktionsscript verweist. Ein Button erzeugt einen Request auf dieses Script und startet dessen Aktion.
Mehr Komfort bietet ein dynamisches Formular, das bei fehlerhaften Daten die bisherigen Daten in einem baugleichen Formular wieder darstellt. Für den Nutzer ergibt sich der Eindruck, das Formular würde erneut angezeigt.
UmsetzungDas Grundprinzip des Affenformulars ist der Selbstaufruf des Scripts. Die bisher auf ein Sende- und ein Empfängerscript verteilten Aufgaben - Form-Darstellung und Parameterableitung/Datenverarbeitung - geschehen nun in einem gemeinsamen Script. Damit ergibt sich eine neue Grundstruktur, da das Script nun verschiedene Zustände (entsprechend der nötigen Aufgabe) annehmen muß. Information: Erkennen des SubmitEntscheidend für die Funktion des Affenformulars ist die Unterscheidung zweier Zustände: des Erstaufrufs und der Formularabsendung. Ein Script, das erstmalig aufgerufen wird, kann daran zu erkennen sein, dass es meist als GET Request angefordert werden. Ein besseres Unterscheidungsmerkmal bildet aber ein übertragener Elementinhalt (Form Button oder sonstiges Eingabefeld), der bei einem Erstaufruf nicht übertragen wird. Erst bei Absenden des Formulars, tritt das Element und sein Wert als Teil der Requestparametermenge auf. Aufgrund Ihrer spezifischen Eigenschaften sind alle Form-Elemente außer Checkboxes und Selectfelder für die Unterscheidung des Status geeignet. Eine Erklärung dafür findet sich weiter unten. Problematik Enter-TasteAls allgemein üblich hat sich die Prüfung eines Submit-Buttons eingebürgert. Bsp. if (!empty ($_POST['Name_des_Buttons'])) { // Formular abgesendet // Zweig Formularverarbeitung } else { // Erstaufruf // Zweig Formulardarstellung } Diese Lösung schein zunächst offensichtlich, schließlich dient der Submit-Button einzig dem Zweck, ein Formular abzuschicken. Ein spezielle Browserverhalten führt aber zu Problemen: Viele Browser unterstützen auch das Absenden eines Formulars durch Drücken der Enter-Taste in einem Input-Text-Feld. Je nach Browserverhalten, wird in diesem Fall zwar das Formular abgeschickt (Submit), der vorhandene Submit-Button allerdings nicht betätigt. Infolgedessen taucht der Buttonwert nicht in der Menge der Requestparameter auf und die Formularverarbeitung wird nicht ausgeführt. Um das Problem zu umgehen, kann z.B. ein normales oder verstecktes Textfeld als auslösendes Element verwendet werden. Dabei ist ein Eintrag im Feld unerheblich, da auch leere Werte von Textfeldern als Wertepaar Textfeldname => NULL in der Parametermenge auftauchen und über Vorhandensein des Schlüssels erkannt werden können. if (isset ($_POST['Name_des_Textfelds'])) { // Formular abgesendet // Zweig Formularverarbeitung } else { // Erstaufruf // Zweig Formulardarstellung }
Wiederbefüllen/Wiederauswahl der ElementeFür die Umsetzung des Abschicken & Wiederauffüllen-Verfahrens müssen die unterschiedlichen Verhalten der HTML Eingabefelder berücksichtigt werden. Besonderes Augenmerk verdienen hier nicht ausgewählte Checkboxen und Radiobuttons, deren Werte beim Submit nicht übertragen werden. Die Grundlagen zur Übergabe von Formular-Parameterdaten sind bereits unter Formularverarbeitung beschrieben. Nachfolgend wird darauf aufbauend die Wiederbelegung der Elemente beschrieben. Textfeld und InputfeldHauptartikel Formularverarbeitung Textfelder Die unkomliziertesten Felder. Die Ausgabe erfolgt im value Attribut bzw. zwischen den Tags. Bitte Kapitel Problematik HTML Sonderzeichen beachten. <input type="text" name="Textfeld" value="<?php echo $_POST['Textfeld']; ?>"> <textarea name="Textbox"><?php echo $_POST['Textbox']; ?></textarea> AuswahlelementeHauptartikel Formularverarbeitung Auswahlfelder | Selections Für alle anderen Elemente muß die jeweilige Auswahl durch ein spezielles Attribut (je nach Typ checked oder selected) gekennzeichnet werden. Das Vorgehen unterscheidet sich lediglich im Datentyp, das das Element liefert. Problematik HTML SonderzeichenBesondere Vorsicht ist bei den Elementtypen Textfeld und Inputfeld geboten: Während bei allen anderen Elementen die Übergabeparameter nur durch PHP verglichen werden, werden hier direkt Daten in den Browserquelltext geschrieben. Da PHP vor dem Browserrendering geschieht, kann dieser natürlich nicht zwischen umschließendem HTML-Formcode und Eingabedaten unterscheiden.
<?php $eingabe = 'Peter sagte "Halt!"'; ?> <input type="text" value="<?php echo $eingabe; ?>"> ergäbe <input type="text" value="Peter sagte "Halt!"">wobei der Browser "Peter sagte " als Attributwert für value interpretierte. Ein folgendes > würde auch das input Element verlassen usw. Analog kann über einen unbearbeiteten Parameter auch Stylesheet-Formatierung oder - weit mächtiger - JavaScript Code in das Script eingeschleust werden. Dieses Verfahren nennt man Cross Site Scripting.
<input type="text" value="Peter sagte "Halt!"">Achtung: |