Nico R.: JS in fetch-Datei ausführen

Hallo zusammen,

nächstes Problem 😀 Ich habe ein recht komplexes PHP-Script form.php, das per HTML ein Formular darstellt, welches mit PHP und sehr viel JS (u.a. mehrere fetch-Aufrufe) befüllt wird. Der Nutzer kann das Formular per Browser aufrufen und die Daten bearbeiten/absenden. So weit, so normal.

Nun möchte ich dieses Formular über liste.html automatisiert per Fetch API im Hintergrund aufrufen, per JS befüllen und absenden. Allerdings wird sämtliches JS aus form.php (inklusive wie gesagt weiterer fetch-Aufrufe) beim fetch-Aufruf ja nicht ausgeführt.

Vermutlich ist das Vorhaben zum Scheitern verurteilt. Aber bevor ich alles über den Haufen werfe, frage ich doch mal lieber. Gibt es eine Möglichkeit, das irgendwie umzusetzen? Ist es möglich, das Browser-Verhalten auf dem Server quasi zu "simulieren"? Lautet das Stichwort Node.js? In dem Fall wirds mir wohl zu aufwendig, da ich, soweit ich das gelesen habe, den JS-Code aus form.php nicht 1:1 nutzen könnte.

In dem besagten PHP-Script passiert per JS wie gesagt so viel und ich habs leider auch so naiv, stumpf prozdedural runtergeschrieben, dass ich keine Ahnung habe, wie ich das sinnvoll entzetteln könnte. Ich würde einfach gerne das funktionierende Formular nutzen.

Der einzige Notanker ist dann noch, form.php nicht per fetch(), sondern per location.href aufzurufen. Das wird aber, fürchte ich, ein unschönes Geruckel und Gezuckel, ich kann keinen progress darstellen und mir gehen durch den kompletten Seitenaufruf immer wieder Informationen verloren. Wobei, da könnte ich eventuell mit localStorage arbeiten. Hm, ich werd am Sonntag nochmal grübeln...

Ein schönes Wochenende erst einmal allen hier

  1. Hi,

    nächstes Problem 😀 Ich habe ein recht komplexes PHP-Script form.php, das per HTML ein Formular darstellt, welches mit PHP und sehr viel JS (u.a. mehrere fetch-Aufrufe) befüllt wird. Der Nutzer kann das Formular per Browser aufrufen und die Daten bearbeiten/absenden. So weit, so normal.

    Nun möchte ich dieses Formular über liste.html automatisiert per Fetch API im Hintergrund aufrufen, per JS befüllen und absenden. Allerdings wird sämtliches JS aus form.php (inklusive wie gesagt weiterer fetch-Aufrufe) beim fetch-Aufruf ja nicht ausgeführt.

    dann lade das JS nicht per fetch, sondern indem Du ein script-Element ins Dokument einfügst.

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      ja, ich habe gelesen, dass das wohl funktionieren soll. Aufgrund von Folgeproblemen, die absehbar waren (verschachtelte fetch-Abrufe usw.) habe ich das nicht weiter verfolgt.

      Schöne Grüße

      Nico

  2. Hallo Nico,

    am Ende wird form.php einen POST Request absetzen, der die Daten in die DB schreibt. Diesen POST musst Du simulieren, nicht den Benutzerdialog in form.php.

    Wenn Du einen Business-Vorgang hast, der im Moment nur interaktiv abläuft, in Zukunft aber auch automatisiert ablaufen soll, dann ist das typischerweise viel Arbeit. Der Weg zum finalen POST ist derzeit nur interaktiv erreichbar. Aber das zu simulieren solltest Du möglichst vermeiden. Versuche, einen möglichst direkten Weg zum finalen Post zu finden (den Du dann mit fetch durchführen kannst).

    Schwieriger wird es, wenn auf dem Weg dahin eine PHP Session mitgeführt wird und darin die passenden Daten stehen müssen. Das lässt sich aber auf Grund deiner abstrahierten Beschreibung schlecht beurteilen.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo Rolf,

      ich habs mit der Holzhammermethode gelöst und rufe das Formular einfach in einer Schleife immer wieder per location.href auf. Danach wird es befüllt, per fetch abgesendet, neu aufgerufen usw. Per display:none und einer darüber liegenden Ladegrafik läuft das quasi im Hintergrund und zu meiner Überraschung recht flüssig ab. Die Weitergabe von Informationen löse ich ganz klassisch per $_GET und teilweise per localStorage.

      am Ende wird form.php einen POST Request absetzen, der die Daten in die DB schreibt. Diesen POST musst Du simulieren, nicht den Benutzerdialog in form.php.

      Ja, das wäre auch mein bevorzugtes Vorgehen gewesen. Es gibt aber z.B. in dem Formular Felder, die erst innerhalbs des <script>-Teils nach einem fetch erzeugt und gefüllt werden. Die fetches sind komplett auf die Erzeugung des Formulars ausgerichtet.

      Ich hätte das Script nun an dutzenden Stellen entwirren müssen, um das Ergebnis der einzelnen fetches zu extrahieren. Klüger wäre das vermutlich von Anfang an gewesen. Es hätte vielleicht eine Methode/Funktion geben können, die nur das Ergebnis erzeugt und dann, je nach Aufruf weitergibt an eine Funktion createFormElement o.ä., das wäre wohl sauberer gewesen.

      Nun ja, ich habs auf die dreckige Art geschrieben und muss jetzt halt bei Änderungen immer wieder alles auseinanderbauen und neu zusammensetzen 😏

      Schöne Grüße

      Nico

      1. Hallo Nico,

        Es gibt aber z.B. in dem Formular Felder, die erst innerhalbs des <script>-Teils nach einem fetch erzeugt und gefüllt werden

        Ich meinte nicht, das HTML Form zu senden, sondern ein FormData Objekt zu erzeugen und dieses per fetch zu POSTen.

        Aber auch das mag sich als kompliziert erweisen. Wenn es jetzt für dich funktioniert, dann ist es ja gut. Ob ein Neuschreiben eine sinnvolle Investition ist, kannst nur du beurteilen.

        Rolf

        --
        sumpsi - posui - obstruxi