Markus: "Status" einer grafischen Schaltfläche abfragen

Hallo,

Wie kann ich den "Status" einer Schaltfläche abfragen, wenn ich ein Formular nicht über die grauen Schaltflächen, sondern über <input type="image"> abschicken will ?

is (isset ($Name_der_Schaltfläche)) funktioniert scheinbar nicht

Danke im voraus.

Markus

  1. Um mein Problem konkreter zu beschreiben:

    Bei meinem Formular soll, je nach angeklickter, grafischer Schaltfläche, ein bestimmter Parameter an die eigene Datei ( = PHP_SELF) übergeben werden.

    Das Formular hat folgenden Aufbau:

    <form method="post">
      Eingabefeld
      Eingabefeld
      ...
      <input type="image" id="Vorschau" name="Vorschau" value="Vorschau"
             onclick="document.forms[0].action='eintrag.php?Vorschau=1'; document.forms[0].submit()">
      <input type="image" id="Vorschau" name="Vorschau" value="Vorschau"
             onclick="document.forms[0].action='eintrag.php?Speichern=1'; document.forms[0].submit()">
    </form>

    Mein Problem liegt nun darin, dass ich die Schaltflächen anklicken, die beabsichtigten Aktionen aber nicht ausgeführt werden, d.h. egal ob ich den Wert über $_POST oder $_GET abfrage, es wird nichts übergeben.

    Deshalb meine Frage, wie ich dieses Problem lösen kann.

    Ich hoffe, Ihr könnt mir jetzt eher weiterhelfen.

    Gruss, Markus

    1. Hallo Markus,

      PHP arbeitet auf dem Server und weiss nichts von irgendwelchen Buttons

      onclick="document.forms[0].action='eintrag.php?Vorschau=1';

      Wozu sollen die Backslashes dienen?

      <input type="image" id="Vorschau" name="Vorschau" value="Vorschau"

      Es kann innerhalb eines Dokuments nur eine ID Vorschau geben

      Die Loesung fuer Dein Problem ist eher trivial:

      • Gib Deiner Form eine bestimmte action
      • Bename Deine beiden Schaltflaechen unterschiedlich, sagen wir mal mit 'aufgabe', denn der Name wird als Index im Postarray uebertragen
      • Gib einem der Bilder den value 'speichern', dem andern 'vorschau'

      Jetzt kannst Du in der Datei, die die Daten des Formulars in Empfang nimmt, eine Unterscheidung treffen:
      if($_POST['aufgabe'] == 'speichern')
      {
        mach dieses
      }
      else if($_POST['aufgabe'] == 'vorschau')
      {
        mach jenes
      }
      else
      {
        mach sonstwas
      }

      Dieter

      1. Hallo Dieter,

        <input type="image" id="Vorschau" name="Vorschau" value="Vorschau"

        • Gib einem der Bilder den value 'speichern', dem andern 'vorschau'

        Jetzt kannst Du in der Datei, die die Daten des Formulars in Empfang nimmt, eine Unterscheidung treffen:
        if($_POST['aufgabe'] == 'speichern')
        {
          mach dieses
        }
        else if($_POST['aufgabe'] == 'vorschau')

        [...]

        Das wird beim Einsatz verbreiteter Browser, z.B. Firefox und IE, nicht zum gewünschten Resultat führen. Es werden andere Daten übertragen, an die Namen werden Koordinatenwerte angehängt :-)

        Schau es Dir mal mit
            print_r($_POST)
        an.

        Freundliche Grüsse,

        Vinzenz

        1. Hallo Vinzenz,

          kannst Du das mit einem Beispiel belegen?

          Dieter

          1. Hallo Dieter,

            kannst Du das mit einem Beispiel belegen?

            Gern, leider verfüge ich jedoch nur lokal über PHP, also hier die Inhalte der zwei Dateien.

            ----------------------------------------
            Aufrufende Datei test-image.html (enthält im HTML-Grundgerüst)

            <div>
                <form action="kontrolle.php" method="post">
                    <input type="image" src="vorschau.gif" name="Vorschau"><br>
                    <input type="image" src="senden.gif" name="Senden">
                </form>
            </div>

            ----------------------------------------
            aufgerufenes Kontrollskript kontrolle.php

            Enthält im HTML-Grundgerüst im wesentlichen:

            <?php print_r($_POST); ?>

            ----------------------------------------
            Du benötigst selbstverständlich zusätzlich die Grafiken vorschau.gif und senden.gif.

            Freundliche Grüsse,

            Vinzenz

            PS: Du kannst auch gern mal http://de.selfhtml.org/html/formulare/anzeige/input_image.htm aufrufen.
            Dort sind allerdings Name und Koordinaten bereits getrennt. Dies ist in PHP nicht der Fall, dafür musst Du schon selbst sorgen.

            1. Hallo Vinzenz,

              Du musst den Bildern, wie ich in meinem Posting beschrieben habe, einen Value geben, sonst tritt das von Dir beschriebene Problem in der Tat auf.

              <form action="/test.php" method="post">
                <input name="test" value="foo" type="image" src="foo.png" />
                <input name="test2" value="bar" type="image" src="bar.png" />
              </form>

              POST sieht dann so aus:
              Array
              (
                  [test_x] => 49
                  [test_y] => 4
                  [test] => foo
              )

              Du kannst jetzt $_POST['test'] auswerten, die beiden anderen Werte ignorierst Du einfach.

              Dieter

              1. Hallo Dieter,

                Du musst den Bildern, wie ich in meinem Posting beschrieben habe, einen Value geben, sonst tritt das von Dir beschriebene Problem in der Tat auf.

                Danke, wieder etwas dazugelernt :-)

                Es handelt sich hier um ein Element, die ich sehr selten nutze. So, d.h. durch Fehler, erworbenes Wissen bleibt bei mir meist gut haften.

                Freundliche Grüsse,

                Vinzenz

              2. hi,

                Du musst den Bildern, wie ich in meinem Posting beschrieben habe, einen Value geben, sonst tritt das von Dir beschriebene Problem in der Tat auf.

                mit deiner lösung tritt das problem im IE und opera weiterhin auf; lediglich die geckos zeigen das von dir genannte verhalten, dass sie das wertepaar name=value ebenfalls übertragen.

                deine lösung ist also _nicht_ cross-browser-tauglich.

                darüber, ob name=value bei image-submits mit übertragen werden _muss_, haben wir hier übrigens schon einige diskussionen geführt - die meinungen gehen da auseinander, und auch der standard legt sich da nicht wirklich eindeutig interpretierbar fest.

                ich wiederhole nochmals: damit es in allen (gängigen) browsern funktioniert, sollte man auf name_x oder name_y abfragen.

                gruß,
                wahsaga

                --
                "Look, that's why there's rules, understand? So that you _think_ before you break 'em."
                1. Hi, wahsaga,

                  Habe Deinen Vorschlag aufgegriffen und folgendermassen umgesetzt:

                  $Vorschau_anzeigen = ($_POST ["Vorschau_x"] != null)  ? true : false;
                  $Eintrag_speichern = ($_POST ["Speichern_x"] != null) ? true : false;

                  if (($Vorschau_anzeigen === false) and ($Eintrag_speichern === false))
                    Formular_anzeigen ();
                  else
                  {
                    if ($Vorschau_anzeigen === true)
                    {
                      ...
                    }
                    else
                      if ($Eintrag_speichern === true)
                      {
                        ...
                      }

                  Die Umsetzung funktioniert einwandfrei :-)

                  Sollte ich da noch mehr beachten oder ist diese Abfrage "hieb-und stichfest" ?

                  Gruss, Markus

    2. Hallo Markus,

      ich zitiere Dein Posting in veränderter Reihenfolge:

      Bei meinem Formular soll, je nach angeklickter, grafischer Schaltfläche, ein bestimmter Parameter an die eigene Datei ( = PHP_SELF) übergeben werden.

      Das ist gar kein Problem, das passiert auch normalerweise.

      Deshalb meine Frage, wie ich dieses Problem lösen kann.

      Indem Du Deine Konzeption umstellst. Dies hat zusätzlich den sehr wünschenswerten Zusatzeffekt, dass Deine Abhängigkeit von Javascript entfällt.

      Ein Formular kann auf verschiedenen Wegen abgesandt werden, lies Dir bitte dazu das Kapitel Buttons zum Absenden oder Abbrechen in SelfHTML nochmals durch:

      Herkömmlicher Absendebutton
      <input type="submit" ...>

      Grafischer Absendebutton
      <input type="image" ...>

      Moderner Absendebutton
      <button type="submit" ...>

      D.h. Deine <input type="submit" ...> sorgen schon von allein dafür, dass das Formular abgesandt wird, Du brauchst kein Javascript dafür. Damit Du lernst, was übergeben wird, solltest Du eine Kontrollausgabe in Dein PHP-Skript integrieren, die Du später wieder entfernen kannst:

      Da Du mit der Methode 'POST' arbeitest, gibst Du den kompletten Inhalt von $_POST mit der Funktion print_r() aus:

      print_r($_POST);

      Das Formular hat folgenden Aufbau:

      <form method="post">

      Hier fehlt das vorgeschriebene Attribut 'action'. Du solltest als Wert eingabe.php nehmen, d.h. im PHP-Skript $_SERVER['PHP_SELF].

      [...]

      <input type="image" id="Vorschau" name="Vorschau" value="Vorschau"
               onclick="document.forms[0].action='eintrag.php?Vorschau=1'; document.forms[0].submit()">
        <input type="image" id="Vorschau" name="Vorschau" value="Vorschau"
               onclick="document.forms[0].action='eintrag.php?Speichern=1'; document.forms[0].submit()">

      Hier unterlaufen Dir gleich mehrere Fehler:
      Die beiden Buttons haben die gleiche 'id', das ist nicht erlaubt.
      Beiden Buttons fehlt die Angabe der Grafik, das src-Attribut. Ist Dir das nicht aufgefallen?
      Beide Buttons tragen den gleichen Namen, Du wirst im Skript nicht unterscheiden können, auf welchen geklickt wurde.
      Value-Angaben sind bei image-Buttons überflüssig.
      Du versuchst per Javascript, das Action-Attribut des Formulars zu setzen, dies ist überflüssig (falls es überhaupt geht - damit habe ich mich noch nie beschäftigt). Werte einfach aus, welcher Button angeklickt wurde. Nenne den einen einfach 'Vorschau' und den anderen 'Speichern' :-)

      </form>

      Freundliche Grüsse,

      Vinzenz

      1. Hallo Vinzenz,
        hallo Dieter,

        Danke für Eure Antworten.

        Habe vornämlich erst mal Deine Anregungen beherzigt, Vinzenz.

        Inhalt: Array ( [P_Name] => aaa [eMail] => [Homepage] => [P_Kommentar] => aaa [Vorschau_x] => 41 [Vorschau_y] => 2 )

        ... fehlt das src-Attribut.

        Diese Angabe habe ich absichtlich weggelassen, hätte es aber in meiner Anfrage vermerken sollen, dann hätte es keine Verwirrungen gegeben :o)

        Wenn ich nun nur die Pflichtfelder "Name" und "Kommentar" fülle, auf die Schaltfläche "Vorschau" klicke und mir den Inhalt der Variable $_POST ausgebe, dann bekomme ich folgende Bildschirmanzeige:

        Array ([P_Name]      => aaa
               [eMail]       =>
               [Homepage]    =>
               [P_Kommentar] => aaa
               [Vorschau_x]  => 41
               [Vorschau_y]  => 2)

        Dies bedeutet, dass der Klick richtig übergeben wurde.

        Nur: wenn ich nun mit echo (isset ($_POST ["Vorschau"])) den Wert ausgeben lassen will, den die Schaltfläche geliefert hat, dann bekomme ich keinen Wert :-(

        Was stimmt noch nicht ?

        Gruss, Markus