Contao: Formulardaten werden trotzt sessionform gelöscht

Eigentlich hat es gar nichts mit Sessionform zu tun, da der Fehler aber in Verbindung mit dieser Erweiterung besonders auffällt und frustrierend sein kann, habe ich diese „reißerische“ Überschrift gewählt.

Um was geht es?

In Verbindung mit sessionform lassen sich Formularwerte speichern und auf Folgeseiten oder Übersichtsseiten auslesen und anzeigen. Siehe dazu auch diesen Beitrag. Das funktioniert auch alles wunderbar solange man nicht wagt, Werte aus der Session aus einem einseitigen in ein mehrseitiges Formular zu übernehmen bzw. ein mehrseitiges Formular „neu zu starten“.

Nach langem Suchen im Quellcode bin ich auf die interessanten und folgenschweren Zeilen in der ExtendedForm.php gestoßen

if ($strMode != 'reload' && strlen($objFields->name)) {
	if (!strlen($_POST['FORM_SUBMIT']) || !$_SESSION['EFP'][$formId]['completed']['page_'.$this->intActivePage]) {
		if (!$GLOBALS['EFP'][$formId]['doNotCleanStoredSessionData']) {
			unset($_SESSION['FORM_DATA'][$objFields->name]);
		}
	}
}

Wie man sieht werden die Formulardaten gelöscht, wenn ein Formular augerufen wird welches nicht abgeschickt wurde oder nicht vollständig ausgefüllt wurde. Meistens ist das auch sinnvoll um Konflikte zu vermeiden. Manchmal will man aber dem Nutzer entgegenkommen, dass dieser nicht jedes mal das komplette Formular ausfüllen muss.
Zeile 275 ist der Schlüssel in Form von $GLOBALS[‚EFP‘][$formId][‚doNotCleanStoredSessionData‘]. Will man die Formulare aber vor dem Löschen der Session bewaren, muss noch darauf hingewiesen werden, dass $formId eigentlich auto_form_[$id] bedeutet. Heißt: wollt Ihr eure Formulare vor dem Löschen schützen müsst ihr der eigentlichen Formular-ID eben jenes „auto_form_“ voranstellen. Das wird im Kommentar über der Bedingung leider nicht erwähnt. Hat man nun mehrere Formulare nutzt man einfach eine Schleife der Form:

for ($formId = 0; $formId < 100; $formId++) {
    $GLOBALS['EFP']['auto_form_' . $formId]['doNotCleanStoredSessionData'] = true;
}

packt das ganze sinnigerweise in eine eigene kleine Modulerweiterung in die config/config.php und der Drops ist gelutscht. Die ersten 100 Formulare die erstellt werden, sind vor dem Löschen geschützt.

Will man etwas differenzierter vorgehen, setzt man die IDs in ein Array und durchläuft es vorzugsweise in einer foreach.

Ganz Ausgebuffte oder Gelangweilte basteln sich eine Modulerweiterung mit der man das über das Backend einstellen kann.