Vincent Vega: Mehrere Formulare auslösen

Hallo zusammen.
Meine Frage ist eher allgemeiner Natur, mir fehlt einfach eine zündende Idee um meine Software zu verbessern...

Ich habe für einen bekannten eine Webapplikation zur Verwaltung seiner Kundendaten programmiert. Hauptsächlich verwende ich dabei HTML und PHP für die Datenbankverbindung. Im Hintergrund läuft ein MySQL Server mit mehreren Datenbanken.

Aufgebaut habe ich die Appliklation mit Hilfe mehrerer Formulare.
Ausgangpunkt ist immer die Datei db_start.php, mit einer Maske um den kompletten aktuellen Datensatz anzuzeigen und zu bearbeiten. Ein Datensatz ist dabei auf mehrere Tabellen verteilt, die alle ausgelesen, angezeigt und editiert werden können.

Das erste Formular ist ein Menü um den Datensatz zu wechseln, welches wieder auf die db_start.php zielt.

Das zeite Formular enthält die Daten und zielt auf die Datei db_save.php. Wird es ausgelöst werden alle aktuell eingegeben Daten gespeichert und dann folgt ein redirect zurück zur db_start.php mit dem aktualisierten Datensatz.

Innerhalb dieses Formulars gibt es zwei weitere Links zu den Dateien db_add.php und db_del.php um Datensätze von Nebentabellen zu löschen oder hinzuzufügen.

Das ganze funktioniert wunderbar. Das Problem ist nur, dass mein Bekannter sehr lernresistent ist was neue Software angeht. Er ist eine Access Datenbank gewöhnt bei der es keinen Speichern-button gab. Nun passiert es regelmäsig dass er einen Datensatz editiert und dann vergisst zu speichern. Statt dessen wechselt er den Datensatz oder gibt etwas in die Suchmaske ein oder sonst irgendwas...
Das Formular db_save.php wird nicht ausgelöst, statt dessen eines der anderen Formulare oder einer der Links und die Änderungen werden verworfen.

Wie bekomme ich es hin, dass egal was er macht in jedem Fall das Formular db_save.php ausgelöst wird??? Gibt es irgendeine Möglichkeit mit einem Submit button zwei Formulare auszulösen? Oder irgendeine andere Technik an die ich nicht gedacht habe?

Zum Verständnis, hier nochmal ein bisschen Code aus der db_start.php:

  
<form action="db_start.php" method="post">  
 [code lang=php]  
 <?php  
 $main_ID = $_REQUEST['id'];  
 $result = mysql_query("SELECT * FROM $db_main");  
 $num_rows = mysql_num_rows($result);  
 $main_ID = ($main_ID < 1) ? 1 : $main_ID;  
 $main_ID = ($main_ID > $num_rows) ? $num_rows+1 : $main_ID;  
 $ID_first = 1;  
 $ID_back = $main_ID - 1 ;  
 $ID_fwd = $main_ID + 1 ;  
 $ID_last = $num_rows;  
  
 # <!-- Menu -->  
 echo "<a href='db_start.php?db=$db_name&prefix=$db_pref&id=". $ID_first ."'><img src='../pics/arrow_first.png' /></a>";  
 echo "<a href='db_start.php?db=$db_name&prefix=$db_pref&id=". $ID_back ."'><img src='../pics/arrow_back.png' /></a>";  
 echo "<a href='db_start.php?db=$db_name&prefix=$db_pref&id=". $ID_fwd ."'><img src='../pics/arrow_fwd.png' /></a>";  
 echo "<a href='db_start.php?db=$db_name&prefix=$db_pref&id=". $ID_last ."'><img src='../pics/arrow_last.png' /></a>";  
  
 echo "<input type='text' size ='3' name='id' id='id' value='$main_ID' />";  
 ?>  
 

<input type="submit" name="refresh" value="Aktualisieren" />
</form>

<form action="db_search.php" method="post">
 <!-- Eingabefeld für Suche -->
 <td class='nav_td'><input type="submit" name="search" value="Suchen" /></td>
</form>

<form action="db_save.php" method="post">
 <input class="button_big" type="submit" name="save" value="Speichern !!!" />

<!-- Eingabemaske mit aktuellem Datensatz -->
 ~~~php

