Formitude V1.4 - Dokumentation

(c) 2005/2006 Carsten Meier

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

Inhaltsverzeichnis

  1. Einleitung
  2. Funktionsweise
  3. Ausgabe
  4. Item-Klassen
    1. Block
    2. Info
    3. Text-Field
    4. HTTP-Address-Field
    5. E-Mail-Address-Field
    6. Date-Field
    7. Time-Field
    8. Text-Area
    9. Check-Box
    10. Select
    11. Radio-Button
  5. Mehrseitige Formulare
  6. Weitere Formular-Funktionen
  7. Erweiterung um eigene Item-Klassen
  8. Änderungen zu vorherigen Versionen
  9. Kontakt

1 Einleitung

Formitude ist eine in PHP geschriebene Bibliothek zum Generieren und Validieren von HTML-Formularen. Der Inhalt der Formulare wird über Items festgelegt, die die Darstellung und die Validierung der einzelnen Daten übernehmen. Es sind bereits Item-Klassen für die folgenden Anwendungen enthalten:

Durch die offene Architektur von Formitude läßt sich die Bibliothek leicht um weitere Item-Klassen für spezielle Einsatzzwecke erweitern. Dabei werden sowohl einseitige als auch mehrseitige Formulare unterstützt. Das Aussehen läßt sich durch die konsequente Nutzung von HTML-Klassen und -IDs leicht über Stylesheets anpassen. Außerdem können die auszugebenden Statusmeldungen frei bestimmt werden.

Bei der vorliegenden Fassung handelt es sich um Version 1.4 vom 18.8.2006. Aktuelle Informationen finden Sie auf der Formitude-Homepage.

Das Archiv enthält folgende Dateien:

formitude.php
Formitude-Bibliothek
formitude-demo.php
Demo
formitude.css
Beispiel-Stylesheet
LICENSE
Eine Kopie der GNU Lesser General Public License V2.1
LIESMICH.html
Die Datei, die Sie gerade lesen

Es wird PHP >= 4.3.0 benötigt. Das Skript wurde unter den PHP-Versionen 4.3.3 und 5.1.4 mit den Laufzeit-Optionen register_globals off und allow_call_time_pass_reference off getestet.

2 Funktionsweise

Um die Formitude-Funktionen zu nutzen, kopieren Sie einfach die Datei formitude.php in ein Verzeichnis innerhalb Ihres PHP-Include-Pfades.

Die Demo-Dateien formitude-demo.php und formitude.css können Sie an einem beliebigen Ort unterhalb Ihres Doc-Root-Verzeichnisses ablegen. Die Demo soll nun im Detail erläutert werden.

Nach dem Einbinden der Bibliothek mittels

include_once 'formitude.php';

wird zunächst das Grundgerüst des Formulars mit der Funktion formitude_create_form() erzeugt. Diese hat folgende Signatur:

function &formitude_create_form($url, $method, $charset, &$messages,
	$htmlidprefix = 'formitude_', $htmlclassprefix = 'formitude_',
	$optionidprefix = '_', $submitctl = '__formitude_submit_button',
	$namectl = '__formitude_form_name')

Der Funktion werden die folgenden Argumente übergeben:

$url
Die URL, welche nach Betätigung eines Submit-Buttons aufgerufen wird. (Es muß eine absolute URL sein!)
$method
Die Übertragungsmethode. Hier ist 'post' oder 'get' zulässig.
$charset
Die verwendete Zeichenkodierung
&$messages
Das Array mit den Status-Meldungen (es sind bereits die Arrays $formitude_messages_de und $formitude_messages_en definiert, welche Sie durch Kopieren und Überschreiben der einzelnen Werte anpassen können)

Die letzten fünf Parameter sind mit Vorgabewerten belegt und können in den meisten Fällen einfach weggelassen werden:

$htmlidprefix
Ein Präfix, welches allen generierten HTML-IDs vorangestellt wird.
$htmlclassprefix
Ein Präfix, das allen generierten HTML-Klassen vorangestellt wird.
$optionidprefix
Das Präfix wird, nach dem HTML-ID-Präfix und dem Control-Namen, den einzelnen Radio-Button-IDs vorangestellt.
$submitctl
Der Control-Name des Submit-Buttons
$namectl
Der Name des Controls in dem der Name des gesendeten Formulars übergeben wird.

Bei dem zurückgegebenen Formular handelt es sich um ein Array, bei dem folgende Schlüssel, je nach später verwendeter Darstellungsfunktion, noch manuell gesetzt werden müssen, oder automatisch gesetzt werden:

