Ergebnis 1 bis 5 von 5

Thema: Contao 5.3: Korrekte Vorgehensweise bei Formulardaten aus Session in Template

  1. #1
    Contao-Nutzer
    Registriert seit
    08.01.2019.
    Beiträge
    32

    Standard 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

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.161
    Partner-ID
    10107

    Standard

    Willst du es nur ausgeben - oder irgendwas damit machen?
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Nutzer
    Registriert seit
    08.01.2019.
    Beiträge
    32

    Standard

    Danke für de schnelle Antwort!

    Ich muss im Template in PHP etwas Logik damit betreiben (if mein_feld === 'foo' usw.), also schon mehr als nur Ausgabe.

    Grüße

  4. #4
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    37.161
    Partner-ID
    10107

    Standard

    In einem Legacy PHP Template dann zB so:
    PHP-Code:
    <?php

    use Contao\CoreBundle\Session\Attribute\AutoExpiringAttribute;
    use 
    Contao\Form;
    use 
    Contao\System;

    /** @var AutoExpiringAttribute|null $formData */
    $formData System::getContainer()->get('request_stack')->getCurrentRequest()?->getSession()->get(Form::SESSION_KEY);

    assert(null === $formData || $formData instanceof AutoExpiringAttribute);

    ?>

    <?php if ('foo' === ($formData?->getValue()['mein_feld'] ?? null)): ?>
        <!-- … -->
    <?php endif; ?>
    Geändert von Spooky (19.02.2025 um 14:48 Uhr)
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Nutzer
    Registriert seit
    08.01.2019.
    Beiträge
    32

    Standard

    Super, vielen Dank!

    Ich habe es dann final so gelöst, falls es jemanden interessiert. Die oben beschriebenen Dateien in src/ und config/ sind dann tatsächlich nicht mehr nötig, und alles ist:

    PHP-Code:
     <?php

    use Contao\CoreBundle\Session\Attribute\AutoExpiringAttribute;
    use 
    Contao\Form;
    use 
    Contao\System;

    /** @var AutoExpiringAttribute|null $formData */
    $formData System::getContainer()->get('request_stack')->getCurrentRequest()?->getSession()?->get(Form::SESSION_KEY);

    $values $formData?->getValue();

    $mein_feld1 $values['mein_feld1'];
    $mein_feld2 $values['mein_feld2'];

    ?>

    <!-- ... -->

    <?php if ($mein_feld1 === 'foo'): ?>
        <!-- … -->
    <?php endif; ?>

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •