DropDown

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

  • DropDown

    Habe folgendes Script erfolgreich an meine Seite angepasst. Funktioniert auch einwandfrei, allerdings hat es einen kleinen Schönheitsfehler. Nach Auswahl eines Staates aus dem ersten DropDown-Feld erscheinen zwar die entsprechend dazugehörenden Städte des ausgewählten Staates im zweiten DropDown-Feld, jedoch erstellt das Script jede Menge leere "Felder". Das zweite DropDown-Feld ist also extrem lang, obwohl es nur wenige richtige Datensätze enthält.

    Vielleicht kann mir jemand sagen wie ich das Problem löse.

    Hier das Script:

    example.php
    PHP-Code:
    <?php 
    /* 
    ** get chainedSelectors class 
    */ 
    require("chainedSelectors.php"); 

    /* 
    ** connect to MySQL database 
    */ 
    $DatabaseLink mysql_connect("localhost""root"""); 
    if(!
    $DatabaseLink
    {         print(
    "Unable to connect to database!<br>\n"); 
     exit(); 


    //select test database 
    if(!(mysql_select_db("dropdown"$DatabaseLink))) 
    {         print(
    "Unable to use the test database!<br>\n"); 
     exit(); 



    /* 
    ** create input data 
    */ 

    //prepare names 
    $selectorNames = array( 
     
    CS_FORM=>"pickAreaCode",  
     
    CS_FIRST_SELECTOR=>"state",  
     
    CS_SECOND_SELECTOR=>"areacode"); 

    //query database, assemble data for selectors 
    $Query "SELECT s.ID, s.Name, a.Code " 
     
    "FROM areacode a, state s " 
     
    "WHERE a.State = s.ID " 
     
    "ORDER BY s.Name, a.Code"
    if(!(
    $DatabaseResult mysql_query($Query$DatabaseLink))) 
    {         print(
    "The query failed!<br>\n"); 
     exit(); 


    while(
    $row mysql_fetch_object($DatabaseResult)) 
    {         
    $selectorData[] = array( 
         
    CS_SOURCE_ID=>$row->ID,  
         
    CS_SOURCE_LABEL=>$row->Name,  
         
    CS_TARGET_ID=>$row->Code,  
         
    CS_TARGET_LABEL=>$row->Code); 
    }             

    //instantiate class 
    $areacode = new chainedSelectors
     
    $selectorNames,  
     
    $selectorData); 
    ?> 
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    "http://www.w3.org/TR/html40/loose.dtd"> 
    <html> <head> 
    <title>Dynamic Selector</title> 
    <script type="text/javascript" language="JavaScript"> 
    <?php 
    $areacode
    ->printUpdateFunction(); 
    ?> </script> </head> <body> 
    <form name="pickAreaCode" action="testChainedSelectors.php"> 
    <?php 
    $areacode
    ->printSelectors(); 
    ?> <input type="submit"> </form> 
    <script type="text/javascript" language="JavaScript"> 
    <?php 
    $areacode
    ->initialize(); 
    ?> 
    </script> </body> </html>
    chainedSelectors.php:
    PHP-Code:
    <?php 
    /* 
    ** Class: chainedSelectors 
    ** Description: This class allows you to create 
    * two selectors.  Selections 
    ** made in the first selector cause the second 
    * selector to be updated. 
    ** PHP is used to dynamically create the necessary JavaScript. 
    */ 

    //These constants make the code a bit more readable.  
    //They should be 
    //used in in the creation of the input data arrays, too. 
    define("CS_FORM"0); 
    define("CS_FIRST_SELECTOR"1); 
    define("CS_SECOND_SELECTOR"2); 

    define("CS_SOURCE_ID"0); 
    define("CS_SOURCE_LABEL"1); 
    define("CS_TARGET_ID"2); 
    define("CS_TARGET_LABEL"3); 

    class 
    chainedSelectors 
    {         /* 
     ** Properties 
     */ 
      
     //Array of names for the form and the two selectors. 
     //Should take the form of array("myForm", "Selector1", 
     //"Selector2") 
     
    var $names
      
     
    //Array of data used to fill the two selectors 
     
    var $data
      
     
    //Unique set of choices for the first selector, generated on init 
     
    var $uniqueChoices
      
     
    //Calculated counts 
     
    var $maxTargetChoices
     var 
    $longestTargetChoice


     
    /* 
     ** Methods 
     */ 
      
     //constructor 
     
    function chainedSelectors($names$data
     {             
    /* 
       **copy parameters into properties 
       */ 
       
    $this->names $names
       
    $this->data $data

       
    /* 
       ** traverse data, create uniqueChoices, get limits 
       */         
       
    foreach($data as $row
       {   
    //create list of unique choices for first selector 
           
    $this->uniqueChoices[($row[CS_SOURCE_ID])] = 
           
    $row[CS_SOURCE_LABEL];     

           
    //find the maximum choices for target selector 
           //$maxPerChoice[($row[CS_SOURCE_ID])]++; 
            
    if (!isset($maxPerChoice[$row[CS_SOURCE_ID]])) 
            
    $maxPerChoice[$row[CS_SOURCE_ID]] = 0;
            
    $maxPerChoice[($row[CS_SOURCE_ID])]++;
              
             
    //find longest value for target selector 
             
    if(strlen($row[CS_TARGET_LABEL]) > 
             
    $this->longestTargetChoice
             {   
    $this->longestTargetChoice=
             
    strlen($row[CS_TARGET_LABEL]); 
             } 
         } 
          
         
    $this->maxTargetChoices max($maxPerChoice); 
     } 

     
    //prints the JavaScript function to update second selector 
     
    function printUpdateFunction() 
     {             
    /* 
         ** Create some variables to make the code 
         ** more readable. 
         */ 
         
    $sourceSelector "document." 
         
    $this->names[CS_FORM] . "." .  
             
    $this->names[CS_FIRST_SELECTOR]; 
         
    $targetSelector "document." 
         
    $this->names[CS_FORM] . "." .  
             
    $this->names[CS_SECOND_SELECTOR]; 
      
         
    /* 
         ** Start the function 
         */ 
         
    print("function update" .
         
    $this->names[CS_SECOND_SELECTOR] . "()\n"); 

         print(
    "{\n"); 

         
    /* 
         ** Add code to clear out next selector 
         */ 
         
    print("\t//clear " 
         
    $this->names[CS_SECOND_SELECTOR] . "\n"); 
         print(
    "\tfor(index=0; index < 
         
    $this->maxTargetChoices; index++)\n"); 
         print(
    "\t{\n"); 
         print(
    "\t\t" $targetSelector "
         .options[index].text = '';\n"
    ); 

         print(
    "\t\t" $targetSelector "
         .options[index].value = '';\n"
    ); 
         print(
    "\t}\n\n"); 
         print(
    "\t" $targetSelector "
         .options[0].selected = true;\n\n"
    ); 

         
    /* 
         ** Add code to find which was selected 
         */ 
         
    print("whichSelected = " .
          
    $sourceSelector ".selectedIndex;\n"); 

         
    /* 
         ** Add giant "if" tree that puts values into target selector 
         ** based on which selection was made in source selector 
         */ 

         //loop over each value of this selector 
         
    foreach($this->uniqueChoices as 
         
    $sourceValue=>$sourceLabel
         {  print(
    "\tif(" $sourceSelector 
                 
    ".options[whichSelected].value == " 
                 
    "'$sourceValue')\n"); 
             print(
    "\t{\n"); 

             
    $count=0
             foreach(
    $this->data as $row
             {  if(
    $row[0] == $sourceValue
                 {  
                 
    $optionValue $row[CS_TARGET_ID]; 
                 
    $optionLabel $row[CS_TARGET_LABEL]; 

                 print(
    "\t\t" $targetSelector 
                     
    ".options[$count].value = '$optionValue';\n"); 
                 print(
    "\t\t" $targetSelector 
                     
    ".options[$count].text = '$optionLabel';\n\n"); 

                 
    $count++; 
                 } 
             } 

             print(
    "\t}\n\n"); 
         } 

         print(
    "\treturn true;\n"); 
         print(
    "}\n\n"); 

     } 

     
    //print the two selectors 
     
    function printSelectors() 
     {             
    /* 
         **create prefilled first selector 

         */ 
         
    $selected=TRUE
         print(
    "<select name=\"" 
         
    $this->names[CS_FIRST_SELECTOR] . "\" " 
             
    "onChange=\"update".
             
    $this->names[CS_SECOND_SELECTOR]."();\">\n"); 
         foreach(
    $this->uniqueChoices as $key=>$value
         {   print(
    "\t<option value=\"$key\""); 
             if(
    $selected
             {   print(
    " selected=\"selected\""); 
                 
    $selected=FALSE
             } 
             print(
    ">$value</option>\n"); 
         } 
         print(
    "</select>\n"); 

         
    /* 
         **create empty target selector 
         */ 
         
    $dummyData str_repeat("X"
         
    $this->longestTargetChoice); 
          
         print(
    "<select name=\"".
         
    $this->names[CS_SECOND_SELECTOR]."\">\n"); 
         for(
    $i=0$i $this->maxTargetChoices$i++) 
         {  print(
    "\t<option value=\"\">$dummyData</option>\n"); 
         } 
         print(
    "</select>\n"); 

     } 
      
     
    //prints a call to the update function 
     
    function initialize() 
     {             print(
    "update" .
     
    $this->names[CS_SECOND_SELECTOR] . "();\n"); 
     } 

    ?>
    EDIT:
    Hm... irgendwie läßt sich der Code nicht umbrechen.
    Zuletzt geändert von asp2php; 14.10.2004, 20:48.
    Das Genie überblickt das Chaos!

    Wer Rechtschreibfehler findet, darf sie behalten!

  • #2
    brich den code um, so liest kein mensch dein posting.

    Kommentar


    • #3
      Code umbrechen

      Sorry, steh grad voll auf der Leitung. Wie meinst du das mit Code umbrechen?
      Das Genie überblickt das Chaos!

      Wer Rechtschreibfehler findet, darf sie behalten!

      Kommentar


      • #4
        du hast sicher auch eine horizontale bildlaufleiste im browser eingeblendet. idr. muss das nicht sein.

        Kommentar


        • #5
          poste mal die JS-Funktion, die beim Browser ankommt.

          Kommentar


          • #6
            Also bei mir wird der Text einwandfrei umgebrochen, ich benötige für oben geposteten Code auch keine horizontale Bildlaufleiste.

            Den Ausgabecode, die beiden Dateien mit o. stehenden Code sowie den sql-dump hab ich als Zip-File angehängt. Wollte nicht auch noch den Ausgabecode posten, da dieser sehr lang ist.
            Angehängte Dateien
            Das Genie überblickt das Chaos!

            Wer Rechtschreibfehler findet, darf sie behalten!

            Kommentar


            • #7
              Original geschrieben von chefdesigner
              Also bei mir wird der Text einwandfrei umgebrochen, ich benötige für oben geposteten Code auch keine horizontale Bildlaufleiste.
              OffTopic:
              Ja, ich war gestern mit dem Sch**ß FireFox unterwegs und der zeigt immer von DOCTYPE angefangen bist <?php immer in einer Zeile. Danach habe ich mir in Opera angeschaut und sah i.O aus, ich war aber dann zu faul mein Edit zu ändern

              Wollte nicht auch noch den Ausgabecode posten, da dieser sehr lang ist.
              Ja, besser nicht zu viel Code, das wirkt meist abschreckend

              Kommentar


              • #8
                Du muß vor dem Neubesetzen die Liste re-initialisieren, dann passiert sowas nicht, d.h. alle Elemente = null setzen, dann befüllen.

                Kommentar


                • #9
                  Ich habs jetzt mal so probiert, funktioniert aber nicht, kann mir jemand sagen, was ich jetzt falsch gemacht habe?

                  PHP-Code:
                   //print the two selectors 
                   
                  function printSelectors() 
                   {             
                  /* 
                       **create prefilled first selector 

                       */ 
                       
                  $selected=TRUE
                       print(
                  "<select name=\"" 
                       
                  $this->names[CS_FIRST_SELECTOR] . "\" " 
                           
                  "onChange=\"update".
                           
                  $this->names[CS_SECOND_SELECTOR]."();\">\n"); 
                       foreach(
                  $this->uniqueChoices as $key=>$value
                       {   print(
                  "\t<option value=\"$key\""); 
                           if(
                  $selected
                           {   print(
                  " selected=\"selected\""); 
                               
                  $selected=FALSE
                           } 
                           print(
                  ">$value</option>\n"); 
                       } 
                       print(
                  "</select>\n"); 

                       
                  /* 
                       **create empty target selector 
                       */ 
                       


                       /* 
                       **Hier meine Änderung
                       */ 
                       
                  unset($this->maxTargetChoices);
                       
                  /* 
                       **Hier meine Änderung
                       */ 



                       
                  $dummyData str_repeat("X"
                       
                  $this->longestTargetChoice); 
                        
                       print(
                  "<select name=\"".
                       
                  $this->names[CS_SECOND_SELECTOR]."\">\n"); 
                       for(
                  $i=0$i $this->maxTargetChoices$i++) 
                       {  print(
                  "\t<option value=\"\">$dummyData</option>\n"); 
                       } 
                       print(
                  "</select>\n"); 

                   } 
                  Zuletzt geändert von chefdesigner; 15.10.2004, 14:34.
                  Das Genie überblickt das Chaos!

                  Wer Rechtschreibfehler findet, darf sie behalten!

                  Kommentar


                  • #10
                    keine Lust deinen Code anzuschauen, aber machst irgendwas PHP-seitig, dass das Ergebnis meiner obigen Aussage entspricht, d.h. z.B. über eine JS-Fkt. alle Elelemente = null setzen, erst dann weiter wie bisher verfahren. Ist eigentlich simple. Schreibe die JS-Fkt. und ruft sie in deiner bisherigen Fkt auf, that's it.

                    Kommentar


                    • #11
                      keine Lust deinen Code anzuschauen,
                      Hat hier wahrscheinlich keiner, da ein langer horizontaler Scrollbalken die sache nicht unbedingt leichter macht. außerdem erschwert das zusätzlich das lesen von asps Post.

                      Kommentar


                      • #12
                        Sorry Leute, aber bei mir wird der Code einwandfrei umgebrochen. Ich benötige keinen horizontalen Scrollbalken. Gut, der vertikale ist etwas größer, da es verhältnismäßig viel Code ist, aber das kann ich ja schlecht ändern.

                        Wäre trotzdem wirklich nett von euch, wenn ihr mir weiterhelfen könntet, ich brings alleine nicht hin.
                        Das Genie überblickt das Chaos!

                        Wer Rechtschreibfehler findet, darf sie behalten!

                        Kommentar


                        • #13
                          Original geschrieben von TobiaZ
                          Hat hier wahrscheinlich keiner, da ein langer horizontaler Scrollbalken die sache nicht unbedingt leichter macht. außerdem erschwert das zusätzlich das lesen von asps Post.
                          Tobi, ich hatte auch Schwierigkeit mit dem Firefox gehabt, aber im Opera ist OK. (Auflösung 1024 x 768)

                          Kommentar

                          Lädt...
                          X