'name'
Der Name des Formulars. Dieser wird zur Identifizierung des gesendeten Formulars benutzt. Wenn Sie lediglich ein Formular unter der angegebenen URL darstellen, können Sie es bei dem voreingestellten Wert 'form' belassen.
'values'
Sämtliche Werte des Formulars als Array mit Schlüssel-/Wert-Paaren. Auf dieses müssen Sie lediglich zugreifen, wenn Sie die Ablaufsteuerung für spezielle Einsatzszenarien selbst implementieren wollen.
'items'
Das Array enthält die darzustellenden Items. Bei einseitigen Formularen muß das Array direkt gesetzt werden. Bei mehrseitigen Formularen wird für jede Seite ein Array mit Items erzeugt, welches dann automatisch hier eingetragen wird.
'submit_buttons'
Das Array mit den Submit-Buttons. Der Schlüssel wird zur Identifizierung benutzt, der Wert enthält jeweils die anzuzeigende Beschriftung. Die einzelnen Submit-Buttons werden allerdings durch die Beschriftung unterschieden. Achten Sie also darauf, keine gleichen Beschriftungen zu verwenden! Bei mehrseiten Formularen wird automatisch ein Button mit den Beschriftung 'Weiter' bzw. 'Fertigstellen' erzeugt.

Der entsprechende Funktionsaufruf in der Demo sieht folgendermaßen aus:

$form = &formitude_create_form(
	'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'], 'post',
	'iso-8859-1', $formitude_messages_de);

Danach werden die anzuzeigenden Items des Formulars erzeugt und in einem Array abgelegt. Da es sich um ein einseitiges Formular handelt, wird das erzeugte Array direkt in das 'items'-Feld eingetragen.

$form['items'] = array(
	formitude_create_block('<h3>Demoformular</h3>', 'caption'),
	formitude_create_text_field('name', 'Name', true, 80),
	formitude_create_select('figur', 'Lieblingsfigur',
		array(
			'milhouse'	=> 'Milhouse',
			'burns'		=> 'Clifford Montgomery Burns',
			'flanders'	=> 'Flanders'),
		false, 0),
	formitude_create_check_box('todd_smells', 'Todd müffelt'),
	formitude_create_text_area('kommentar', 'Kommentar', true, 200),
	formitude_create_email_address_field('email', 'E-Mail', true),
	formitude_create_http_address_field('url', 'Homepage', false),
	formitude_create_check_box(
		'serious', 'Diese Angaben sind wirklich ernst gemeint!', true),
	formitude_create_block('<h4>Nächste Folge</h4>', 'caption'),
	formitude_create_date_field('datum', 'Datum', false),
	formitude_create_time_field('zeit', 'Uhrzeit', false)
);

Den Erzeugungsfunktionen für Controls werden, neben anderen Argumenten, zuerst der Control-Name und die anzuzeigenden Beschriftung übergeben. Auf die einzelnen Items wird später noch genauer eingegangen.

Mit dem Setzen des 'submit_buttons'-Feldes ist die Initialisierung des Formulars abgeschlossen:

$form['submit_buttons'] = array('submit' => 'Absenden');

Bei einseitigen Formularen wird die Anzeige, sowie die komplette Ablaufsteuerung inkl. Validierung, von der Funktion formitude_perform_dialog() übernommen:

$values = array(
	'todd_smells'	=> '1',
	'url'		=> 'http://www.internalscripts.de/');
$button = formitude_perform_dialog($form, $values,
	'<p>Die mit * gekennzeichneten Felder müssen ausgefüllt werden!</p>');

Die Funktion bekommt folgende Argumente übergeben:

Nach erfolgreicher Validierung wird der Schlüssel des benutzten Submit-Buttons zurückgegeben. Bei der ersten Anzeige des Formulars oder bei fehlgeschlagener Validierung wird NULL geliefert.

if($button == 'submit')
{
	// Formular wurde validiert, Daten ausgeben
	formitude_print_entries($form);
	...
}

Die Werte des Formulars können mit Hilfe der Funktion formitude_print_entries() als Tabelle ausgegeben werden. Wenn Sie die Daten des Formulars als E-Mail verschicken, oder vor der Ausgabe noch weiter bearbeiten möchten, können Sie alternativ auch die Funktion formitude_get_entries() benutzen, die diese Tabelle als String zurückgibt:

$ctlnames = NULL;
$str = formitude_get_entries(
	$form, $ctlnames, 'Sie haben folgende Daten eingegeben');

