Contao-Camp 2024
Ergebnis 1 bis 26 von 26

Thema: Formular auf externe Seite schicken und post auslesen

  1. #1
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard Formular auf externe Seite schicken und post auslesen

    Guten Tag,

    Ein Formular soll beim abschicken auf eine externe Seite geleitet werden und dort sollen dann die post variablen ausgelesen werden.

    Dies teste ich gerade folgendermaßen:

    - Formular erstellt mit Weiterleitungsseite auf eine Seite des typs externe weiterleitung mit der entsprechenden URL.

    - auf der EXTERNEN seite wird aber leider nichts ausgeben.

    Bei meinem Test war sowohl das Formular (contao 4.9) als auch die externe Seite (contao 3.5.36) eine Contao installation.

    Gibt es hier irgendeinen Sicherheitsmechanismus der das verhindert? Wenn ja - wie umgehe ich diesen?

  2. #2
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    Gibt es hier irgendeinen Sicherheitsmechanismus der das verhindert? Wenn ja - wie umgehe ich diesen?
    Ich nehme an, Du hast das Problem, daß beim POSTen von Formularen Contao das Request-Token veberwendet und das (gültige) jeweils nur innerhalb der Installation bekannt ist.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  3. #3
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Ich nehme an, Du hast das Problem, daß beim POSTen von Formularen Contao das Request-Token veberwendet und das (gültige) jeweils nur innerhalb der Installation bekannt ist.
    Ist dieses Problem auf der Sende Seite oder auf der Externen Seite?

    extern wäre kein Problem, da diese später nichts mit contao zu tun hat.

    //EDIT auf einer eigenen php datei wird ebenfalls nichts übergeben

    Code:
    <?php 
    
    echo $_POST["firstname"]; 
    echo 'test2';
    
    ?>
    Geändert von Nacht69 (22.07.2020 um 16:02 Uhr)

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

    Standard

    Mit dem Formulargenerator kannst du das nicht so direkt machen, denn der POST Request des Formulargenerators führt ja grundsätzlich immer auf die selbe Seite. Für so einen Fall musst du dir das Formular selbst erstellen - oder zumindst Contao Haste Forms zu Hilfe nehmen.

  5. #5
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Mit dem Formulargenerator kannst du das nicht so direkt machen, denn der POST Request des Formulargenerators führt ja grundsätzlich immer auf die selbe Seite. Für so einen Fall musst du dir das Formular selbst erstellen - oder zumindst Contao Haste Forms zu Hilfe nehmen.
    UUHH das ist eine sehr unschöne Nachricht. Hier geht es um mind 30 Anfrageformulare von verschiedenen Kunden, die auf dieses Anfrage-Auswertungs-Tool von Dritten umgestiegen sind.

    Gibt es hier wirklich keine andere möglichkeit? - vll über einen Hook.

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

    Standard

    Was genau ist denn die Anforderung?

  7. #7
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Was genau ist denn die Anforderung?
    Alle Anfrage, Buchungs usw Formulare sollen beim klick auf Senden auf eine bestimmte (externe) Seite von dritten leiten, die bestimmte Übergabewerte per Post abgreift und in ein Programm einträgt aus welchem dann die Kunden die Daten auslesen können. Die Seite übergibt dann den Status ob es funktioniert hat und leitet dann auf die Kundenseite zurück.

    // eidt: achja und zusätzlich soll der Anfragesteller auch eine E-Mail (benachrichtigungszentrum) erhalten
    Geändert von Nacht69 (22.07.2020 um 16:52 Uhr)

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

    Standard

    Du könntest für die jeweiligen Formulare ja auch das form_wrapper Template überschreiben und dort die action URL hardcoden. Dann hast du aber keine Funktionalität bei Contao aber mehr (Benachrichtigung per E-Mail über das Notification Center bspw.).

  9. #9
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du könntest für die jeweiligen Formulare ja auch das form_wrapper Template überschreiben und dort die action URL hardcoden. Dann hast du aber keine Funktionalität bei Contao aber mehr (Benachrichtigung per E-Mail über das Notification Center bspw.).
    Nein das funktioniert leider auch nicht weil neben den anfrage Formularen noch andere Formulare die nicht weitergeleitet werden sollen existieren (ausserdem brauchen wir das benachrichtigungszentrum)

    kann man nicht evtl zusätzlich über den processformdata hook ein zweites "formular" das alle Felder kopiert auf die gewünschte url versenden? Das wäre zwar nicht im Sinne des drittanbieters würde aba denke ich trotzdem funktioniern.

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

    Standard

    Du kannst in einem processFormData Hook natürlich schon POST Requests dort hin senden. Aber ich dachte der Nutzer soll dort hin geleitet werden?

  11. #11
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du kannst in einem processFormData Hook natürlich schon POST Requests dort hin senden. Aber ich dachte der Nutzer soll dort hin geleitet werden?
    Ja so wäre es von den Tool Erstellern vorgesehen. Das mit dem Hook wäre evtl eine Notlösung. Desweiteren denk ich nach mir mit Hasteform ein eigenes Formular Generator Modul zu basteln (das halt dann nur das kann was wir brauchen .... das würd jedoch denke ich auch nicht in den Zeitplan passen....)

    Zitat Zitat von Spooky Beitrag anzeigen
    ...... denn der POST Request des Formulargenerators führt ja grundsätzlich immer auf die selbe Seite
    Wie ist das genau zu verstehen? Gibs für solche Sachen evtl eine verständliche Doku? Ich meine die Post variablen kann man ja auf der eigentlichen Seite ganz normal auf jeder Internen Weiterleitungsseite verwenden. Was genau verhindert nun das senden an extern?

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

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    Ja so wäre es von den Tool Erstellern vorgesehen. Das mit dem Hook wäre evtl eine Notlösung.
    Naja, aber du kannst ja nicht beides haben . Ein Formular kann nur ein Ziel haben.



    Zitat Zitat von Nacht69 Beitrag anzeigen
    Wie ist das genau zu verstehen? Gibs für solche Sachen evtl eine verständliche Doku? Ich meine die Post variablen kann man ja auf der eigentlichen Seite ganz normal auf jeder Internen Weiterleitungsseite verwenden. Was genau verhindert nun das senden an extern?
    Du meinst mit den {{post::*}} Insert Tags? Das funktioniert nur deshalb, weil Contao die POST Variablen in der Session speichert, sodass sie dann auf der Weiterleitungsseite ausgelesen werden können. Die POST Daten selbst sind dann natürlich weg.

  13. #13
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Naja, aber du kannst ja nicht beides haben . Ein Formular kann nur ein Ziel haben.



    Du meinst mit den {{post::*}} Insert Tags? Das funktioniert nur deshalb, weil Contao die POST Variablen in der Session speichert, sodass sie dann auf der Weiterleitungsseite ausgelesen werden können. Die POST Daten selbst sind dann natürlich weg.
    Ah verstehe. Hier kann man nicht evtl eingreifen und die Daten der Session wieder als POST Daten hinzufügen?

    und noch was ... wenn ich mich dafür entscheide mit hasteform zu arbeiten - Ist es möglich mit Hasteform über das Benachrichtigungszentrum E-Mail zu verschicken? Ich weiss dass ich das schon mal probiert habe und auf anhieb nicht geschafft habe und dann anders gelöst habe.

    Danke für deine Hilfe auf jeden Fall!
    Geändert von Nacht69 (23.07.2020 um 10:30 Uhr)

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

    Standard

    Naja, du könntest quasi das selbe Formular irgendwie automatisiert nochmal (versteckt) ausgeben lassen und dort per Insert Tags die Felder befüllen und dann per JavaScript absenden lassen - mit der richtigen Ziel URL. Das ist aber sehr hacky und nicht wirklich verlässlich

    Nur nochmal zur Erklärung: der POST Request eines Formulares auf einer Webseite wird vom Browser an die Ziel URL gesendet. Im Fall des Formulargenerators ist die Ziel URL eine Contao URL, damit Contao das Formular verarbeiten kann.

  15. #15
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Naja, du könntest quasi das selbe Formular irgendwie automatisiert nochmal (versteckt) ausgeben lassen und dort per Insert Tags die Felder befüllen und dann per JavaScript absenden lassen - mit der richtigen Ziel URL. Das ist aber sehr hacky und nicht wirklich verlässlich

    Nur nochmal zur Erklärung: der POST Request eines Formulares auf einer Webseite wird vom Browser an die Ziel URL gesendet. Im Fall des Formulargenerators ist die Ziel URL eine Contao URL, damit Contao das Formular verarbeiten kann.
    Also die Weiterleitung auf die Externe Seite funktioniert aber.

    - Neue Seite anlegen mit externen weiterleitung auf die externe Seite.
    - Im Formulargenerator diese Seite auswählen.

    funktioniert. Nur die Post Variablen werden nicht ausgeben. Auch die Benachrichtigung kommt an.
    Geändert von Nacht69 (23.07.2020 um 10:41 Uhr)

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

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    Also die Weiterleitung auf die Externe Seite funktioniert aber.
    Ja, aber der Browser schickt den POST Request nicht dorthin. Der Browser schickt den POST Request an Contao, Contao Antwortet mit einem 301 Status. Der Browser ruft dann die URL aus dem 301 Response mit einem normalen GET Request auf.

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

    Standard

    Ah, aber ich hätte gerade ein Idee. Du könntest in einem processFormData Hook eine RedirectResponseException werfen, mit der URL des Services, mit einem 307 Status. Der 307 Status veranlasst dann den Browser den selben POST Request nochmals an die neue URL zu senden. Somit hast du einerseits den ersten POST Request von Contao verarbeiten lassen und lässt dann den Browser den selben POST Request nochmals an diesen externen Service schicken.

  18. #18
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Hallo,

    wir haben das Problem nun mit CURL gelöst. dh. im prepareFormData über CURL die Daten an die geforderte URL senden. Wenn das Result ein OK gibt nichts machen und ganz normal auf UNSERE danke Seite leiten. Wenn die CURL abfrage jedoch einen Fehler ausgibt muss wieder zurück auf das Formular geleitet werden.

    Möglichkeit 1:
    Code:
    header('Location: '.$_SERVER["HTTP_REFERER"].'?error='.$result);
    Problem: Das Formular ist dann natürlich leer.

    Möglichkeit 2:
    Code:
    echo "<script>
    		history.go(-1);
    		</script>";
    Problem: 1. javascript. 2. Auf manchen Servern erscheint: "Erneute Formular-Übermittlung bestätigen ERR_CACHE_MISS".

    Gibt es evtl. noch eine weitere Möglichkeit? Am besten mit PHP?

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

    Standard

    Etwas ähnliches haben wir mal gemacht. Der grundsätzliche Aufbau war folgender:

    • In einem validateFormField Hook wird überprüft, ob für dieses Feld ein Fehler in der Remote API gemeldet wurde.
      • Ist noch kein API Result vorhanden, werden die aktuellen POST Daten an die Remote API gesendet und das Ergebnis in einer statischen Variable gespeichert. Beim Aufruf des validateFormField Hook für das nächste Widget ist das API Result also dann schon da.
        • Wurde ein Fehler gefunden, wird das entsprechend mit $widget->addError im Hook vermerkt.

  20. #20
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Etwas ähnliches haben wir mal gemacht. Der grundsätzliche Aufbau war folgender:

    • In einem validateFormField Hook wird überprüft, ob für dieses Feld ein Fehler in der Remote API gemeldet wurde.
      • Ist noch kein API Result vorhanden, werden die aktuellen POST Daten an die Remote API gesendet und das Ergebnis in einer statischen Variable gespeichert. Beim Aufruf des validateFormField Hook für das nächste Widget ist das API Result also dann schon da.
        • Wurde ein Fehler gefunden, wird das entsprechend mit $widget->addError im Hook vermerkt.
    Auf das $widget->addError habe ich aba keinen Zugriff im PrepareFormData Hook oder? Und im ValidateFormField Hook nicht auf alle Felder, richtig?
    Ich muss alle Daten aufeinmal (eine Anfrage) per CURL senden...

    PS: und ob ein Fehler vorliegt sehe ich erst wenn die CURL abfrage durch ist.
    Geändert von Nacht69 (17.08.2020 um 17:44 Uhr)

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

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    Auf das $widget->addError habe ich aba keinen Zugriff im PrepareFormData Hook oder? Und im ValidateFormField Hook nicht auf alle Felder, richtig?
    Ich muss alle Daten aufeinmal (eine Anfrage) per CURL senden...
    Doch, auf die gesendeten POST Daten kannst du natürlich immer zugreifen.


    Zitat Zitat von Nacht69 Beitrag anzeigen
    PS: und ob ein Fehler vorliegt sehe ich erst wenn die CURL abfrage durch ist.
    Daher auch der Ablauf wie beschrieben .

  22. #22
    Contao-Fan
    Registriert seit
    16.01.2012.
    Beiträge
    418

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Doch, auf die gesendeten POST Daten kannst du natürlich immer zugreifen.


    Daher auch der Ablauf wie beschrieben .
    AH ich denke ich habe es verstanden.

    Wurde ein Fehler gefunden, wird das entsprechend mit $widget->addError im Hook vermerkt.
    Kann man hier auch einen Generellen Fehler wie zB "Spamverdacht" der nicht auf ein widget bezogen ist, ausgeben?

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

    Standard

    Zitat Zitat von Nacht69 Beitrag anzeigen
    Kann man hier auch einen Generellen Fehler wie zB "Spamverdacht" der nicht auf ein widget bezogen ist, ausgeben?
    So eine Möglichkeit gibt es bei Contao Formularen bisher leider nicht. Wäre aber ein wünschenswertes Feature. Könntest du also als Feature Request auf GitHub posten.

  24. #24
    Contao-Nutzer
    Registriert seit
    21.02.2019.
    Beiträge
    1

    Standard

    Ich greife das Thema noch mal auf, weil ich vor dem selben Problem stehe:
    Von einem Contao Formular aus soll eine Newsletter-Anmeldung an Cleverreach gesendet werden. Da im Formularmodul nur auf eine interne Seite weitergeleitet werden kann, empfange ich dort mit \Input::post die Daten aus dem Formular und baue daraus einen neuen post request an Cleverreach, den ich mit \Request versenden möchte:
    Code:
     $action = "cleverreach url für anmeldungen per post request";
     $formData = array(
      "salutation" => \Input::post("salutation"),
      "title"      => \Input::post("title"),
      "firstname"  => \Input::post("firstname"),
      "lastname"   => \Input::post("lastname"),
      "company"    => \Input::post("company"),
      "email"      => \Input::post("email")
      );
    
     $form = new \Request();
     $form->send($action, http_build_query($formData), "POST");
    Das Problem ist nun, dass die Seite aufgerufen wird, aber die post variablen nicht mitkommen. Wenn ich statt mit \Request mit curl poste, geht es. Es scheint so, als ob die \Request Klasse die Post Werte nicht mitsendet.
    Weiss jemand, wo ich eine Doku der contao \Request Klasse finde?

  25. #25
    Contao-Nutzer
    Registriert seit
    30.07.2015.
    Beiträge
    140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    ... in einem processFormData Hook eine RedirectResponseException werfen, mit der URL des Services, mit einem 307 Status. Der 307 Status veranlasst dann den Browser den selben POST Request nochmals an die neue URL zu senden.
    Sehr genial, hab es über die Suche gefunden und dann auch so gelöst:

    PHP-Code:
    class ProcessFormDataListener
    {
        public function 
    __invoke(array $submittedData, array $formData, ?array $files, array $labelsForm $objForm): void
        
    {
            if (
    111 == (int) $objForm->id) {
                throw new 
    RedirectResponseException('https://externe/domain'307);
            }
        }

    Damit wird das Formular auch so wie ich es in Contao mit dem Generator angelegt hab, zusätzlich als Request an die externe Domain gesendet...
    Wir sind Contao-Sponsor :-)

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

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    So eine Möglichkeit gibt es bei Contao Formularen bisher leider nicht. Wäre aber ein wünschenswertes Feature. Könntest du also als Feature Request auf GitHub posten.
    Die Möglichkeit gibt es Mittlerweile in Contao 5 btw.
    » sponsor me via GitHub or PayPal or Revolut

Aktive Benutzer

Aktive Benutzer

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

Lesezeichen

Lesezeichen

Berechtigungen

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