Steuerung mehrerer Formular-Selects

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Steuerung mehrerer Formular-Selects

    Hallo auch,

    ich schreibe gerade an einem Frontend für einen Fahrzeugteilekatalog und habe Probleme mit einem Formular, das 3 Select-Boxen enthält.

    PHP-Code:
    <form name="fahrzeug" action="<?=$action?>" method="post">
     <span class="font_medium">W&auml;hlen Sie hier bitte den Hersteller:</span><br />
    <select name="herstellerauswahl" size="1" OnChange="javascript:fahrzeug.submit();">
    <option value="all">- Noch keine Auswahl -</option>
    <?php
    $hersteller_result 
    mysql_query("SELECT HERSTELLER FROM cars 
    GROUP BY HERSTELLER"
    $db);
    while (
    $hersteller mysql_fetch_assoc($hersteller_result))
    {
    if (isset(
    $hersteller['HERSTELLER']))
    {
    echo 
    '<option value="' $hersteller['HERSTELLER'] . '"';
    }
    if (
    $herstellerauswahl == $hersteller['HERSTELLER'])
    {
    echo 
    ' selected="selected"';
    }  
    echo 
    '>' $hersteller['HERSTELLER'] . '</option>'chr(13);
    }
    ?>                
    </select>
     <hr />
    <span class="font_medium">W&auml;hlen Sie hier bitte das Modell:</span><br />
    <select name="modellauswahl" size="1" OnChange="javascript:fahrzeug.submit();">
    <option value="all">- Noch keine Auswahl -</option>
    <?php
    $modell_result 
    mysql_query("SELECT MODELL FROM cars 
    WHERE HERSTELLER LIKE '"
    .$herstellerauswahl."' GROUP BY MODELL ORDER BY MODELL"$db);
    while (
    $modell mysql_fetch_assoc($modell_result))
    {
    if (isset(
    $modell['MODELL']))
    {
    echo 
    '<option value="' $modell['MODELL'] . '"';
    }
    if (
    $modellauswahl == $modell['MODELL'])
    {
    echo 
    ' selected="selected"';
    }  
    echo 
    '>' $modell['MODELL'] . '</option>' chr(13);
    }
    ?>                
    </select>
    <hr />
    <span class="font_medium">W&auml;hlen Sie hier bitte die Bezeichnung:</span><br />
    <select name="bezeichnungauswahl" size="1" OnChange="javascript:fahrzeug.submit();">
    <option value="all">- Noch keine Auswahl-</option>
    <?php
    $bezeichnung_result 
    mysql_query("SELECT BEZEICHNUNG FROM cars 
    WHERE MODELL LIKE '"
    .$modellauswahl."' GROUP BY BEZEICHNUNG ORDER BY BEZEICHNUNG"$db);
    while (
    $bezeichnung mysql_fetch_assoc($bezeichnung_result))
    {
    if (isset(
    $bezeichnung['BEZEICHNUNG']))
    {
    echo 
    '<option value="' $bezeichnung['BEZEICHNUNG'] . '"';
    }
    if (
    $bezeichnungauswahl == $bezeichnung['BEZEICHNUNG'])
    {
    echo 
    ' selected="selected"';
    }  
    echo 
    '>' $bezeichnung['BEZEICHNUNG'] . '</option>';
    }
    ?>                
    </select>
    </form>
    Die Select-Boxen werden mit den Daten aus der DB gefüllt und enthalten (Hersteller, Modell und Bezeichnung).

    Bei einer Auswahl vom Hersteller wird die Select-Box des Modells gefüllt, bei der weiteren Auswahl des Modells wird die Select-Box der Bezeichnung gefüllt. Das funktioniert auch alles wunderbar.

    Ich möchte aber unterhalb des Formulars Tabellen mit Fahrzeuglisten aufbauen, die von unterschiedlicher Auswahl abhängen. Problem ist hierbei, daß bei einer NUR-Auswahl von Hersteller noch keine Fahrzeuglisten kommen sollen, sondern erst dann, wenn Hersteller und Modell ausgewählt sind. Ich habe das schon teilweise geschafft, nur sollte man nach der Auswahl des Modells erneut einen anderen Hersteller auswählen, kommt Durcheinander hinein. Die POST-Vars scheinen sich nicht richtig zu aktualisieren und somit wird scheinbar das Modell nicht wieder zurück auf "all" gesetzt. Erst bei einem nochmaligen Herstellerwechsel wird das Modell auf "all" gesetzt.

    Die Frage: Wie kann ich die Abfrage der Formularzustände realisieren, daß bei der Auswahl (und nur da und nur in Kombination) von Hersteller und Modell Aktionen verknüpfen kann.

    Ich wäre echt für einen Tip sehr dankbar !
    Zuletzt geändert von JoeT; 12.01.2005, 15:55.

  • #2
    http://www.php-resource.de/forum/sho...threadid=47906
    bitte lesen & umsetzen.
    I don't believe in rebirth. Actually, I never did in my whole lives.

    Kommentar


    • #3
      Ich habe den stylistischen Hinweis verstanden und die Code-Breite gekürzt.

      Über eine Lösung des Problems wäre ich allerdings wesentlich glücklicher ;-) !

      Kommentar


      • #4
        bevor du die 2. Liste zusammenbaust mußt du prüfen, ob einen Wert von 1. Liste selektiert ist, erst dann die Abfrage absetzen und die 2. Liste befüllen, sonst lasse die Liste leer. Mit der 3. List gehst du analog vor.

        Kommentar


        • #5
          Hm, das ist nicht das Problem,

          Die Abhängigkeiten zwischen den Selectionen entstehen automatisch. Ich kann abfragen ob Select1 oder Select2 gewählt ist, kein Problem, wenn ich jedoch erneut Select1 anwähle, dann bleibt Select2 nach wie vor mit den vorherigem Wert versehen und erst bei einer nochmaligen Anwahl von Select1 wird Select2 auf "all" zurückgesetzt. Daher ist es sehr schwierig die Zustände zu bestimmen. Es müsste so sein, dass bei einer erneuten Auswahl von Select1 auch Select2 automatisch zurückgesetzt wird (wenigstens von der Variablenseite). Dies hatte ich schon mal in den Submit von Select1 mit eingebaut, leider konnte man danach Select2 gar nicht mehr auswählen.

          Kommentar


          • #6
            wie wär's wenn du mit $_POST arbeitest anstatt dich auf register_globals = On verläßt

            Kommentar


            • #7
              So sieht der Kopf meiner Datei aus, es ist sogar die Eventualität einer Parameterübergabe per GET vorgesehen. Insofern verwende ich also $_POST. Das ist daher auch nicht der Problemlöser.
              PHP-Code:

                  
              if (isset($_POST['herstellerauswahl']))
                  {
                      
              $hersteller $_POST['herstellerauswahl'];
                  }
                  if (isset(
              $_GET['herstellerauswahl']))
                  {
                      
              $hersteller $_GET['herstellerauswahl'];
                  }
                  if (isset(
              $_POST['modellauswahl']))
                  {
                      
              $modell $_POST['modellauswahl'];
                  }        
                  if (isset(
              $_GET['modellauswahl']))
                  {
                      
              $modell $_GET['modellauswahl'];
                  }
                  if (isset(
              $_POST['bezeichnungauswahl']))
                  {
                      
              $bezeichnung $_POST['bezeichnungauswahl'];
                  }
                  if (isset(
              $_GET['bezeichnungauswahl']))
                  {
                      
              $bezeichnung $_GET['bezeichnungauswahl'];
                  } 

              Kommentar


              • #8
                Original geschrieben von JoeT
                es ist sogar die Eventualität einer Parameterübergabe per GET vorgesehen.
                wozu? die methode gibst du doch im form explizit vor.

                und selbst wenn du beide möglichkeiten berücksichtigen willst: es gibt auch sowas wie $_REQUEST, diese doppel-abfragen sind überflüssig.


                zum problem:

                schön, nach deinem dateikopf hast du jetzt also eventuelle parameter in $hersteller und $modell stehen.

                denkst du dann, dass es wirklich clever ist, die werte in diesen variablen bei deinen mysql-abfragen mittels
                PHP-Code:
                while ($hersteller mysql_fetch_assoc($hersteller_result))
                ...
                while(
                $modell = ...) 
                wieder zu überschreiben ...?
                I don't believe in rebirth. Actually, I never did in my whole lives.

                Kommentar


                • #9
                  ... außerdem auf empty() anstatt isset() prüfen wäre auch sinnvoller

                  P.S. wozu denn sowas wie $hersteller = $_POST... ?

                  Kommentar


                  • #10
                    Sorry, aber irgendwie habe ich ein Verständnisproblem...

                    Vergesst mal das ganze Drumherum, nehmt einfach an, es gibt 1 Formular (fahrzeugdaten) mit 3 Selects (Hersteller, Modell, Bezeichnung). Alle Selects sollen standardmässig nicht ausgewählt sein, das Select für den Hersteller soll allerdings schon alle Inhalte des Datenbankfeldes "Hersteller" zur möglichen Auswahl bereit halten.

                    Bei Auswahl einer Option des 1. Selects "Hersteller" sollen sich die Optionen des 2. Selects für das Modell bezugnehmend auf der ausgewählten Herstelleroption aus dem Datenbankfeld "Modell" aufbauen. Bei Auswahl des Modells mit automatischen submitten des Forms wird mit dem 3. Select für die Bezeichnung gleichermassen verfahren.

                    Nehmen wir mal an, ich wähle einen Hersteller aus und submitte damit das Form, nun bekomme ich über $_POST den Inhalt des Herstellers z.B. Audi.
                    Bei einer Modellauswahl steht dam in $_POST dann schon z.B. Audi und 100. Jetzt soll gezielt bei dieser Aktion eine Fahrzeugliste aufgebaut werden.

                    ... So bis hier hin kein Problem.

                    Geht man jetzt aber wieder zurück auf den 1. Selector, also man wählt erneut einen Hersteller aus, steht im $_POST aber immer noch Audi und 100. Die Modellvariable wird nochmal geschickt.

                    Wählt man nun nochmals einen anderen Hersteller aus, steht in der $_POST tatsächlich nur noch der Hersteller.

                    Hiermit kann ich einfach nicht eingrenzen, wann eine Aktion angestossen werden soll, die voraussetzt, dass Selector 1 und 2 Hersteller und Modell gleichzeitig und Datenbankrichtig ausgewählt sind.

                    Wenn möglich schreibt mir eine Antwort mit kleinen Code-Samples, damit ich es leichter nachvollziehen kann.

                    Gruß und Dank

                    Kommentar


                    • #11
                      hmm

                      ich zeige Hersteller an wähle was aus über das Javascript Objekt selectedindex schicke ich ne Url an den Server hole mir die Modelle und danach einen Schritt weiter hole ich mir die Bezeichnungen etc.

                      So in der Art?
                      [color=blue]MfG Payne_of_Death[/color]

                      [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                      [color=red]Merke:[/color]
                      [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                      Murphy`s Importanst LAWS
                      Jede Lösung bringt nur neue Probleme
                      Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                      In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                      Kommentar


                      • #12
                        So ungefähr...

                        Der selectedindex liefert nur bei meinem Konstrukt seltsame Werte.

                        Die Selectfelder stehen ja alle in "einem" form. Wenn man den selectindex ausgibt funktioniert er auch solange man z.B. nur das Hersteller-Select bedient, wechselt man zum Modell und dann wieder zurück zum Hersteller beginnt der selectedindex bei einer höheren Zahl, stimmt also nicht mehr.

                        Es geht auch weniger darum, mittel selectedindex die ausgewählte Option im jeweiligen Selektor auszulesen, die wird ja eigentlich auch richtig über die $_POST z.B. aus dem <select name="hersteller"... beim autosubmitten erzeugt.

                        Das beste wäre es zu wissen, welches Selectfeld insgesamt denn nun wirklich gerade als letztes gewählt wurde. Danach könnte man dann steuern wann eine Aktion, z.B. der Aufbau einer Fahrzeugtabelle geschehen soll. Diese soll sich ja NICHT aufbauen, wenn NUR der Hersteller ausgewählt ist, aber dann wenn Hersteller UND Modell ausgewählt sind. Bei einer Neuauswahl eines Herstellers soll sie ebenfalls NICHT mehr angezeigt werden und da fingen die Probleme ja an.

                        Die $_POST-Variable resettet sich scheinbar nur schrittweise, daher benötigt der übermittelte "select name" des Forms bei einer Neuwahl eines vorhergehenden Selectors bis zu 3 Schritte, bis sich die Variablen rekursiv wieder auf die Startwerte setzen. (Hat man z.B. den letzten Selector "Bezeichnung" ausgewählt und wählt dann wieder einen neuen Hersteller, werden unmittelbar bei dieser neuen Auswahl dessen Variable aber auch die Variablen für Modell und Bezeichnung gepostet. Wählt man dann erneut etwas im ersten Selektor wird neben dem Hersteller auch noch Modell oder Bezeichnung ausgegeben, erst bei der 3. Auswahl des Herstellers ist das $_POST bis auf den Hersteller leer.)

                        Nicht zu vergessen ist, daß die Optionen durch die Datenrelationen voneinander abhängig bleiben. Danach kann man auch nicht mal mit den Variablen aus dem $_POST die Datenbank abfragen, da nach einer Neuwahl z.B. eines Herstellers immer noch das Modell des vorherigen Herstellers übermittelt wird.

                        Das ist wohl eine harte Nuß !!!
                        Zuletzt geändert von JoeT; 14.01.2005, 08:52.

                        Kommentar


                        • #13
                          Ich weiß ja nicht, ob es hilft, aber man könnte bei der neuen Auswahl eines Herstellers vor dem submit() noch mit javascript den all Eintrag vom Modell auswählen.
                          Code:
                          onchange="javascript:document.fahrzeug.modellauswahl.selectedIndex=0;fahrzeug.submit();">
                          Wer einen Weisen dumm fragt, wird eine kluge Antwort bekommen. Es ist nur die Frage, ob er sie auch versteht.

                          Kommentar


                          • #14
                            Wenn man die Formularfelder ohne ein erneutes Laden der Seite realisieren will, kann man das meiner Meinung nach am besten mit Javasript. Dies hat den Vorteil, das bei FormularWert-Wechsel des "Eltern"-Selectfeldes nicht die ganze Seite neu geladen werden muss, da ja alles bereits auf Clientseite existier.
                            PHP arbeitet ja serverseitig und erfordert damit erneutes Senden der Parameter, Befehle etc.

                            So würde ich es machen:
                            Alle Werte der Felder bereits am anfang in einem Javascript vorladen und dort mit entsprechenden Event-Handlern die abhängigen Formularinhalte austauschen, da man bekanntlich (oder auch nicht ) fast alle Eigenschaften, inclusive Inhalten (value) etc. per Javascript ändern kann.

                            Kommentar


                            • #15
                              ohne javascript kommst du hier nicht weit.

                              entweder (wie guido beschrieben hat) komplett mit js arbeiten. dazu hats hier ein tutorial und ein paar codeschnipsel

                              oder

                              per js+php => onchange() resettet alle nachfolgenden select-felder ... also
                              - hersteller resettet modelle + details
                              - modelle resettet details
                              jeweils per javascript
                              Kissolino.com

                              Kommentar

                              Lädt...
                              X