Die Variable $ctlnames enthält nun ein Array mit allen ausgegebenen Control-Namen (nicht die Formularwerte!), die Variable $str die Tabelle als String. Das optionale dritte Argument bestimmt die auszugebende Statusmeldung.

3 Ausgabe

Die Formulare werden als zweispaltige HTML-Tabelle ausgegeben. Dabei werden den einzelnen Tabellenzellen sowie dem umgebenden <form>-Element die unten angegebenen HTML-Klassen zugewiesen. Beachten Sie bitte, daß den Klassen jeweils noch das bei der Formularerzeugung angegebene Präfix vorangestellt wird.

+---------------------------------------+	<form>
|                 form                  |
| +-----------------------------------+ |	<table>
| |              status               | |	Statuszeile
| +---------+-------------------------+ |
| |  label  |          field          | |	beliebiges Eingabefeld
| +---------+-------------------------+ |
| |  label  |          radio          | |	Radio-Buttons
| +---------+-------------------------+ |
| |             checkbox              | |	Checkbox
| +-----------------------------------+ |
| |               error               | |	evtl. Fehlermeldung
| +-----------------------------------+ |
| |              action               | |	Submit-Buttons
| +-----------------------------------+ |
+---------------------------------------+

In der Demo wird außerdem noch die Klasse caption benutzt um die Überschriften farblich zu hinterlegen.

Bei Ausgabe der Formularwerte mittels formitude_print_entries() wird das umgebende <form>-Element durch eine <div> mit der Klasse entries ersetzt. Die einzelnen Werte werden dabei in ein <div>-Element mit der Klasse value eingeschlossen.

Analog zu den Klassen wird auch allen IDs ein Präfix vorangestellt. Den umgebenden <form>- oder <div>-Elementen werden die IDs Präfix + form bzw. entries zugewiesen, für die Controls wird Präfix + Control-Name benutzt.

4 Item-Klassen

Nachfolgend sind alle Item-Klassen mit den dazugehörigen Erzeugungsfunktionen aufgeführt. Diese geben jeweils eine Referenz auf ein Array zurück.

4.1 Block

Ein Block kann zur Ausgabe beliebiger Inhalte dienen. Bei der Erzeugung werden der Text (evtl. auch mit HTML-Auszeichnungen) und die zu verwendende HTML-Klasse übergeben. In der Demo sind die Überschriften auf diese Weise realisiert.

function &formitude_create_block($text, $htmlclass)

4.2 Info

Info-Items werden typischerweise zur Anzeige von Daten verwendet, die in vorhergehenden Formularseiten gesammelt wurden. Es muß die Beschriftung und der auszugebende Text angegeben werden. Außerdem kann angegeben werden, ob in dem Text vorhandene HTML-Sonderzeichen automatisch HTML-Entity-kodiert werden sollen.

function &formitude_create_info($label, $text, $htmlencodetext = false)

4.3 Text-Field

Einzeiliges Text-Eingabe-Feld. Neben dem Control-Namen und der Beschriftung wird angegeben, ob eine Eingabe zwingend erforderlich ist und wieviele Zeichen maximal eingegeben werden können.

function &formitude_create_text_field(
	$name, $label, $required, $maxlen)

4.4 HTTP-Address-Field

Dient zur Eingabe einer HTTP-URL. Führende und angehängte Whitespace-Zeichen werden automatisch aus den Formulardaten entfernt. Whitespace-Zeichen innerhalb der eingegebenen Adresse werden nicht akzeptiert.

function &formitude_create_http_address_field(
	$name, $label, $required)

4.5 E-Mail-Address-Field

Dient zur Eingabe einer E-Mail-Adresse. Führende und angehängte Whitespace-Zeichen werden automatisch aus den Formulardaten entfernt. Whitespace-Zeichen innerhalb der eingegebenen Adresse werden nicht akzeptiert.

function &formitude_create_email_address_field(
	$name, $label, $required)

4.6 Date-Field

Dient zur Eingabe eines Datums. Es sind nur Daten erlaubt, die sich mit einem *nix-Zeitstempel darstellen lassen (ungefähr 1901-2038). Führende und angehängte Whitespace-Zeichen werden automatisch aus den Formulardaten entfernt.

function &formitude_create_date_field(
	$name, $label, $required)

Zum Parsen des als String zurückgegebenen Datums können Sie die Funktion formitude_parse_date() benutzen, die ein Array mit den Feldern 0 => Monat, 1 => Tag, 2 => Jahr liefert.

4.7 Time-Field