<?php
 echo "<a href='db_add.php?db=$db_name&prefix=$db_pref&main_ID=$main_ID&table=ap'><img src='../pics/button_add.png' /></a>";
 echo "<a href='db_del.php?db=$db_name&prefix=$db_pref&main_ID=$main_ID&ap_id=$row_ap[0]'><img src='../pics/button_del.png' /></a>";

echo "<input type='hidden' name='db' value='". $db_name ."'/>";
 echo "<input type='hidden' name='prefix' value='". $db_pref ."'/>";
 echo "<input type='hidden' name='main_ID' value='". $main_ID ."'/>";
 echo "<input type='hidden' name='count_gs' value='". $count_gs ."'/>";
 echo "<input type='hidden' name='count_ap' value='". $count_ap ."'/>";
 ?>

 <input class="button\_big" type="submit" name="save" value="Speichern !!!" />  
</form>  
  
[/code]  
  
  
  

  1. @@Vincent Vega:

    nuqneH

    Oder irgendeine andere Technik an die ich nicht gedacht habe?

    JavaScript. Bei jeder http://de.selfhtml.org/javascript/sprache/eventhandler.htm#onchange@title=Änderung des Werts eines Eingabefeldes das betreffende Formular http://de.selfhtml.org/javascript/objekte/forms.htm#submit@title=abschicken.

    Qapla'

    --
    Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
    (Mark Twain)
    1. JavaScript. Bei jeder http://de.selfhtml.org/javascript/sprache/eventhandler.htm#onchange@title=Änderung des Werts eines Eingabefeldes das betreffende Formular http://de.selfhtml.org/javascript/objekte/forms.htm#submit@title=abschicken.

      Danke, die Idee klingt auch interessant. Ich glaube aber, dass das die Performance zu sehr beeinträchtigt. Ein "Datensatz" setzt sich aus 3 großen Tabellen und bis zu 10 echten Datensätzen zusammen. In der Praxis gibt es so bis zu 50 Input Felder. Stell dir den Aufwand vor wenn ein neuer Datensatz angelegt wird. Nach jeder Eingabe wird das Formular abgeschickt und die Seite neu geladen...

      Grüße,
      Vince

      1. Moin!

        Nach jeder Eingabe wird das Formular abgeschickt und die Seite neu geladen...

        Lese mal unter Ajax oder HTTPRequest

        Damit kann man den Inhalt asgewählter Formularfelder senden und den Inhalt ausgewählter HTML-Elemente manipulieren.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

        1. Lese mal unter Ajax oder HTTPRequest

          Damit kann man den Inhalt asgewählter Formularfelder senden und den Inhalt ausgewählter HTML-Elemente manipulieren.

          Hmm, mit Ajax hab ich schon gearbeitet. Auch keine schlechte Idee. Ich stells mir zwar nicht ganz einfach vor, aber wenn das umsetzbar ist, wäre das wahrscheinlich sogar die Optimallösung ^^

          Vielleicht probier ichs morgen mal aus :)

          Thx!

          1. Inzwischen habe ich es geschafft einen onclick-handler einzubauen, der den submit button auslöst. Funktioniert soweit. Die Performance ist auch in Ordnung, jedenfalls auf meinem Rechner mit lokaler Datenbank...

            Das Feld für die Benutzereingabe sieht jetzt so aus:

            echo "<textarea onchange='save_ajax()' cols='70' rows='2' class='txt_big' name='main_name' id='main_name'>$row_main[0]</textarea>";

            Und das dazu gehörige Script:

            <script type="text/javascript">  
            function save_ajax () {  
            	document.db_save.submit();  
            }  
            </script>
            

            Natürlich würde ich das ganze jetzt gerne als AJAX-Request zum laufen bringen, damit ich keine Wartezeit mehr habe und die Seite nicht neu geladen wird.
            Ich versteh aber noch nicht ganz wie das funktionieren soll, vielleicht kann mir da jemand weiter helfen. Momentan stecke ich irgendwie fest. Ich habe die Funktion save_ajax entsprechend geändert mit dem Ergebnis dass garnichtsmehr passiert.

            <script type="text/javascript">  
            function save_ajax () {  
            	AJAX_object = new XMLHttpRequest();  
            	AJAX_object.open("POST","db_save.php",true);  
            	AJAX_object.send();  
            }  
            </script>
            

            Wäre auch zu schön gewesen wenn das funktioniert hätte... Muss ich der send-Funktion als Parameter noch etwas mitgeben?

            Viele Grüße,

            Vince

            1. Ok, ich glaub ichs habs schon kapiert. Ich muss natürlich den Inhalt aller Eingabefelder der send-Funktion übergeben.

              Jippie, das wird ein Spaß... ;)

              Ich bin allerdings nicht so fit was Javascript angeht. Momentan sieht meine Funktion so aus. Irgendwie klappts aber nicht. Ich weiß nicht genau wie ich den Inhalt eines Eingabefeldes auslese und in die Varible "params" packe:

              <script type="text/javascript">  
              function save_ajax () {  
              	AJAX_object = new XMLHttpRequest();  
              	AJAX_object.open("POST","db_save.php",true);  
              	  
              	var value_main_name = document.getElementById("main_name");  
              	var params = "main_name=value_main_name";  
              	  
              	AJAX_object.setRequestHeader("Content-type", "application/x-www-form-urlencoded");  
              	AJAX_object.setRequestHeader("Content-length", params.length);  
              	AJAX_object.setRequestHeader("Connection", "close");  
                
              	AJAX_object.send(params);  
              }  
              </script>
              
              1. Moin!

                Ich bin allerdings nicht so fit was Javascript angeht. Momentan sieht meine Funktion so aus. Irgendwie klappts aber nicht. Ich weiß nicht genau wie ich den Inhalt eines Eingabefeldes auslese und in die Varible "params" packe:

                Sieh Dir einfach an, was geschieht, wenn Du das Formular mit der Methode get sendest. Du musst das, was sonst der Browser für dich erledigt dann auch machen:

                  
                 	params = "Vorname="+document.forms[0].elements['Vorname'].value;  
                        params = params +"&Nachname="+document.getElementById['Nachname'].value;  
                
                

                Musste das nicht noch codiert werden? Bei der Methode "get" könnte das so aussehen:

                  
                var params="Vorname="+escape(document.getElementById['Vorname'].value);  
                data=params+'Nachname="+escape(document.getElementById['Nachname'].value);'  
                AJAX_object.open("GET","db_save.php?"+data ,true);  
                
                

                Jippie, das wird ein Spaß... ;)

                Niemand hat gesagt das es einfach ist: mehrere Programmiersprachen, das HTTP-Protokoll, Kodierungen, Kontextwechsel ...

                MFFG (Mit freundlich- friedfertigem Grinsen)

                fastix

                1. Niemand hat gesagt das es einfach ist: mehrere Programmiersprachen, das HTTP-Protokoll, Kodierungen, Kontextwechsel ...

                  Ehrlich gesagt ist es weitaus einfacher und effektiver als ich gedacht habe ;)

                  Mit dieser Methode kann ich die Speicherfunktion von MS Access 1:1 nachprogrammieren. Perfekt!

                  Mit Jscript tu ich mir halt noch ein bisschen schwer. Ich habe zb hinter dem Objekt das ".value" vergessen und hätte wahrscheinlich lange gebraucht um darauf zu kommen ohne deinen Tipp.

                  Vielen Dank euch allen für die professionelle Hilfe!!!
                  Ich mach mich jetzt dran den Rest umzusetzen und bin zuversichtlich das es gut wird :)

                  Grüße,

                  Vince

  2. Mahlzeit Vincent Vega,

    Das Problem ist nur, dass mein Bekannter sehr lernresistent ist was neue Software angeht.

    Setze hier an - bei der Ursache des Problems. Es ist wenig sinnvoll, einen Riesenaufwand zu produzieren (falls es überhaupt möglich ist), nur um die Befindlichkeiten eines einzelnen Benutzers zu berücksichtigen.

    Es gibt keine technischen Lösungen für soziale Probleme.

    Er ist eine Access Datenbank gewöhnt bei der es keinen Speichern-button gab. Nun passiert es regelmäsig dass er einen Datensatz editiert und dann vergisst zu speichern. Statt dessen wechselt er den Datensatz oder gibt etwas in die Suchmaske ein oder sonst irgendwas...

    Dann baue in jedes (andere) Formular und jeden Button und jeden Link eine Javascript-Überprüfung ein, ob im Änderungsformular Daten geändert und diese noch nicht gespeichert wurden - und nerve den Anwender mit entsprechenden Hinweismeldungen ... damit er *lernt*, seine Daten zu speichern, wenn er sie speichern will.

    Das Formular db_save.php wird nicht ausgelöst, statt dessen eines der anderen Formulare oder einer der Links und die Änderungen werden verworfen.

    Natürlich. Jedes Formular kann nur ein Formularziel haben.

    Wie bekomme ich es hin, dass egal was er macht in jedem Fall das Formular db_save.php ausgelöst wird???

    Nimm nur ein Formular - und gib diesem einfach mehrere Submit-Buttons. Je nachdem welcher gewählt wurde, kann das Server-seitige Skript, dass sich als Formularziel hinter diesem einen Formular verbirgt, dann verschiedene Aktionen ausführen bzw. auf unterschiedliche Ziele weiterleiten.

    Gibt es irgendeine Möglichkeit mit einem Submit button zwei Formulare auszulösen?

    Theoretisch könntest Du z.B. beim Klick auf einen Button oder beim Abschicken eines Formulars per Javascript ein anderes Formular abschicken. Davon würde ich Dir aber abraten.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:& n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. Hey EKKi,

      vielen Dank erstmal. Das hilft mir schonmal sehr viel weiter. Es ist zwar nicht die ultimative Lösung dabei, aber ich habe auch nicht damit gerechnet dass eine solche existiert ;)

      Setze hier an - bei der Ursache des Problems. Es ist wenig sinnvoll, einen Riesenaufwand zu produzieren (falls es überhaupt möglich ist), nur um die Befindlichkeiten eines einzelnen Benutzers zu berücksichtigen.

      Es gibt keine technischen Lösungen für soziale Probleme.

      Natürlich hast du recht. Allerdings habe ich diese Software nur für diesen einen Benutzer entwickelt und ich werde auch ganz gut dafür bezahlt. Gut, wenn man den zeitlichen Aufwand berücksichtigt nicht, aber ich bin ja noch jung ;)
      Jedenfalls kann er natürlich schon verlangen, dass die Software seinen persönlichen Bedürfnissen entspricht solange es im Rahmen des Möglichen ist.

      Dann baue in jedes (andere) Formular und jeden Button und jeden Link eine Javascript-Überprüfung ein, ob im Änderungsformular Daten geändert und diese noch nicht gespeichert wurden - und nerve den Anwender mit entsprechenden Hinweismeldungen ... damit er *lernt*, seine Daten zu speichern, wenn er sie speichern will.

      Super! Die Idee gefällt mir sehr gut!
      Ein paar Javascript Alerts mit denen er die Aktion abbrechen kann falls Daten nicht gespeichert wurden, würden das Problem beseitigen. Und so lernt er auch irgendwann den Speicherbutton zu bedienen ;)
      Der Aufwand wäre auch überschaubar...

      Nimm nur ein Formular - und gib diesem einfach mehrere Submit-Buttons. Je nachdem welcher gewählt wurde, kann das Server-seitige Skript, dass sich als Formularziel hinter diesem einen Formular verbirgt, dann verschiedene Aktionen ausführen bzw. auf unterschiedliche Ziele weiterleiten.

      Natürlich wäre es möglich nur ein Formular zu verwenden aber mir gefällt die ganze Aufteilung eigentlich gut so wie sie ist. Ich hab mir ja was dabei gedacht die einzelnen Funktionen in verschiedene Dateien zu verpacken. Diese Aufteilung jetzt wieder rückgängig zu machen würde mich nicht besonders glücklich machen. Und der Aufwand wäre riesig!

      Theoretisch könntest Du z.B. beim Klick auf einen Button oder beim Abschicken eines Formulars per Javascript ein anderes Formular abschicken. Davon würde ich Dir aber abraten.

      Wie du schon sagst, das wäre kein guter Programmierstil.
      Irgendwann will ich die Software vielleicht doch nochmal weiter verkaufen. Sonst rechnet sich der ganz Aufwand ja nie...

      Vielen Dank auf jeden Fall! Hast mir sehr geholfen. Ich denk noch mal drüber nach aber ich glaube ich werde das mit den Alters erstmal so umsetzen.

      Grüße,

      Vince

  3. hi,

    Das ganze funktioniert wunderbar. Das Problem ist nur, dass mein Bekannter sehr lernresistent ist was neue Software angeht. Er ist eine Access Datenbank gewöhnt bei der es keinen Speichern-button gab. Nun passiert es regelmäsig dass er einen Datensatz editiert und dann vergisst zu speichern.

    Was vergisst er denn? Wenn er das Submit vergisst kannst Du gar nichts machen. Wenn er jedoch das Formular submittet und es wird nichts gespeichert, hast Du in Deiner Anwendung was falsch genmacht.

    Hotti

    1. Was vergisst er denn? Wenn er das Submit vergisst kannst Du gar nichts machen. Wenn er jedoch das Formular submittet und es wird nichts gespeichert, hast Du in Deiner Anwendung was falsch genmacht.

      Er vergisst den Submit Button ;)

  4. mir fehlt einfach eine zündende Idee um meine Software zu verbessern...

    Ich finde es verbessert dein System nicht unbedingt, wenn man etwas eingibt und das dann unaufgefordert und ohne viel dagegen tun zu können gespeichert wird.
    Wenn das System für eine einzige lernresistente Person ist, dann machs natürlich so wie diese Person es will. Dieses spezielle kannst du aber nicht mehr allgemein vertreiben. Wer will schon was nutzen das "für Doofies" aussieht?
    Wenn ein PC-kundiger Mensch sich in einer Software nicht mehr zurechtfindet, wird diese Software es schwer haben für die Allgemeinheit interessant zu sein.

    Ich hab auch schon von so mancher Idee gehört der Art "da könnte man doch gleich noch ... automatisch machen", aber damit rechnet später keiner mehr. Rate mal wer dann das Geschrei hat, wenn in deinem Fall was versehentlich überschrieben wurde.
    Gerade Personen ohne viel Bereitschaft zu lernen gehen davon aus, dass der PC schon wissen wird was sie gerade wollen. Man kann natürlich versuchen, ihnen den PC so hinzurichten. Es wird aber vielleicht beim Versuch bleiben.

    1. @@Encoder:

      nuqneH

      Ich finde es verbessert dein System nicht unbedingt, wenn man etwas eingibt und das dann unaufgefordert und ohne viel dagegen tun zu können gespeichert wird.

      Gewöhnungssache. Wenn man auf dem Mac Einstellungen ändert, sind die Änderungen sofort wirksam, ohne dass man sie noch bestätigen müsste.

      Qapla'

      --
      Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
      (Mark Twain)
    2. Ich finde es verbessert dein System nicht unbedingt, wenn man etwas eingibt und das dann unaufgefordert und ohne viel dagegen tun zu können gespeichert wird.

      Ich finde es auch besser so wie es ist. Ich hab das schon absichtlich so gemacht und ich finde es gut so. Leider habe ich keine andere Wahl als mir irgendeine Lösung einfallen zu lassen. Ich wurde für die Entwicklung dieser Software bezahlt und der Anwender ist kurz davor wieder auf seine (mit Office 95 erstellte) Access-Datenbank umzusteigen. Die Probleme die dann mit Office 2010 auftreten werden bleiben dann wieder an mir hängen.

      Für den Fall, dass etwas dann ungewollt überschrieben wird, kann ich ja einen Cronjob anlegen, der mir regelmäßig einen kompletten SQL-dump irgendwo ablegt.

      Es ist eine schwierige Situation. Ich habe das Projekt begonnen und will es unbedingt so hin bekommen, dass er damit arbeiten kann. D.h. Ich muss meinen Kunden immer wieder beruhigen und versuchen ihn für die Komplexität einer Softwareentwicklung zu sensibilisieren. Wäre dieser Mensch kein sehr guter Freund von mir, würde ich mir das wohl nicht antun ;)

      Wenn ich das so einbaue wäre es ja aber kein großer Aufwand, das ganze später optional zu machen. Falls ich die Software mal weiter verkaufen will, muss ich sowieso eine Administrationsoberfläche basteln. Momentan gibt es nur eine config.cfg...