Ergebnis 1 bis 11 von 11

Thema: Im Backend POST-Request verarbeiten

  1. #1
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard Im Backend POST-Request verarbeiten

    Hallo!

    Ist sicherlich nur ein kleiner Fehler aber ich komme hier nicht weiter. Ich habe mir im Backend einen Controller mit eigener Route angelegt, in dem ich ein Formular anzeige. In dem Formular wird eine externe API via REST abgefragt und die ausgewählten Ergebnisse werden dann im zweiten Schritt in eine Tabelle importiert. Mein Aufbau ist grob so:

    Das Template erbt von be_main und erweitert nur den main_content:

    Code:
    {% extends "@Contao/be_main" %}
    
    {% block main_content %}
        <form id="worms-search-form" class="tl_form" method="post">
            <div class="formbody">
                <input type="hidden" name="FORM_SUBMIT" value="wormsSearch">
                <input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
    Im Controller verarbeite ich die Suchanfrage und setze dann ins Template die entsrechenden Daten:

    PHP-Code:
    public function __invoke(Request $request): Response
    {
      if (
    Input::post('FORM_SUBMIT') == 'wormsSearch') {
        

      
    }

      return 
    $this->render(
        
    '@Contao/backend_worms_import.html.twig',
        
    $parameters
      
    );

    Mein Problem ist, wenn ich das Formular als GET absende und die GET-Werte verarbeite, funktioniert alles. Das Formular wird wie gewünscht nach dem Absenden aktualisiert und das Ergebnis angezeigt.

    Bildschirmfoto 2026-06-13 um 12.19.00.png

    Setze ich das Formluar und meine Verarbeitung aber auf POST, wird die Seite nach dem Absenden nicht aktualisiert. In den Browser-Devtools sehe ich zwar, dass der Request durchgeht und auch die Seitet mit Status 200 und allen Ergebnissen zurückgegeben wird, sie wird aber nicht angezeigt. Die Suchmaske bleibt einfach stehen. Mir wäre aber lieber, wenn ich es mit POST machen könnte.

    Ich vermute, dass ich statt be_main besser ein anderes Template dafür erweitere oder noch irgendetwas anderes angeben muss, damit die Seite aktualisiert wird. Kann mir hier jemand einen Tipp geben?

    Eine zweite Frage, wenn ich gerade dabei bin: In einigen anderen Bundles habe ich gesehen, dass die Twig-Templates in Bundles über eine eigene „Kennung“ angesprochen werden. Mein Bundle heißt babelfisch/fossils-bundle und der Namespace ist Babelfisch/FossilsBundle. Alle Versuche von mir, mein Template entsprechend zu laden, funktionierten leider nicht und ich bekomme den Fehler, dass das Template nicht gefunden wurde.

    Code:
    @BabelfischFossilsBundle/backend_worms_import.html.twig
    @BabelfischFossils/backend_worms_import.html.twig
    @Babelfisch/backend_worms_import.html.twig
    Vermutlich muss hier auch noch etwas registriert werden aber ich finde nicht wo und was. Das Template liegt in:

    /src/Resources/contao/templates/backend/backend_worms_import.html.twig
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

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

    Standard

    Das Contao Backend in Contao 5.7 nutzt Turbo. Turbo erwartet sich bei POST Requests entweder eine 30x oder eine 422 Antwort: https://turbo.hotwired.dev/handbook/...orm-submission

    Du musst also entweder eine entsprechende Antwort senden lassen - oder Turbo für dein Formular deaktivieren (mit data-turbo="false").
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Danke, so funktioniert es.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

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

    Standard

    Die Legacy Input Klasse solltest du übrigens nicht nutzen. Du hast ja bereits das Request Objekt in deinem Controller.
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hatte ich sogar erst probiert aber $request->query->get('key'); brachte mir kein Ergebnis, obwohl es laut Symfony Doku $_GET und $_POST enthalten sollte. Mit $request->request->get('key'); bekomme ich jetzt aber die POST-Werte. Ich nehme an, dass das dann auch der richtige Weg ist.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

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

    Standard

    Zitat Zitat von Babelfisch Beitrag anzeigen
    Hatte ich sogar erst probiert aber $request->query->get('key'); brachte mir kein Ergebnis, obwohl es laut Symfony Doku $_GET und $_POST enthalten sollte.
    ->query enthält nur Query Parameter, keine POST Parameter.
    » sponsor me via GitHub or Revolut

  7. #7
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    ->query enthält nur Query Parameter, keine POST Parameter.
    Ja, aber in der Doku steht es halt anders:

    https://symfony.com/doc/current/intr...request-object

    PHP-Code:
    // retrieves $_GET and $_POST variables respectively
    $request->query->get('id'); 
    Das hatte mich verwirrt, weshalb ich erst einmal den alten aber funktionierenden Weg über Contaos Input gegangen bin. Aber nun funktioniert es ja.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

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

    Standard

    Zitat Zitat von Babelfisch Beitrag anzeigen
    Ja, aber in der Doku steht es halt anders:

    https://symfony.com/doc/current/intr...request-object

    PHP-Code:
    // retrieves $_GET and $_POST variables respectively
    $request->query->get('id'); 
    Das hatte mich verwirrt
    Da hast du zu früh aufgehört zu lesen - oder falsch übersetzt. So lautet die gesamte Dokumentation:
    Code:
    // retrieves $_GET and $_POST variables respectively
    $request->query->get('id');
    $request->getPayload()->get('category', 'default category');
    $request->query für $_GET, $request->getPayload() für $_POST (seit Symfony 6.3, vorher gab es nur $request->request).
    » sponsor me via GitHub or Revolut

  9. #9
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ok, das habe ich wirklich falsch verstanden, zumal die Bezeichner auch nicht ganz selbtserklärend sind. Ich hatte vorher noch nicht mit Symfony gearbeitet und es ist gar nicht so einfach alle Dokus zu Contao 5, Symfony, Twig, etc. gleichzeitig durchzuarbeiten. So langsam fängt es aber an Spaß zu machen.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

  10. #10
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Sorry das ich hier noch einmal nerven muss. Leider habe ich jetzt ein weiteres Problem mit dem POST-Request. Wenn ich in meinem Formular eine Auswahl von Werten als Checkbox mit PHP-Array-Stil definiere, bekomme ich auf meinen Request immer 400 Bad Request als Antwort zurück.

    So sieht verkürzt das Formular aus:

    HTML-Code:
    <form id="worms-import-form" class="tl_form" method="post" enctype="multipart/form-data">
      <input type="hidden" name="FORM_SUBMIT" value="wormsImport">
      <input type="hidden" name="REQUEST_TOKEN" value="{{ contao.request_token }}">
      …
      {% for record in records %}
        <input type="checkbox" name="IDS[]" class="tl_tree_checkbox" value="{{ record.AphiaID }}">
      {% endfor %}
      …
      <button type="submit" id="import-button" class="tl_submit">Ausgewählte importieren</button>
    </form>
    Im Browser sehe ich, dass die Anfrage sauber gesendet wird. Die Formulardaten werden als Nutzlast gesendet aber die Anfrage kommt nicht in meinem Controller an und es wird direkt 400 zurückgesendet.

    Es scheint an dem name="IDS[]" zu liegen. Mache ich einfach einmal testweise name="IDS" ohne [], dann kommt der Request in meinem Controller an und wird dort beantwortet.

    Hast du oder jemand anders eine Ahnung, was ich hier falsch mache?
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

  11. #11
    Contao-Fan Avatar von Babelfisch
    Registriert seit
    30.06.2009.
    Ort
    Leipzig
    Beiträge
    963
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Hat sich erledigt, ich habe das Problem gefunden. Im Controller hatte ich die IDs mit:

    PHP-Code:
    $request->getPayload()->get('IDS'
    … abgefragt. Richtig ist aber:

    PHP-Code:
    $request->getPayload()->all('IDS'
    Vermutlich wurde da intern auch ein Fehler geworfen. Aber den konnte ich nicht sehen, da in dem Formular der Symfony Profiler nicht angezeigt wird. Ich vermute mal, dass ich hier noch weitere Sachen bei dem Template – welches ich ja von be_main erbe – setzen muss.
    Meine aktiven Contao-Projekte: LingoliaStiftung firmm

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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