Dient zur Eingabe einer Uhrzeit. Führende und angehängte Whitespace-Zeichen werden automatisch aus den Formulardaten entfernt.

function &formitude_create_time_field(
	$name, $label, $required)

Zum Parsen der als String zurückgegebenen Uhrzeit können Sie die Funktion formitude_parse_time() benutzen, die ein Array mit den Feldern 0 => Stunden, 1 => Minuten, 2 => Sekunden liefert.

4.8 Text-Area

Mehrzeiliges Text-Eingabe-Feld.

function &formitude_create_text_area(
	$name, $label, $required, $maxlen)

4.9 Check-Box

Zur Erzeugung eines Ein-/Aus-Schalters wird der Control-Name, die Beschriftung und ein optionales Argument übergeben, mit dem der Schalter als Pflichtfeld markiert werden kann.

function &formitude_create_check_box(
	$name, $label, $required = false)

Bei einer aktivierten Checkbox wird der Formularwert '1' als String zurückgegeben.

4.10 Select

Auswahlliste, die entweder als Drop-Down-Box oder als Listbox angezeigt werden kann. Mit dem $rows-Parameter wird die Anzahl der Zeilen der Listbox angegeben. Ist dieser gleich 0 wird eine Drop-Down-Box angezeigt.

Die einzelnen Optionen werden als Array mit dem $options-Argument übergeben. Der Schlüssel wird dabei als Formulardatum verwendet, der Wert bestimmt die anzuzeigende Beschriftung. Ist bei $htmlencodeopt true angegeben, so werden in der Beschriftung vorkommende HTML-Sonderzeichen automatisch als Entity-Referenzen kodiert.

function &formitude_create_select(
	$name, $label, $options, $required, $rows = 0, $htmlencodeopt = false)

4.11 Radio-Button

Knopfliste, bei der jeweils nur ein Knopf aktiv sein kann. Mit dem $br-Parameter wird festgelegt, ob nach jeder Auswahlmöglichkeit ein Zeilenumbruch eingefügt werden soll. Hier ist true oder false möglich.

Die einzelnen Optionen werden als Array mit dem $options-Argument übergeben. Der Schlüssel wird dabei als Formulardatum verwendet, der Wert bestimmt die anzuzeigende Beschriftung.

function &formitude_create_radio(
	$name, $label, $options, $required, $br = 0)

Den einzelnen <input>-Elementen wird dabei eine ID zugewiesen, die sich folgendermaßen zusammensetzt:

HTML-ID-Präfix + Control-Name + Option-ID-Präfix + Formularwert

5 Mehrseitige Formulare

Bei mehrseitigen Formularen wird zunächst wie oben gezeigt, ein Formular mit Hilfe der Funktion formitude_create_form() angelegt. Dies muß jedoch nicht weiter initialisiert werden, da die Felder 'name', 'items' und 'submit_buttons' während der Durchführung eines Dialogs mit der folgenden Funktion automatisch gesetzt werden.

function formitude_perform_multipage_dialog(
	&$form, &$values, &$pages, $preface = '')

Diese bekommt die folgenden Argumente übergeben:

&$form
Das Formular
&$values
Die Werte des Formulars (wie bei einseitigen Forumlaren)
&$pages
Ein Array, das die einzelnen Formularseiten enthält. Die Schlüssel werden dabei jeweils als Name der Formularseite eingesetzt, als Werte sind Arrays mit den darzustellenden Items enthalten.
$preface
sowie ein optionaler String, der bei dem ersten Aufruf des Formulars angezeigt wird.

Nach erfolgreicher Anzeige und Validierung aller Formularseiten wird true zurückgegeben, ansonsten false. Bitte beachten Sie, daß nach dem Absenden einer beliebigen Formularseite auch die Validierungsfunktionen aller vorhergehenden Seiten ausgeführt werden, um das Einschmuggeln falscher Werte zu verhindern.

6 Weitere Formular-Funktionen

Funktionen zur Ablaufsteuerung

function formitude_get_submitted_form_name(&$form)

Gibt den Namen des übermittelten Formulars zurück.

function formitude_get_submit_button(&$form)

Gibt den Namen des übermittelten Submit-Buttons zurück. Dabei findet keine Prüfung statt, ob der Button zu dem übergebenen Formular gehört.

function formitude_import_submitted_values(&$form)

Die übermittelten Werte werden in das Formular-Objekt kopiert. Die Variablen zur internen Ablaufsteuerung werden dabei nicht übernommen.

function formitude_check_values(&$form)

