Anwendungsbeispiel: Formular über mehrere Seiten mit Übergabe der Werte über Session

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

Erste Formularseite
Erste Formularseite

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)

// Werte aus bereits befüllten Feldern übernehmen
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
wSession::setValue( 'formValues', $values );
$this->elements[ 'name' ]->value = $values[ 'name' ];
$this->elements[ 'zip' ]->value = $values[ 'zip' ];
$this->elements[ 'email' ]->value = $values[ 'email' ];
// ENDE

Formular 1: Nach dem Absenden auszuführendes Skript (serverEventOnSubmit)

if(wRequest::getParameter("wFormAction") == "reset"){
$this->reset();
// Werte der gewünschten Formularfelder
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'name' ] = '';
$values[ 'zip' ] = '';
$values[ 'email' ] = '';
wSession::setValue( 'formValues', $values );
// ENDE
wResponse::redirect($this->url);
}

$this->setFormData(wRequest::getParameters());

if(
$this->validate()){
$mailData = $this->getFormData();

// ...
// ...

//Hier können Sie weitere Funktionen einfügen

// Formular-Werte in Session schreiben
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'name' ] = $mailData[ 'name' ];
$values[ 'zip' ] = $mailData[ 'zip' ];
$values[ 'email' ] = $mailData[ 'email' ];
$values[ 'time' ] = time();
wSession::setValue( 'formValues', $values );
// $sessionFormValues = wSession::setValue('formValues',$this->getFormData());
// 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

Zweite Formularseite
Zweite Formularseite

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)

// Werte aus bereits befüllten Feldern übernehmen
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
wSession::setValue( 'formValues', $values );
$this->elements[ 'age' ]->value = $values[ 'age' ];
//ENDE

Formular 2: Nach dem Absenden auszuführendes Skript (serverEventOnSubmit)

if(wRequest::getParameter("wFormAction") == "reset"){
$this->reset();
// Werte der gewünschten Formularfelder
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'age' ] = '';
wSession::setValue( 'formValues', $values );
// ENDE
wResponse::redirect($this->url);
}

$this->setFormData(wRequest::getParameters());

if(
$this->validate()){
$mailData = $this->getFormData();

// ...
// ...

//Hier können Sie weitere Funktionen einfügen

// Formular-Werte in Session schreiben
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'age' ] = $mailData[ 'age' ];
wSession::setValue( 'formValues', $values );
//$sessionFormValues .= wSession::setValue('formValues',$this->getFormData());
// 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

Dritte/Letzte Formularseite
Dritte/Letzte Formularseite

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)

// Werte aus bereits befüllten Feldern übernehmen
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
wSession::setValue( 'formValues', $values );
$this->elements[ 'message' ]->value = $values[ 'message' ];
// ENDE

Formular 3: Nach dem Absenden auszuführendes Skript (serverEventOnSubmit)

if(wRequest::getParameter("wFormAction") == "reset"){
$this->reset();
// Werte der gewünschten Formularfelder
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'message' ] = '';
wSession::setValue( 'formValues', $values );
// ENDE
wResponse::redirect($this->url);
}

$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[ 'name' ] = $values[ 'name' ];
$mailData[ 'zip' ] = $values[ 'zip' ];
$mailData[ 'email' ] = $values[ 'email' ];
$mailData[ 'age' ] = $values[ 'age' ];

if(empty(
$mailData[ 'name' ])){
wResponse::redirect('/de/kontakt/formular-seite1.php');
}
// ENDE

// ...
// ...

//Hier können Sie weitere Funktionen einfügen

// Formular-Werte in Session schreiben
// ANFANG
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'message' ] = $mailData[ 'message' ];
wSession::setValue( 'formValues', $values );
//$sessionFormValues .= wSession::setValue('formValues',$this->getFormData());
// 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.

Tipp:
Sie können ein Formular auch innerhalb einer Seite auf mehrere "Bereiche" aufteilen (z.B. aufgeteilt über einen Registerlaschen-Container).