Formulare: Fehlermeldung bei deaktivierten Cookies ausgeben
Ausgangssituation:
- Im Backend ist ein einfaches Formular angelegt, mit einem Radio-Button-Menü und Senden-Button
- Übertragungsmethode ist POST und es gibt keine Weiterleitungsseite (die Seite wird nach dem Senden einfach neu geladen)
- Das Formular ist als Modul ins Seitenlayout eingebunden
- Wenn das Formular gesendet wird, wird der Wert des Radio-Feldes in einem Cookie gespeichert
- Das Cookie-Handling an sich (Cookie erstellen, aktualisieren, löschen) erfolgt in einem KernelResponseSubscriber (implements EventSubscriberInterface) und funktioniert bereits
- Beim Aufruf der Seite mit dem Formular wird im LoadFormFieldListerner geprüft, ob das Cookie bereits im requestStack vorhanden ist. Falls ja wird der im Cookie gespeicherte Wert genutzt, um das entsprechende Radio-Auswahlfeld als 'checked' zu markieren (funktioniert ebenfalls)
Problem:
Ich finde allerdings gerade keinen Lösungsansatz, wie nach dem Senden des Formulars ohne Javascript eine Fehlermeldung ausgeben werden kann, wenn Cookies im Browser deaktiviert sind oder von einer Erweiterung blockiert werden.
Ich vermute, die CSRF-Sicherheitsprüfung mit dem versteckten Formularfeld 'REQUEST_TOKEN' und dem 'csrf_contao_csrf_token'-Cookie von Contao verhindern, dass das Formular verarbeitet wird, wenn Cookies deaktiviert sind, ist das korrekt?
Wie kann man denn eine Fehlermeldung ausgeben, wenn diese Sicherheitsprüfung gescheitert ist?
Was passiert momentan?
Wenn Cookies im Browser komplett deaktiviert sind und man das Formular sendet, wird die Seite einfach nochmal mit dem (unveränderten/ursprünglichen) Formular angezeigt, ohne irgendeine Fehlermeldung.
Was ich bereits probiert habe:
In dem KernelResponseSubscriber wird vor den Cookie-Funktionen geprüft, ob es sich um einen POST-Request handelt (und falls nicht, werden die Cookie-Funktionen gar nicht erst ausgeführt):
PHP-Code:
// Only continue in the script when a form was send
if ( !$request->isMethod('POST') ) {
return;
}
Mein Lösungsansatz wäre nun gewesen, im LoadFormFieldListerner ähnlich vorzugehen und dort zu prüfen, ob der Request ein POST war (das Formular also gesendet wurde). Falls ja könnte man den Wert eines versteckten Feldes 'formular-wurde-gesendet' von '0' auf '1' ändern und über Umwege im Template eine Warnung/Fehlermeldung ausgeben, wenn sich der Radio-Wert nicht vom Standardwert unterscheidet. Das klappt aber leider nicht, weil:
Wenn Cookies im Browser deaktiviert sind, ist die [#method] im requestStack seltsamerweise immer GET anstelle POST?
(also wenn ich im KernelResponseSubscriber ODER im LoadFormFieldListerner dump($request); mache)
Hat jemand eine Tipp oder eine Idee, wie man eine Fehlermeldung nach dem Senden ausgeben kann, wenn das Formular von Contao gar nicht verarbeitet wurde?
Und unabhängig von meiner Baustelle, aber ist mir in dem Zusammenhang aufgefallen: Warum kann man auf der Contao-News-Demoseite (Link) einen Kommentar absenden, wenn Cookies und Javascript im Browser deaktiviert sind, obwohl dort ein (leeres!?) verstecktes Formularfeld 'REQUEST_TOKEN' sowie zusätzlich das Feld Sicherheitsabfrage eingebunden sind? Das dürfte ohne Cookies doch eigentlich auch nicht funktionieren, oder verstehe ich das falsch mit den CSRF-Cookies?