Contao 5.3: Korrekte Vorgehensweise bei Formulardaten aus Session in Template
Hallo,
ich habe jetzt einige Zeit damit verbracht, herauszufinden, was der beste/von Contao vorgesehen Weg ist, auf einer Weiterleitungsseite die soeben abgesendeten Formulardaten in einem Template zu verwenden (Contao 5.3).
Anfänglich fand ich als simpelste Lösung:
PHP-Code:
<?= \Contao\Input::post('mein_feld'); ?>
oder
PHP-Code:
<?= \Contao\Input::get('mein_feld'); ?>
Aber das ergab immer nichts bzw. NULL per var_dump.
Dann hatte ich das hier gefunden, was sich aber sehr falsch angefühlt hatte und auch keine cleanen Ergebnisse lieferte (Strings waren ESI-Anweisungen):
PHP-Code:
Contao\System::getContainer()->get('contao.insert_tag.parser')->replace("{{form_session_data::mein_feld}}");
Mithilfe von ChatGPT habe ich eine funktionierende Lösung ermittelt, aber ich wollte mal nachfragen, ob das so richtig ist, oder overkill oder sonstwie nicht vorteilhaft, oder ob es eine bessere / einfachere Lösung gibt.
Lösung:
config/services.yaml anlegen mit folgendem Inhalt:
Code:
services:
App\EventListener\FormDataListener:
arguments:
$requestStack: '@request_stack'
tags:
- { name: contao.hook, hook: processFormData, method: storeFormData }
src/EventListener/FormDataListener.php anlegen mit folgendem Inhalt:
PHP-Code:
<?php
namespace App\EventListener;
use Symfony\Component\HttpFoundation\RequestStack;
class FormDataListener
{
private RequestStack $requestStack;
public function __construct(RequestStack $requestStack)
{
$this->requestStack = $requestStack;
}
public function storeFormData($submittedData, $form, $files, $labels)
{
$session = $this->requestStack->getSession();
if ($session) {
$session->set('formData', $submittedData);
// Debugging: Prüfen, ob der Wert gespeichert wurde
error_log('Gespeicherte Eingabe: ' . print_r($session->get('formData'), true));
} else {
error_log('Session konnte nicht abgerufen werden.');
}
}
}
und in meinem Template schließlich:
PHP-Code:
use Symfony\Component\HttpFoundation\RequestStack;
$requestStack = \Contao\System::getContainer()->get('request_stack');
$session = $requestStack->getSession();
$formData = $session->get('formData');
Irgendwie scheint mir das Ganze overkill für etwas, was m.E.n. ein oft gebrauchter Standard ist. Also bestimmt habe ich irgendwo etwas ganz Zentrales falsch verstanden.
Grüße
-K