Florian Kausler: 1 Form - 2 Actions

Hallo an alle dort draußen...

Wer diesen Betreff liest, wird auch erst mal denken: "Alter Hut". Leider stellt sich mein Problem nicht ganz so einfach dar.
Ich habe ein Formular, dessen Daten je nach Bedarf an zwei verschiedene PHP-Scripte geschickt werden. Dabei ist wichtig, dass die Daten ENTWEDER an das eine ODER an das andere Script gelangen. Soweit eigentlich noch kein Problem, da ich das über documents.forms[0].action = [...] gelöst habe. Je nach dem, welcher Button geklickt wird, werden unterschiedliche Scripte ausgeführt. Leider scheinen dabei die Daten aus den Listen, die ich mit <select name="x"><option value="Y">...</select> übergeben will, verloren zu gehen. Füge ich einen normalen Submit-Button ein, werden alle Daten korrekt übergeben.

Ich hoffe, irgendein Genie hat eine Idee, woran das liegt.

mfG

F. Kausler

  1. [...] Füge ich einen normalen Submit-Button ein, werden alle Daten korrekt übergeben.

    Du kannst doch eigentlich einen normalen Submit-Button verwenden, wenn du im <FORM>-Tag einfach "onSubmit='...'" reinschreibst und damit kurz vor dem Absenden des Formulars die action setzt.

    Das ist allerdings ein schlechter Anwendungsbereich für JS, weil nicht-JS-Besucher dann das Formular nicht abschicken können.

    Robert

    1. Grüssi

      Kannst du deinen Code mal posten? Ich sehe keinen Grund, warum ein Select-Feld bei einer Action-Änderung verloren gehen kann!

      Das ist allerdings ein schlechter Anwendungsbereich für JS, weil nicht-JS-Besucher dann das Formular nicht abschicken können.

      Doch! Im Gegenteil, das ist sogar das beste was man machen kann ;-) Im gegensatz zu einem type="button" mit onclick="document.formular.submit()" wird das Formular mit einem Submit-Button immer abgeschickt! Leute die kein JS aktiviert haben kommen dann zwar nicht in den Zusatznutzen, der onSubmit aufgerufen wird, aber die Daten gehen zumindest an die mit action="" vordefinierte default-Action! Bei einem Normalen Button funktioniert ohne JS gar nix :-(

      lg bernhard

      1. Grüssi

        ebenfalls ;-)

        Kannst du deinen Code mal posten? Ich sehe keinen Grund, warum ein Select-Feld bei einer Action-Änderung verloren gehen kann!

        Kann ich schon, ich weiß aber nicht wann welches PHP verwendet werden soll. Wäre praktisch, wenn du mir deine URL angibst. Weil das Ganze jetzt hier wahrscheinlich Keinen mehr interessiert, kannst du's eigentlich gleich an mich schicken.

        Das ist allerdings ein schlechter Anwendungsbereich für JS, weil nicht-JS-Besucher dann das Formular nicht abschicken können.

        [..] Leute die kein JS aktiviert haben kommen dann zwar nicht in den Zusatznutzen, der onSubmit aufgerufen wird, aber die Daten gehen zumindest an die mit action="" vordefinierte default-Action!

        Ja, dann muss aber das Standart-PHP in der Lage sein, auf jeden Fall eine Standartfunktion  auszuwerten.

        Robert

        1. Grüssi

          Sorry, aber ich kapier dieses Posting absolut überhaupt nicht!

          Kannst du deinen Code mal posten? Ich sehe keinen Grund, warum ein Select-Feld bei einer Action-Änderung verloren gehen kann!

          Kann ich schon, ich weiß aber nicht wann welches PHP verwendet werden soll.

          Was heisst "welches PHP verwendet werden soll" ?

          Weil das Ganze jetzt hier wahrscheinlich Keinen mehr interessiert, kannst du's eigentlich gleich an mich schicken.

          Nur weil keine Antworten kommen heisst das noch lange nicht dass es keinen mehr interessiert! Es ist vielmahr so, dass man in diesem Fall ohne Code nicht viel sagen kann! Ausserdem: Grundsätzlich gilt hier im Forum "open source" ;-) also keine Privat-Gschichteln bitte! Du nimmst zukünftigen Archivlesern die Möglichkeit eine Lösung für dieses Problem zu bekommen!

          Was soll ich dir denn schicken ?!?

          [..] Leute die kein JS aktiviert haben kommen dann zwar nicht in den Zusatznutzen, der onSubmit aufgerufen wird, aber die Daten gehen zumindest an die mit action="" vordefinierte default-Action!

          Ja, dann muss aber das Standart-PHP in der Lage sein, auf jeden Fall eine Standartfunktion  auszuwerten.

          1. was ist "Standard-PHP"
          2. was ist eine "Standard-Funktion"?
          3. was soll letztere "auswerten"?

          lg *von einem vollends verwirrten* bernhard

          1. Hallo,

            Sorry, aber ich kapier dieses Posting absolut überhaupt nicht!

            Kannst du deinen Code mal posten? Ich sehe keinen Grund, warum ein Select-Feld bei einer Action-Änderung verloren gehen kann!

            Kann ich schon, ich weiß aber nicht wann welches PHP verwendet werden soll.

            Was heisst "welches PHP verwendet werden soll" ?

            Du hast doch in deinem ersten Posting geschrieben, dass du je nach Eingaben des Besuchers zwei verschiedene PHPs verwenden willst (so hab' ich dich wenigstens verstanden). Um ein Script zu programmieren, das entscheiden kann, unter welchen Umständen welches PHP verwendet werden soll, muss ich das also selbst erst einmal von dir erfahren.

            Nur weil keine Antworten kommen heisst das noch lange nicht dass es keinen mehr interessiert!

            Nein, das meine ich nicht. Nur, unter welchen Umständen bei dir welche Action verwendet werden soll, interessiert wohl keinen mehr, weil es nichts mit HTML, JavaScript oder Ähnlichem zu tun hat, sondern ganz speziell mit deiner eigenen Homepage zusamenhängt.

            Es ist vielmahr so, dass man in diesem Fall ohne Code nicht viel sagen kann!

            Wieso? Ich hab' dir ja schon geschrieben, wie das ganze funktionieren könnte. Wenn du dich mit JavaScript auskennst, wäre es also kein Problem mehr, das ganze selbst zu programmieren. Ich schicke dir ja gerne einen Code, aber du musst mir davor sagen, was dieser Code bewirken soll.

            Ausserdem: Grundsätzlich gilt hier im Forum "open source" ;-) also keine Privat-Gschichteln bitte!

            Du hast mich anscheinend nicht richtig verstanden. Die Information, die ich von dir brauche, um dir das Script zu programmieren, hängt nur speziell mit deiner Homepage zusammen. Wenn ich in diesem Forum zum Beispiel schreiben würde, welche Bilder ich auf meiner HP wie benannt habe, dann interessiert das hier auch keinen, weil das nur speziell mit meiner Homepage zu tun hat, und ich kann mir nicht vorstellen, dass später im Archiv danach gesucht wird.

            Du nimmst zukünftigen Archivlesern die Möglichkeit eine Lösung für dieses Problem zu bekommen!

            (Siehe oben)
            Da dieses Problem nur auf dich speziell zutrifft, werden - genauso wie in dem oben genannten Beispiel - keine Archivleser danach suchen.

            Was soll ich dir denn schicken ?!?

            Du wolltest doch, das ich dir einen JavaScript-Code schicke, wenn ich dich richtig verstanden habe. Darauf habe ich geantwortet, dass ich erst einmal wissen muss, was genau dieser JS-Code machen soll. Wenn ich nicht weiß, was das Script bewirken soll, kann ich es dir doch auch nicht programmieren, oder?

            1. was ist "Standard-PHP"

            Du hast doch in deinem Posting von "default-Action" geschrieben. "default" heißt auf deutsch "standart" und da als Actions laut deinem ersten Posting PHP-Scripts angesprochen werden, habe ich "PHP" synnonym zu "Action" verwendet. Daraus ergibt sich dann "Standart-PHP". (Das war jetzt aber schön beschrieben ;-)

            1. was ist eine "Standard-Funktion"?

            Du hast doch in deine Nachricht geschrieben "Leute die kein JS aktiviert haben kommen dann zwar nicht in den Zusatznutzen [...]". Wenn es Zusatznutzen (oder auch "Zusatz-Funktionen") gibt, dann muss es doch eigentlich auch Standart-Funktionen geben.

            1. was soll letztere "auswerten"?

            Die Daten des Formulars werden doch wahrscheinlich irgendwie versand. Das Programm, an die die Daten versand werden, muss dann irgendwie die Daten auswerten können, weil sonst das Formular sinnlos ist. Bei Besuchern, die JS deaktiviert haben, kann das Formular an das falsche Programm versandt werden, weil vorher die Adresse ja nicht angepasst wird. Also muss dieses Programm irgendetwas mit den Daten anfangen können, obwohl sie nicht für dieses Programm gedacht waren.

            lg *von einem vollends verwirrten* bernhard

            Ich hoffe, ich hab' dich jetzt nicht noch mehr verwirrt,

            Robert

            1. Grüssi

              *lol* na da liegt jetzt aber ein grenzgeniales Missverständnis erster Ordnung vor :-) Les dir nochmal das ausgangsposting durch, ganz besonders den Namen des Fragenden, und dann meinen! Meineszeichens - genau wie du - Antwortender ;-)

              Du hast doch in deinem ersten Posting geschrieben, dass du je nach Eingaben des Besuchers zwei verschiedene PHPs verwenden willst (so hab' ich dich wenigstens verstanden).

              Also nochmal von Anfang an, damit der Zusammenhang der Postings hoffentlich besser ersichtlich wird ;-)

              Dein erstes Antwortposting:
              ------------------------------

              [...] Füge ich einen normalen Submit-Button ein, werden alle Daten korrekt übergeben.

              Du kannst doch eigentlich einen normalen Submit-Button verwenden, wenn du im <FORM>-Tag einfach "onSubmit='...'" reinschreibst und damit kurz vor dem Absenden des Formulars die action setzt.

              Das ist allerdings ein schlechter Anwendungsbereich für JS, weil nicht-JS-Besucher dann das Formular nicht abschicken können.
              ------------------------------

              Daraufhin habe ich dich verbessert, dass gerade bei einem onSubmit mit deaktiviertem Javascript das Formular wenigstens an die "default-Action, die im <form>-Tag angegeben wurde abgeschickt wird. Was onSubmit geschieht ist einem Browser mit deaktiviertem JS wurscht. Aber das Formular wird _immer_ abgeschickt.

              Im Gegensatz dazu wenn man dasselbe beispielsweise mit zwei buttons (type="button") versucht, und das Formular mit onClick="document.formular.submit()" abschickt, geht ohne JS gar nix.

              Mehr wars eigentlich nicht. Meine Antwort bezog sich also mehr als nähere Ausführung zu deiner Antwort, und nicht so sehr als Antwort auf Florians Frage. Zu Florians Problem habe ich dieselbe Antwort wie du: "Ohne Code geht gar nix!"

              Wieso? Ich hab' dir ja schon geschrieben, wie das ganze funktionieren könnte. Wenn du dich mit JavaScript auskennst, wäre es also kein Problem mehr, das ganze selbst zu programmieren.

              Kannst mir glauben, das würd ich sdchon hinkriegen ;-) aber ich habe kein Problem, Florian hat eines! Ausserdem wäre eine Serverseitige Lösung so wie du es hier vorschlägst ohnehin besser (und sicherer)! (=Abfrage am Server welcher Button gedrückt wurde)

              Da dieses Problem nur auf dich speziell zutrifft, werden - genauso wie in dem oben genannten Beispiel - keine Archivleser danach suchen.

              Nein, stimmt nicht.

              Du wolltest doch, das ich dir einen JavaScript-Code schicke, wenn ich dich richtig verstanden habe. Darauf habe ich geantwortet, dass ich erst einmal wissen muss, was genau dieser JS-Code machen soll. Wenn ich nicht weiß, was das Script bewirken soll, kann ich es dir doch auch nicht programmieren, oder?

              So, ich hoffe jetzt (halbwegs verständlich) dargelegt zu haben dass dem nicht so ist ;-)

              1. was ist "Standard-PHP"

              Du hast doch in deinem Posting von "default-Action" geschrieben. "default" heißt auf deutsch "standart" und da als Actions laut deinem ersten Posting PHP-Scripts angesprochen werden, habe ich "PHP" synnonym zu "Action" verwendet. Daraus ergibt sich dann "Standart-PHP". (Das war jetzt aber schön beschrieben ;-)

              Schön beschrieben schon, aber ein bissl zuuuuuuu sehr verallgemeinert. Der Gedankengang von "Script" zu "PHP" ist schon ein etwas sehr grosser ;-)

              1. was ist eine "Standard-Funktion"?

              Du hast doch in deine Nachricht geschrieben "Leute die kein JS aktiviert haben kommen dann zwar nicht in den Zusatznutzen [...]". Wenn es Zusatznutzen (oder auch "Zusatz-Funktionen") gibt, dann muss es doch eigentlich auch Standart-Funktionen geben.

              so, ich mach hier jetzt nen Punkt, sonst trägt mein süsses kleines Köpfchen womöglich bleibende Schäden davon ;-)

              lg bernhard

              1. Hallo,

                *lol* na da liegt jetzt aber ein grenzgeniales Missverständnis erster Ordnung vor :-) Les dir nochmal das ausgangsposting durch, ganz besonders den Namen des Fragenden, und dann meinen! Meineszeichens - genau wie du - Antwortender ;-)

                Oops, da hab ich nicht so genau geschaut.

                Daraufhin habe ich dich verbessert, dass gerade bei einem onSubmit mit deaktiviertem Javascript das Formular wenigstens an die "default-Action, die im <form>-Tag angegeben wurde abgeschickt wird. Was onSubmit geschieht ist einem Browser mit deaktiviertem JS wurscht. Aber das Formular wird _immer_ abgeschickt.

                Das hab ich schon verstanden. Darauf habe ich geantwortet, dass dann aber das "falsche" PHP Daten auswerten muss, die eigentlich nicht für dieses PHP gedacht waren. Das kann natürlich möglich sein. Es kann aber auch sein, dass dann dieses PHP nur Falsches zurückgibt.

                Kannst mir glauben, das würd ich sdchon hinkriegen ;-) aber ich habe kein Problem, Florian hat eines!

                Ja, natürlich. Das hab ich jetzt - nachdem ich die Namen überprüft habe - auch bemerkt ;-)

                Ausserdem wäre eine Serverseitige Lösung so wie du es hier vorschlägst ohnehin besser (und sicherer)! (=Abfrage am Server welcher Button gedrückt wurde)

                Dem kann ich nur zustimmen. Deshalb hab ich ja geschrieben, dass ich die JS-Lösung nicht so gut finde. Wahrscheinlich wäre es sogar am einfachsten, wenn man zwei Radio-Buttons hat, mit denen man auswählt, welche Funktion man nutzen will. Dann braucht man nur noch einen normalen Submit-Button.

                Da dieses Problem nur auf dich speziell zutrifft, werden - genauso wie in dem oben genannten Beispiel - keine Archivleser danach suchen.

                Nein, stimmt nicht.

                Verstehe ich nicht, ist jetzt aber auch egal, weil wir jetzt eh schon hier posten.

                Du wolltest doch, das ich dir einen JavaScript-Code schicke, wenn ich dich richtig verstanden habe. Darauf habe ich geantwortet, dass ich erst einmal wissen muss, was genau dieser JS-Code machen soll. Wenn ich nicht weiß, was das Script bewirken soll, kann ich es dir doch auch nicht programmieren, oder?

                So, ich hoffe jetzt (halbwegs verständlich) dargelegt zu haben dass dem nicht so ist ;-)

                Ja, natührlich. Du musst das Ganze natührlich auf Florian bezogen sehen.

                Du hast doch in deinem Posting von "default-Action" geschrieben. "default" heißt auf deutsch "standart" und da als Actions laut deinem ersten Posting PHP-Scripts angesprochen werden, habe ich "PHP" synnonym zu "Action" verwendet. Daraus ergibt sich dann "Standart-PHP". (Das war jetzt aber schön beschrieben ;-)

                Schön beschrieben schon, aber ein bissl zuuuuuuu sehr verallgemeinert. Der Gedankengang von "Script" zu "PHP" ist schon ein etwas sehr grosser ;-)

                Ich hatte eigentlich keinen Gedankengang von "Script" zu "PHP". Ich hatte nur Gedankengänge von
                  - "default" zu "standart" (Übersetzung)
                  - "Action"  zu "PHP"      (wegen erstem Posting)
                  => "default-Action" zu "Standart-PHP"

                (Das ist ja fast schon ein Dreisatz ;-)

                Robert

              2. Hallihallo ihr zwei,

                danke erstmal für Euren unglaublichen Einsatz. Hatte bisher leider keine Gelegenheit, weiterhin zu posten. Mein Rechner spinnt ein wenig und musste zur Reparatur.
                Nun denn, bisher lief es ja so (falls ich das noch nicht erwähnt haben sollte), dass bei dem Klick auf einen Button per JavaScript die Formaction gesetzt wird. Allerdings hat die Sache einen Haken, nur ein Teil der Daten wird gesendet. Ich habs schon mit POST und GET als method versucht, aber nichts. Deswegen hier mal ein kurzer Auszug aus dem SourceCode (ganz wäre er viel zu lang und sinnlos, deswegen die entscheidenden Stellen):

                <html>
                <head>
                [...]

                <script language="JavaScript">
                <!--

                function SubmitToModule(target) {
                 document.forms[0].action = target;
                 document.forms[0].submit();
                }

                //-->
                </script>
                </head>
                <body>

                [...]

                <form name="article" action="text.php" method="POST">

                <table border="0" width="100%">
                <tr>
                 <td colspan="2"><strong>T-Shirt (V-Ausschnitt)</strong></td>
                </tr>
                <tr>
                 <td>Hersteller:</td>
                 <td>Hugo Boss Company</td>
                </tr>
                <tr>
                 <td colspan="2">
                 </td>
                </tr>
                <tr>
                 <td valign="top" align="left">
                 Größe
                <select name="att01"><option value="XS">XS
                <option value="S">S
                <option value="M">M
                <option value="L">L
                <option value="XL">XL
                <option value="XXL">XXL
                </select>

                Farbe
                <select name="att03"><option value="weiß">weiß
                <option value="rot">rot
                <option value="blau">blau
                <option value="gelb">gelb
                <option value="grün">grün
                <option value="schwarz">schwarz
                <option value="grau">grau
                <option value="pink">pink
                <option value="blauschwarz">blauschwarz
                </select>

                </td>
                 <td valign="top" align="right">

                <table border="0">
                 <tr><td valign="top"></td><td align="right" valign="top">14.99 EUR<br><font size="-1"></font></td></tr>
                 <tr><td valign="top"></td><td align="right" valign="top"><br><font size="-1"></font></td></tr>
                 <tr><td valign="top"></td><td align="right" valign="top"><br><font size="-1"></font></td></tr>
                 </table>

                <input type="hidden" name="uid2" value="uid">
                 <input type="text" name="number" size="4" maxlength="4">

                </form>

                <input type="button" value="in den Warenkorb legen" onClick="SubmitToModule('basket.php?shop=DEVEL&uid=7d1-6-1a-11-8-24&artid=3&do=insert')">

                <input type="button" value="Details anzeigen" onClick="SubmitToModule('detail.php?shop=DEVEL&uid=7d1-6-1a-11-8-24&artid=3')">

                </td>
                </tr>
                </table>
                <hr>

                [...]

                </body>
                </html>

                Nur noch kurz als Anmerkung: Die Actions MÜSSEN so aussehen, dass bereits Werte angehängt sind (Sicherheitsgründe, Sicherstellung der richtigen Funktionsweise in den nachfolgenden Modulen). Üblicherweise werden Eingaben in die Felder 'uid2' und 'number' auch übergeben. Nur die '<select>'-Daten fehlen, aber gerade die sind ziemlich wichtig...
                Danke schon mal im Voraus für Eure Mühen

                Florian Kausler

                1. Grüssi,

                  </form>

                  <input type="button" value="in den Warenkorb legen" onClick="SubmitToModule('basket.php?shop=DEVEL&uid=7d1-6-1a-11-8-24&artid=3&do=insert')">

                  <input type="button" value="Details anzeigen" onClick="SubmitToModule('detail.php?shop=DEVEL&uid=7d1-6-1a-11-8-24&artid=3')">

                  Setz das </form> mal _unter_ die Submit-Buttons!

                  Anmerkungen: </option>s nicht vergessen, und reichlich schlecht verschachtelt ist dein <form> :-( Am besten wärs wenn du das ganze Formular in eine Zelle stecken könntest!

                  Ich weiss nicht ob es erlaubt ist, an einen Query-String, nochmal den Querystring eines Fromulars dazuzuhängen! Möglicher Workaround:

                  Soweit ich sehe sind $shop, $uid, und $artid überall gleich, du musst also nur eine leeres (!) hiddenfeld einbauen, dem du bei Klick auf den Button den Wert insert übergibts, und danach das Formular abschickst!

                  <input type="hidden" name="shop" value="DEVEL">
                  <input type="hidden" name="uid" value="7d1-6-1a-11-8-24">
                  <input type="hidden" name="do" value="">
                  <input type="hidden" name="artid" value="3">

                  <input type="button" value="in den Warenkorb legen" onClick="document.forms[0].elements['do'].value = 'insert'; SubmitToModule('basket.php');">

                  <input type="button" value="Details anzeigen" onClick="SubmitToModule('detail.php');">

                  function SubmitToModule(url) {
                   document.forms[0].action = url;
                   document.forms[0].submit();
                  }

                  so, bin gespannt ob das was nützt ;-)

                  lg bernhard

                  1. Hallihallo,

                    das ging ja ganz schön flott... Danke erstmal (nochmal). Das mit dem </form> war ja schon mal ganz gut... Aber:

                    1. Ich kann aus verschiedenen Gründen das Form nicht weniger verschachteln.
                    2. Ich kann die Werte $shop usw. nicht in hidden-fields setzen. Es handelt sich nämlich um Onlineshoptemplates. Hiddenfields verwirren den weniger versierten User zu sehr und sind eine Art Risikofaktor, wenn der Kunde sie später editieren soll.
                    3. Es ist möglich die QueryStrings zu verschachteln. Ein Teil wird per GET übergeben (alles nach dem Fragezeichen direkt bei action="[...]"), der Rest kommt per POST. Hat schon mehrfach gefunzt...
                    4. Ich dachte immer, </option> sei optional, wie z.B. </li>...

                    Ich glaube das wars im Moment. Also noch tuts leider nicht...

                    Vielleicht hat ja noch jemand ander ne Idee, sonst muss ich wohl wirklich noch ein Skript zwischenschalten...

                    Danke

                    Florian

                    1. Also gut, damit das Ganze endlich ein Ende nimmt:

                      Ich habe mein Problem jetzt Serverseitig gelöst. Gefällt mir zwar nicht ganz so gut, aber scheint ja leider nicht anders zu gehen,

                      Danke dennoch an Euch beide ;-)

                      Florian