Anwendungsbeispiel: Formular über mehrere Seiten mit Übergabe der Werte über Session
Veröffentlichungsdatum: 21. Juni 2021
Änderungsdatum: 13. November 2025
weblication cms formular session seiten mehrere werte übergeben
Formulare lassen sich auch auf mehrere Seiten aufteilen.
Zur Umsetzung empfehlen wir das Zusatzmodul Formular-Editor, über welches komfortabel über den Struktureditor und die Formularmasken gearbeitet werden kann. Das folgende Beispiel führt eine Umsetzung eines Formulares über drei Seiten an.
Wichtig:
Werden in einer Seite sessionbasierte Inhalte ausgegeben, muss der Seiten-Cache deaktiviert werden.
Schritt 1: Formular in Seite 1 anlegen
Legen Sie in einer Seite ein Formular mit den gewünschten Feldern an (z.B. /de/kontakt/formular-seite1.php). Über die erweiterten Formulareinstellungen hinterlegen Sie den Skript-Code, um die im Formular eingegebenen Werte in der Session zu speichern und auszulesen und definieren die Seite, an welche die Formularangaben nach dem Abschicken übergeben werden sollen.
Im Beispiel ist im Feld "Nach dem Absenden aufzurufende URL" die entsprechende Seite mit dem Projektpfad beginnend hinterlegt (z.B. /de/kontakt/formular-seite2.php).
Im Skript-Feld "Vor der Erstellung auszuführendes Skript" definieren Sie zu den bestehenden Formularfeldern das Auslesen der bereits befüllten Felder (für ein eventuelles zurück blättern der nachfolgenden Formularseiten). Im Standard ist dieses Feld noch nicht befüllt, ansonsten belassen Sie bereits hinterlegten Code im Feld und fügen den neuen Code hinten an.
Im Skript-Feld "Nach dem Absenden auszuführendes Skript" definieren Sie zu den Formularfeldern den Skript-Code zum Speichern der Formularfeld-Werte in die Session. Fügen Sie diesen an den entsprechenden Stellen des schon existierenden Codes ein.
Damit beim Abschicken dieser Formularseite keine E-Mail verschickt wird, löschen Sie über den Datei-Quelltext zum Formular alle wd:item Elemente vom type="formular.variable" bis auf das mit fragment name "redirectSuccess" ("Nach dem Absenden aufzurufende URL").
Den Skript-Code aus dem Beispiel können Sie nachfolgend entnehmen.
Formular 1: Vor der Erstellung auszuführendes Skript (serverEventOnBeforeBuild)
// ANFANG
// Werte aus bereits befüllten Feldern übernehmen ...
// Definiert, welche Felder auf dieser Seite befüllt werden sollen:
$formFields = ['name', 'zip', 'email']; // je nach Seite anpassen
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// Session-Werte in die Formularfelder übernehmen
foreach($formFields as $field){
if(isset($this->elements[$field])){
$this->elements[$field]->value = $values[$field] ?? '';
}
}
wSession::setValue('formValues', $values);
// ENDEFormular 1: Nach dem Absenden auszuführendes Skript (serverEventOnSubmit)
$formFields = ['name', 'zip', 'email']; // je nach Seite anpassen
if((wRequest::getParameter('wFormAction') === 'reset')){
$this->reset();
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// nur definierte Felder leeren
foreach($formFields as $field){
$values[$field] = '';
}
wSession::setValue('formValues', $values);
wResponse::redirect($this->url);
exit; // nach Redirect immer sauber beenden
}
$this->setFormData(wRequest::getParameters());
if($this->validate()){
$mailData = $this->getFormData();
// ...
// ...
//Hier können Sie weitere Funktionen einfügen
// ANFANG
// Formular-Werte in Session schreiben
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// nur die Felder dieser Seite in die Session übernehmen
foreach($formFields as $field){
$values[$field] = $mailData[$field] ?? '';
}
wSession::setValue('formValues', $values);
// ENDE
$this->initFormData();
$this->setStatus('sent');
wCache::clearCachePath($this->url);
if(empty($this->getVar('redirectSuccess'))){
$redirectURL = wURL::setParameter($this->url, 'wFormStatus', '');
wOutput::loadWithoutCache($redirectURL);
wResponse::redirect($redirectURL);
}
else{
wResponse::redirect($this->getVar('redirectSuccess'));
}
}
else{
$redirectURL = wURL::setParameter($this->url, 'wFormStatus', 'failed');
wOutput::loadWithoutCache($redirectURL);
wResponse::redirect($redirectURL.'#wFormErrorMessages');
}Schritt 2: Formular in nachfolgender Seite anlegen
In der zweiten Seite legen Sie ebenso ein Formular mit den gewünschten Feldern an (z.B. /de/kontakt/formular-seite2.php). Über die erweiterten Formulareinstellungen hinterlegen Sie den Skript-Code, um die im Formular eingegebenen Werte in der Session zu speichern und auszulesen und definieren die Seite, an welche die Formularangaben nach dem Abschicken übergeben werden sollen.
Im Beispiel ist im Feld "Nach dem Absenden aufzurufende URL" die entsprechdende Seite hinterlegt (z.B. /de/kontakt/formular-seite3.php).
Im Skript-Feld "Vor der Erstellung auszuführendes Skript"
definieren Sie zu den bestehenden Formularfeldern das Auslesen der
bereits befüllten Felder (für ein eventuelles zurück blättern der
nachfolgenden Formularseiten).
Im Skript-Feld "Nach dem Absenden auszuführendes Skript" definieren Sie zu den Formularfeldern den Skript-Code zum Speichern der Formularfeld-Werte in die Session.
Fügen Sie diesen an den entsprechenden Stellen des schon existierenden Codes ein.
Damit beim Abschicken dieser Formularseite keine E-Mail verschickt wird, löschen Sie über den Datei-Quelltext zum Formular alle wd:item Elemente vom type="formular.variable" bis auf das mit fragment name "redirectSuccess" ("Nach dem Absenden aufzurufende URL").
Den Skript-Code aus dem Beispiel können Sie nachfolgend entnehmen.
Formular 2: Vor der Erstellung auszuführendes Skript (serverEventOnBeforeBuild)
// ANFANG
// Werte aus bereits befüllten Feldern übernehmen ...
// Definiert, welche Felder auf dieser Seite befüllt werden sollen:
$formFields = ['age']; // je nach Seite anpassen
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// Session-Werte in die Formularfelder übernehmen
foreach($formFields as $field){
if(isset($this->elements[$field])){
$this->elements[$field]->value = $values[$field] ?? '';
}
}
wSession::setValue('formValues', $values);
//...
//ENDEFormular 2: Nach dem Absenden auszuführendes Skript (serverEventOnSubmit)
$formFields = ['age']; // je nach Seite anpassen
if((wRequest::getParameter('wFormAction') === 'reset')){
$this->reset();
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// nur definierte Felder leeren
foreach($formFields as $field){
$values[$field] = '';
}
wSession::setValue('formValues', $values);
wResponse::redirect($this->url);
exit; // nach Redirect immer sauber beenden
}
$this->setFormData(wRequest::getParameters());
if($this->validate()){
$mailData = $this->getFormData();
// ...
// ...
//Hier können Sie weitere Funktionen einfügen
// Formular-Werte in Session schreiben
// ANFANG
// Formular-Werte in Session schreiben
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// nur die Felder dieser Seite in die Session übernehmen
foreach($formFields as $field){
$values[$field] = $mailData[$field] ?? '';
}
// optional Zeitstempel aktualisieren
$values['time'] = time();
wSession::setValue('formValues', $values);
// ENDE
$this->initFormData();
$this->setStatus('sent');
wCache::clearCachePath($this->url);
if(empty($this->getVar('redirectSuccess'))){
$redirectURL = wURL::setParameter($this->url, 'wFormStatus', '');
wOutput::loadWithoutCache($redirectURL);
wResponse::redirect($redirectURL);
}
else{
wResponse::redirect($this->getVar('redirectSuccess'));
}
}
else{
$redirectURL = wURL::setParameter($this->url, 'wFormStatus', 'failed');
wOutput::loadWithoutCache($redirectURL);
wResponse::redirect($redirectURL.'#wFormErrorMessages');
}Schritt 3: Formular in abschliessender Seite anlegen
Legen Sie abschliessend in einer Seite ein Formular mit den gewünschten Feldern (z.B. ein Mitteilungsfeld) an (z.B. /de/kontakt/formular-seite3.php). Über die erweiterten Formulareinstellungen hinterlegen Sie den Skript-Code, um die im Formular eingegebenen Werte in der Session zu speichern und auszulesen und definieren die Seite, an welche die Formularangaben nach dem Abschicken übergeben werden sollen.
Im Beispiel ist im Feld "Nach dem Absenden aufzurufende URL" die entsprechdende Seite hinterlegt (z.B. /de/kontakt/formular-seite3.php?status=sent, also die Seite selber). Dau können Sie z.B. einen bedingten Container für HTTP-Parameter einsetzen, über welchen Sie im zutreffenden Fall (z.B. status=sent) einen Hinweis zum erfolgreichen abschicken des Formulares platzieren, andernfalls das Formular anzeigen.
Alternativ können Sie auch eine separate Danke-Seite angeben.
Im Skript-Feld "Vor der Erstellung auszuführendes Skript" definieren Sie zu den bestehenden Formularfeldern das Auslesen der bereits befüllten Felder (für ein eventuelles zurück blättern der nachfolgenden Formularseiten).
Fügen Sie diesen an den entsprechenden Stellen des schon existierenden Codes ein.
Den Skript-Code aus dem Beispiel können Sie nachfolgend entnehmen.
Formular 3: Vor der Erstellung auszuführendes Skript (serverEventOnBeforeBuild)
// ANFANG
// Werte aus bereits befüllten Feldern übernehmen ...
// Definiert, welche Felder auf dieser Seite befüllt werden sollen:
$formFields = ['message']; // je nach Seite anpassen
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// Session-Werte in die Formularfelder übernehmen
foreach($formFields as $field){
if(isset($this->elements[$field])){
$this->elements[$field]->value = $values[$field] ?? '';
}
}
wSession::setValue('formValues', $values);
// ENDEFormular 3: Nach dem Absenden auszuführendes Skript (serverEventOnSubmit)
$formFields = ['message']; // je nach Seite anpassen
if((wRequest::getParameter('wFormAction') === 'reset')){
$this->reset();
$values = wSession::getValue('formValues');
if(!is_array($values)){
$values = [];
}
// nur definierte Felder leeren
foreach($formFields as $field){
$values[$field] = '';
}
wSession::setValue('formValues', $values);
wResponse::redirect($this->url);
exit; // nach Redirect immer sauber beenden
}
$this->setFormData(wRequest::getParameters());
if($this->validate()){
$mailData = $this->getFormData();
// ...
// ...
// Werte aus anderen Formularen für Formulardaten übernehmen:
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$mailData = array_merge($values, $mailData); // $mailData überschreibt $values (wenn anders gewünscht, Reihenfolge ändern)
if(empty($mailData[ 'name' ])){
wResponse::redirect('/de/kontakt/formular-seite1.php');
}
// ENDE
// ...
// ...
//Hier können Sie weitere Funktionen einfügen
// Formular-Werte in Session löschen
// ANFANG
wSession::setValue('formValues', null);
unset($_SESSION['wFormData']);
// ENDE
$this->initFormData();
$this->setStatus('sent');
wCache::clearCachePath($this->url);
if(empty($this->getVar('redirectSuccess'))){
$redirectURL = wURL::setParameter($this->url, 'wFormStatus', '');
wSession::setValue( 'formValues', NULL);
wOutput::loadWithoutCache($redirectURL);
wResponse::redirect($redirectURL);
}
else{
wSession::setValue( 'formValues', NULL);
wResponse::redirect($this->getVar('redirectSuccess'));
}
}
else{
$redirectURL = wURL::setParameter($this->url, 'wFormStatus', 'failed');
wOutput::loadWithoutCache($redirectURL);
wResponse::redirect($redirectURL.'#wFormErrorMessages');
}Allgemeine Hinweise
Das genannte Beispiel zeigt Ihnen eine Möglichkeit auf, welche Sie an Ihre individuellen Vorstellungen anpassen können.
Beim Einsatz eines Mehrfach-Upload Feldes (z.B. für Bilder, PDFs, etc.)
Beim Wechsel zwischen den Formularseiten kann auch dafür gesorgt werden, daß die schon hochgeladene Datei im Formular "bestehen" bleibt. Dazu müssen im betreffenden Formular im Feld "Nach dem Absenden auszuführendes Skript" folgende Zeilen deaktiviert werden also:
/*
Auskommentieren, damit Datei-Upload in der Session erhalten bleibt ANFANG
Die Formulareinstellung "Beim Löschen bzw. Initialisieren des Formulars hochgeladene Dateien ebenfalls löschen" muss aktiviert sein!
*/
//$this->initFormData();
//$this->setStatus('sent');
Tipp:
Sie können ein Formular auch innerhalb einer Seite auf mehrere "Bereiche" aufteilen (z.B. aufgeteilt über einen Registerlaschen-Container).
Ebenso ist es möglich, über das Formular-Element "Bedingter Container mit Formularelementen" eine Formularumsetzung innerhalb eines Formulates zu realisieren.
Online-Doku: Formular-Editor / Kontakt-Formular Weiterführende Links
- Wie kann ich ein Formular auf mehrere Seiten aufteilen?
- Formulare lassen sich auf mehrere Seiten aufteilen. Für die Umsetzung wird das Zusatzmodul **Formular-Editor** empfohlen, mit dem du über Struktureditor und Formularmasken komfortabel arbeiten kannst. Das Beispiel zeigt eine Aufteilung in **drei Seiten**.
- Warum muss der Seiten-Cache deaktiviert werden, wenn in einer Formularseite sessionbasierte Inhalte ausgegeben werden?
- Wenn in einer Seite sessionbasierte Inhalte ausgegeben werden, muss der **Seiten-Cache deaktiviert** werden. Sonst können veraltete Inhalte angezeigt werden, weil die Seite nicht korrekt die aktuellen Session-Daten berücksichtigt.
- Welche grundlegenden Schritte werden für ein Formular über drei Seiten benötigt?
- Üblicherweise: 1. **Schritt 1:** Formular in Seite 1 anlegen und beim Absenden eine Ziel-URL (Seite 2) definieren. 2. **Schritt 2:** Formular in Seite 2 anlegen und beim Absenden eine Ziel-URL (Seite 3) definieren. 3. **Schritt 3:** Formular in der abschließenden Seite anlegen (z. B. Mitteilung/letztes Feld) und beim Absenden zum Versand/Weiterleitung bzw. zur Danke-/Status-Logik führen.
- Wie speichere ich die Werte der Formularfelder in der Session, damit sie zwischen den Seiten erhalten bleiben?
- In den Formular-Einstellungen wird im Skript **„Nach dem Absenden auszuführendes Skript“** Code hinterlegt, der die relevanten Feldwerte in die Session schreibt (z. B. in <code class="codeInline">wSession::setValue('formValues', ...)</code>). In „Vor der Erstellung auszuführendes Skript“ werden diese Session-Werte anschließend wieder in die Formularfelder geladen (z. B. per <code class="codeInline">$this->elements[$field]->value = ...</code>).
- Wie kann ich beim Wechsel zwischen den Formularseiten bereits befüllte Felder wieder anzeigen (z. B. beim Zurückblättern)?
- Nutze im jeweiligen Formular im Skriptfeld **„Vor der Erstellung auszuführendes Skript“** das Auslesen der bereits befüllten Felder aus der Session und setze sie in die Formularfelder. Dadurch bleiben die Werte beim erneuten Anzeigen der Seiten erhalten.
- Welche Einstellung sollte ich im Feld „Nach dem Absenden aufzurufende URL“ vornehmen?
- In „**Nach dem Absenden aufzurufende URL**“ hinterlegst du jeweils die Seite, die nach dem Absenden aufgerufen werden soll. Im Beispiel wird z. B. von Seite 1 zu **Seite 2** und von Seite 2 zu **Seite 3** weitergeleitet.
- Wie verhindere ich, dass beim Absenden der Zwischenformulare eine E-Mail versendet wird?
- Beim Abschicken dieser Formularseiten soll **keine E-Mail** verschickt werden. Dazu löscht du im Datei-Quelltext zum Formular alle <code class="codeInline">wd:item</code> Elemente vom Typ <code class="codeInline">type="formular.variable"</code> **bis auf** das mit <code class="codeInline">fragment name "redirectSuccess"</code> (also die Weiterleitungs-Logik).
- Wie kann ich in der abschließenden Formularseite Daten aus den vorherigen Formularen in die Versanddaten übernehmen?
- In der letzten Seite werden die Session-Werte aus <code class="codeInline">formValues</code> geladen und mit den aktuellen <code class="codeInline">$mailData</code> zusammengeführt, z. B. per <code class="codeInline">array_merge($values, $mailData)</code> (Reihenfolge beachten: bei Konflikten überschreibt späteres Zusammenführen die Werte). Danach kann optional geprüft werden, ob z. B. <code class="codeInline">name</code> gesetzt ist, und bei fehlenden Daten kann auf Seite 1 redirectet werden.
- Wie und wann lösche ich die Session-Daten nach dem erfolgreichen Versand?
- Nach dem erfolgreichen Absenden in der abschließenden Seite werden die Session-Werte bereinigt, z. B. durch <code class="codeInline">wSession::setValue('formValues', null);</code> und das Entfernen von <code class="codeInline">$_SESSION['wFormData']</code> (wie im Beispiel). So werden alte Formularwerte nicht in nachfolgenden Versuchen wiederverwendet.
- Was passiert bei ungültigen Eingaben (Validierungsfehler) im Mehrseitenformular?
- Wenn <code class="codeInline">validate()</code> fehlschlägt, wird eine Status-URL mit <code class="codeInline">wFormStatus=failed</code> erzeugt und der Nutzer auf die entsprechende Stelle (z. B. <code class="codeInline">#wFormErrorMessages</code>) umgeleitet. Damit kann die Seite die Fehlermeldungen anzeigen.
- Wie kann der Nutzer nach erfolgreichem Absenden weitergeleitet werden (redirectSuccess / wFormStatus)?
- Nach erfolgreicher Validierung wird abhängig von <code class="codeInline">redirectSuccess</code> entweder direkt zu dieser Ziel-Variable weitergeleitet oder es wird eine Status-URL mit <code class="codeInline">wFormStatus</code> gesetzt (z. B. leer oder ohne Fehler) und mit <code class="codeInline">wOutput::loadWithoutCache</code> geladen und anschließend redirectet. <code class="codeInline">redirectSuccess</code> ermöglicht dabei eine flexible Erfolgsausgabe (z. B. Danke-Container).
- Wie gehe ich mit einem Mehrfach-Upload-Feld (z. B. Bilder/PDFs) über mehrere Formularseiten um?
- Wenn du in Zwischenformularen einen Datei-Upload hast, kann beim Wechsel sonst der Upload verloren gehen. Im „**Nach dem Absenden auszuführendes Skript**“ musst du die Zeilen zum Initialisieren/Zurücksetzen ggf. deaktivieren: - <code class="codeInline">//$this->initFormData();</code> - <code class="codeInline">//$this->setStatus('sent');</code> Zusätzlich muss die Formulareinstellung **„Beim Löschen bzw. Initialisieren des Formulars hochgeladene Dateien ebenfalls löschen“** aktiviert sein (wie im Hinweis beschrieben).
- Kann ich ein Formular auch innerhalb einer Seite in mehrere Bereiche aufteilen?
- Ja. Der Text empfiehlt als Tipp, ein Formular auch innerhalb einer Seite auf mehrere „Bereiche“ aufzuteilen (statt es strikt über mehrere Seiten zu realisieren).
- Gibt es eine Alternative zur Mehrseiten-Logik innerhalb eines Formulars?
- Ja. Über das Formular-Element **„Bedingter Container mit Formularelementen“** lässt sich eine Formularumsetzung auch innerhalb eines Formulates abbilden, ohne echte separate Seiten nutzen zu müssen.