[<---]
So, jetzt fragen sich alle, die hier noch nicht abgeschaltet haben, sicherlich, wie ich jetzt stinknormale Formularfelder hinzufüge. Dazu habe ich die Klasse FormField erstellt, die in der Datei FormField.class.php (was war anderes zu erwarten *g*) vorhanden ist. Diese Besitzt einen Konstruktor, der 7 Parameter erwartet: Das Formular, den Namen des Feldes (Inhalt des Name-Attributs), den Text/Titel des Feldes (was halt im Label steht), ein Objekt des Typs FormFieldValidator, das Vaterobjekt (kommt später noch, im Moment ist nur wichtig, das das auch null sein darf, aber wie das Locale per Referenz übergeben werden *muss*), die Größe (size-Attribut) und die maximale Länge (maxlength-Attribut). Der Konstruktor "registriert" das Feld automatisch in einer internen Liste des Formulars. (erster Parameter) Hierbei kommt ein kleineres technisches Problem auf. [4] Das Formularfeld besitzt noch einige öffentliche Eigenschaften:
- field_required: true: *Muss* das Feld validieren (wenn nicht => Fehler) oder false: *sollte* das Feld validieren (wenn nicht => Warnung und der Defaultwert wird verwendet) Standard: false.
- value: der Wert des Feldes zum späteren Zugriff.
- default_value: der Standardwert des Feldes. (funktioniert nur in Verbindung mit field_required = false)
- password_field: ist es ein Passwortfeld oder ein normales Textfeld.
Daraufhin besitzt die Klasse noch Methoden:
- validate: Validiert dieses Formularfeld. Daraufhin wird die öffentliche Variable value gesetzt. Wird vom Formular aufgerufen.
- fetch_default: Wird von der Funktion fetch des Formulars aufgerufen, falls kein Ausgabeobjekt angegeben wurde.
Jetzt gibt es noch eine Klasse FormFieldSet, und bei der kommt dann das Vaterobjekt zu tragen. Wenn man nämlich ein Objekt der Klasse FormFieldSet als Vaterobjekt eines FormFields angibt, dann wird das Formularfeld im Vaterobjekt und nicht im Formular registriert. Der Konstruktor der Klasse erwartet drei Parameter: Das Formular, den Titel und das Vaterobjekt. (man kann beliebig verschachteln) Es gibt wieder die zwei Funktionen validate (die ihrerseits alle Unterelemente aufruft) und fetch_default (die mit <fieldset> und <legend> die Ausgabe erzeugt und dann alle Kindelemente aufruft)
Tja, jetzt ist das ganze natürlich sehr 'trocken', ohne dass man jetzt mal ein Beispiel für die Verwendung sieht, daher hier der Inhalt meines Testformulars (das ganze gehört natürlich noch in eine HTML-Datei eingebettet):
------------------------------------------------------------------------------------------
require_once "Form.class.php";
require_once "FormField.class.php";
require_once "FormFieldSet.class.php";
require_once "FormFieldValidator.class.php";
// create a null locale
$mylocale = null;
// create null parent object
$npo = null;
// create the validators
$username_validator =& new FormFieldValidator ($mylocale, null, 32);
$password_validator =& new FormFieldValidator ($mylocale, null, 32);
// create the form
$login_form =& new Form ("loginform", "Login", $npo);
// create a sample fieldset
$login_fieldset =& new FormFieldSet ($login_form, "Login", $npo);
$u_fieldset =& new FormFieldSet ($login_form, "Username", $login_fieldset);
$p_fieldset =& new FormFieldSet ($login_form, "Password", $login_fieldset);
// create username field
$login_field =& new FormField (&$login_form, "username", "Username", $username_validator, $u_fieldset, 20, 32);
$login_field->field_required = true;
// create password field
$password_field =& new FormField (&$login_form, "password", "Password", $password_validator, $p_fieldset, 15, 32);
$password_field->field_required = false;
$password_field->password_field = true;
// was the form processed?
if ($login_form->wasProcessed ()) {
// validate it
switch ($login_form->validate ()) {
case 0: // did it validate?
// check username
if ($login_field->value != 'christian' || $password_field->value != 'test') {
// oooops - auth failure and redisplay
$login_form->addError ('Authentication failure.');
$login_form->display ();
break;
} else {
// display data
echo "USERNAME: " . $login_field->value . "<br />";
echo "PASSWORD: " . $password_field->value . "<br />";
break;
}
break;
case -1: // errors
case -2: // or warnings
default: // or something strange occured
// redisplay the form
$login_form->display ();
break;
}
return;
} else {
// ok, first call, display the form
$login_form->display ();
}
------------------------------------------------------------------------------------------
(ich habe hier die FieldSets sehr gekünselt verwendet, prinzipiell würde ich die warscheinlich nicht so einsetzen) Ach ja, ein Formularelement kann auch direkt 'Unterelement' eines Formulars sein, ein FieldSet ist nicht notwendig, hier hab' ich es bloß so gemacht.
Ach ja, der Code, der standardmäßig Produziert wird, ist XHTML-Kompatibel (auch Version 1.1) und jedes Formularfeld bekommt einen eigenen Absatz.
So, jetzt würde ich gerne Eure Meinung dazu hören, wenn ihr wollt, dann kann ich auch mal den Code schon mal vorveröffentlichen [5] - ist aber noch lange nicht fertig. Was ich noch gerne realisieren würde, wären
a) Tabellen, bei denen jede Zeile die gleichen Eingabefelder hat - da habe ich auch schon etwas versucht, aber mir fehlt irgendwie das Konzept... :(
b) Andere Eingabefelder als nur normale Inputs - ich könnte mir ein FormSelectField oder auch ein FormDateSelectField vorstellen...
Noch etwas: Die Klassen verwenden $_POST, daher funktioniert das nicht mit GET-Formularen (könnte ich später vielleicht auch noch einbauen) und außerdem erst ab PHP 4.1.
Grüße,
Christian
-------------------------------------
[4] Das Problem wird in http://www.php3.de/manual/de/language.oop.newref.php beschrieben.
[5] Und dann wäre da noch das Problem mit der Lizenz, ich würde ja eigentlich gerne die GPL nehmen, vor allem wg. der Restriktionen zu proprietärer Software, aber a) weiß ich nicht, inwiefern es sinnvoll ist, proprietäre Software überhaupt einzuschränken (ich möchte nicht zu sehr ideologisch denken, das ist auch nicht gut, wenn man verblendet ist) und b) Christoph Zurnieden mich darauf aufmerksam gemacht hat, das die GPL nicht sinnvoll ist, da sie inkompatibel mit der PHP-Lizenz ist. GPL werde ich auf keinen Fall verwenden (wg. Punkt b), aber zum Punkt a würde ich gerne ein paar Meinungen hören.
Sollen sich alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen und nicht mehr davon erfasst haben als eine Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst.
-- Albert Einstein