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 entsprechdende Seite 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 Skript-Feld "Nach dem Absenden auszuführendes Skript" definieren Sie zu den Formularfeldern den Skript-Code zum Speichern der Formularfeld-Werte in die Session.

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 ...
$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' ];
//...

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

if(wRequest::getParameter("wFormAction") == "reset"){
$this->reset();
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'name' ] = '';
$values[ 'zip' ] = '';
$values[ 'email' ] = '';
wSession::setValue( 'formValues', $values );
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
$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());

$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.

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 ...
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
wSession::setValue( 'formValues', $values );
$this->elements[ 'age' ]->value = $values[ 'age' ];
//...

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

if(wRequest::getParameter("wFormAction") == "reset"){
$this->reset();
$sessionFormValues = wSession::getValue( 'formValues' );
$values = !empty( $sessionFormValues ) && is_array( $sessionFormValues ) === true ? $sessionFormValues : [];
$values[ 'age' ] = '';
wSession::setValue( 'formValues', $values );
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
$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());

$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, also die Seite selber). 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).

Formular 3: Vor der Erstellung auszuführendes Skript (serverEventOnBeforeBuild)

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

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

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

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

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

// ...
// ...

// Werte aus anderen Formularen für Formulardaten übernehmen:
$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');
}

// ...
// ...

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

// Formular-Werte in Session schreiben
$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());

$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).