Hallo Rouven,
- Gibt es noch weitere innovative Vorschläge?
Ich wüßte nichts...
- Was ist die technisch "beste" (nach Erfahrungen) Lösung?
IMHO mit Sessions.
a) funktioniert das auch mit ohne JS
b) brauchst Du im Gegensatz zu Hidden-Feldern die Validierung nur einmal pro Formular durchführen
Das einzige Problem bei der ganzen Geschichte ist Vor/Zurück. Denn bei POST-Formularen ist es ätzend, mit Zurück zu navigieren.
Ich würde daher das ganze so lösen:
1. Ein Script, das das Formular anzeigt. Nennen wir es mal form.php. Dieses Script erhält einen Parameter, nämlich die Seitennummer. Bei einer ungültigen oder keiner Seitennummer wird automatisch die Seite 1 angezeigt. Falls die Seitennummer gültig ist, jedoch in einer vorigen Seite noch keine erfolgreichen Eingaben gemacht wurden, wird diejenige Seite, auf der noch keine Eingaben gemacht wurden, angezeigt. Ansonsten wird die Seite, die angefragt wurde, angezeigt.
2. Ein Script, das das Formular verarbeitet. Nennen wir es mal post.php. Dieses Script verarbeitet die Eingaben und leitet _dann_ auf form.php mit der nächsten Seite weiter. Dadurch wird die Vor/Zurück-Funktionalität erhalten. Dazu unten etwas mehr.
Die Daten könntest Du in einer Session-Variable $_SESSION['pages'] abspeichern. Diese sollte als Schlüssel die Seitennummer haben. Als Werte sollte ein assoziatives Array sein, dass drei Elemente enthält: 'filled_in', 'form_data', 'validated_data' und 'form_errors'. filled_in ist entweder true oder false, das gibt an, ob das Formular ausgefüllt wurde *und* die Validierung erfolgreich war. form_data enthält die rohen Formulardaten, falls die Validierung fehlgeschlagen ist. validated_data enthält die validierten Daten. form_errors enthält alle Fehlermeldungen, die bei der Validierung aufgetreten sind.
Über $_SESSION['pages'][0]['filled_in'] kannst Du feststellen, ob die Seite 1 ausgefüllt wurde.
Wenn nun form.php etwas anzeigen soll und bereits die richtige Seitennummer (s.o.) kennt, dann soll sie über $_SESSION['pages'][$nummer]['filled_in'], ob das Formular korrekt ausgefüllt wurde. Falls ja, soll sie die Daten aus $_SESSION['pages'][$nummer]['validated_data'] nehmen und nochmal das Formular anzeigen. Falls nein, soll sie die Daten aus $_SESSION['pages'][$nummer]['form_data'] nehmen und nochmal das Formular anzeigen. Dabei soll sie alle Fehlermeldungen in $_SESSION['pages'][$nummer]['form_errors'] anzeigen.
Wenn nun ein POST-Request auf post.php ankommt, dann muss post.php erst einmal prüfen, ob dieser Request überhaupt gültig war, d.h. diese Seite bereits ausgefüllt werden durfte. Wenn das der Fall ist, muss post.php die Eingabe validieren. Falls die Eingabe valide ist, soll $_SESSION['pages'][$nummer]['validated_data'] gefüllt werden, $_SESSION['pages'][$nummer]['filled_in'] auf true gesetzt werden und auf form.php mit einer Seitennummer größer weitergeleitet werden. Falls die Daten nicht valide sind, soll $_SESSION['pages'][$nummer]['filled_in'] auf false gesetzt werden, $_SESSION['pages'][$nummer]['form_data'] und $_SESSION['pages'][$nummer]['form_errors'] gefüllt werden und $_SESSION['pages'][$nummer]['validated_data'] gelöscht werden. Nun soll auf form.php mit der aktuellen Seitennummer weitergeleitet werden.
Die Weiterleitung solltest Du, falls der Browser die Anfrage über HTTP/1.1 schickt, über einen Status 303 (der für Weiterleitungen nach POST vorgesehen ist, allerdings erst in HTTP/1.1) machen:
if ($_SERVER['SERVER_PROTOCOL'] == 'HTTP/1.1') {
Header ('HTTP/1.1 303 See Other');
}
Ansonsten lässt Du PHP automatisch den 302er schicken. Daraufhin sendest Du den normalen Location-Header.
So würde ich das lösen... ich hoffe Du verstehst, was ich meine. :)
Viele Grüße,
Christian