Überprüft die Werte des Formulars mit Hilfe der Validierungsfunktionen der Items und setzt die Fehlermeldungen entsprechend. Entsprechen alle Werte der gewünschten Form, wird true zurückgegeben, ansonsten false.

Formulardarstellung

function formitude_get_form(&$form, $statusmsg = '')

Holt das Formular als darstellbaren String. $statusmsg wird im Kopf des Formulars angezeigt.

Nützliches

function formitude_build_get_url($url, &$getvars)

Erzeugt zu $url einen fertig kodierten GET-Request-String. $getvars ist ein Array mit den entsprechenden Schlüssel-/Wert-Paaren. Ist das Array leer, wird nur $url geliefert.

function &formitude_get_request_method_vars($method)

Gibt, abhängig von $method ('get' oder 'post'), eine Referenz auf das Array $_GET oder $_POST zurück.

7 Erweiterung um eigene Item-Klassen

Die Item-Objekte sind als Arrays angelegt, in denen die folgenden Felder als Variablenfunktionen erwartet werden:

'get_control'
function(&$item, &$form, &$ctlnames_out)
Wird aufgerufen, um das Item als Control darzustellen.
'get_entry'
function(&$item, &$form, &$ctlnames_out)
Wird aufgerufen, um die Werte des Items darzustellen.
'check_value'
function(&$item, &$form)
Wird zum Validieren des Formulars für jedes Item aufgerufen. Schlägt die Validierung fehl, so wird eine Fehlermeldung als String zurückgegeben, ansonsten NULL

Die Variablenfunktionen 'get_control' und 'get_entry' geben die Ausgabe als String zurück. Außerdem wird erwartet, daß die mit diesem Item assoziierten Control-Namen in $ctlnames_out als Array ablegt werden. Bei rein optischen Elementen muß ggf. ein leeres Array zugewiesen werden.

Um die umschließenden Elemente eines Controls zu erzeugen, sollten die von den folgenden Funktionen gelieferten Strings dem eigentlichen Element vorangestellt bzw. angehängt werden:

Der Wahrheitswert $labelcol bestimmt, ob eine separate Spalte mit der Beschriftung ausgegeben werden soll. $labelfor gibt den Namen des Controls an, für das ein <label>-Element erzeugt werden soll. Wird hier ein leerer String oder NULL übergeben, wird die Beschriftung nicht in ein <label>-Element eingebettet. In $add kann ein zusätzlich zur Beschriftung auszugebener Text angegeben werden. $fieldclass spezifiziert die der Tabellenzelle zuzuordnende HTML-Klasse ohne Präfix.

Analog ist bei der Ausgabe des Werts über 'get_entry' vorzugehen:

Folgende Daten können von Item-Objekten über das übergebene $form-Array ausgelesen werden:

'charset'
Verwendete Zeichenkodierung
'messages'
Array mit Statusmeldungen (für die verwendeten Schlüssel sehen Sie sich bitte den Quelltext an)
'html_id_prefix'
Präfix für HTML-IDs
'html_class_prefix'
Präfix für HTML-Klassen
'option_id_prefix'
Präfix für IDs von Optionen. Zusätzlich werden auch noch das HTML-ID-Präfix und der Control-Name vorangestellt.
'values'
Array mit den aktuellen Formularwerten

8 Änderungen zu vorherigen Versionen

Alle hier aufgeführten Versionen sind (solange keine undokumentierten Funktionen benutzt wurden) abwärtskompatibel zu Vorgängerversionen. Ein Update kann durch das Kopieren der Datei formitude.php erfolgen.

Änderungen in Version 1.4

Änderungen in Version 1.3

Änderungen in Version 1.2

Änderungen in Version 1.1

9 Kontakt

Aktuelle Informationen und die neueste Version finden Sie auf der Formitude-Homepage. Wenn Sie Fragen zu dem Skript stellen, oder einen Kommentar abgeben möchten, können Sie dies im Formitude-Forum tun. Bitte geben Sie bei Problemen unbedingt die verwendeten PHP- und Skript-Versionen, sowie das verwendete Betriebssystem an!

Unterstützen Sie die Entwicklung weiterer, frei verfügbarer Skripte durch das Setzen eines Links zu http://www.internalscripts.de/ . Vielen Dank!

Anschrift des Autors:

Carsten Meier
Under de Diek 19
D-26757 Borkum
Deutschland

Website: Internal Scripts - PHP-Skripte und mehr
E-Mail: [cm at internalscripts dot de]

Fragen zur Benutzung des Skripts bitte im Forum stellen!