2 Comboboxy HTML PHP

Programovacie jazyky, rady, poradňa...
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

2 Comboboxy HTML PHP

Príspevok od používateľa Fata! ChaoS »

AHojte, potrebujem niečo také, že sa z comboboxu vyberie kategória a potom sa v druhom comboboxe zobrazia podkategórie tej kategórie aj som to nakódil

Kód: Vybrať všetko

<select name="class" size="1" onchange="document.ex.state.value = document.ex.s.options[document.ex.s.selectedIndex]
.value;document.ex.s.value=''">
<option selected="selected">Vyber si kategóriu</option>
<option>Zvieratá</option>
<option>Politika</option>
<option>Šport</option>
</select>
<?
if($class!="Vyber si kategóriu" and $class!=""){

echo "<select name='subclass' size='1' onchange='document.ex.state.value = document.ex.s.options[document.ex.s.selectedIndex]
.value;document.ex.s.value=\"\"'>";
echo "<option selected='selected'>Vyber si podkategóriu</option>";

if($class=="Zvieratá"){
  echo "<option>Hmyz</option>";
  echo "<option>Domáce zvieratá</option>";
  echo "<option>Cicavce</option>";
}
if($class=="Politika"){
  echo "<option>Slovenská politika</option>";
  echo "<option>Medznárodná politka</option>";
  echo "<option>Armáda</option>";
}

if($class=="Šport"){
  echo "<option>Futbal</option>";
  echo "<option>Poker</option>";
  echo "<option>Basketbal</option>";
}
}

?>
Len problém je tam, že keď sa vyberie hlavná kategória sa nič nezmení a tak do premennej $class sa neuloží nová hodnota, to by sa muselo ešte raz prečítať zdroják aby sa to inicializovalo. Takže jak to treba spraviť aby po vybratí sa to hneď zobrazil ten druhý combox s podkategóriami?? ALebo ako by ste to robili vy?? Vopreed díky.
awtt
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1234
Registrovaný: 01 nov 2006, 19:37
Bydlisko: San Francisco
Kontaktovať používateľa:

Príspevok od používateľa awtt »

ajax
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

tie kategorie nebere z db, ale sú tam napevno, takže zbytočne tam pchať ajax. Stačí obyčajný js. Niečo také je tu: http://www.js-x.com/page/javascripts__e ... ?view=1049
--==[ RA ]==--
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 841
Registrovaný: 03 mar 2006, 18:07
Bydlisko: Kosice
Kontaktovať používateľa:

Príspevok od používateľa --==[ RA ]==-- »

Na vytvaranie optionov s selectboxe pouzi js prikaz:

Kód: Vybrať všetko

new Option(text, value, defaultSelected, selected)
a na samotnom selecte urob cca toto:

Kód: Vybrať všetko

<select id="sel" name="sel" onChange="volanie fcie">
to volanie bude volat fciu ktora odovzda ako parameter hodnotu selectu a na zaklade nej povytvaras optiony.
apoloxx
Novice
Novice
Príspevky: 7
Registrovaný: 18 júl 2009, 18:48

Príspevok od používateľa apoloxx »

Ahoj v PHP robim asi mesiac taaaak neviem ci je to spravne a neviem ci som to spravne pochopil ale tak ja by som to napisal takto:

Kód: Vybrať všetko

<form method=post>
<select name="class" size="1" onchange="submit()">
<option selected="selected">Vyber si kategóriu</option>
<option>Zvieratá</option>
<option>Politika</option>
<option>Šport</option>
</select>
</form>
<?
$class=  $_POST ['class'];
if($class!="Vyber si kategóriu" and $class!=""){

echo "<select name='subclass' size='1' onchange='document.ex.state.value = document.ex.s.options[document.ex.s.selectedIndex]
.value;document.ex.s.value=\"\"'>";
echo "<option selected='selected'>Vyber si podkategóriu</option>";

if($class=="Zvieratá"){
  echo "<option>Hmyz</option>";
  echo "<option>Domáce zvieratá</option>";
  echo "<option>Cicavce</option>";
}
if($class=="Politika"){
  echo "<option>Slovenská politika</option>";
  echo "<option>Medznárodná politka</option>";
  echo "<option>Armáda</option>";
}

if($class=="Šport"){
  echo "<option>Futbal</option>";
  echo "<option>Poker</option>";
  echo "<option>Basketbal</option>";
}
}

?>
--==[ RA ]==--
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 841
Registrovaný: 03 mar 2006, 18:07
Bydlisko: Kosice
Kontaktovať používateľa:

Príspevok od používateľa --==[ RA ]==-- »

Zaklad je v tom ze treba vykonavanie presunut z php na javascript, pretoze keby to bolo robene v php tak pri kazdom vybere selectu by sa musela refreshnut stranka. Ak by to bolo robene v javascripte tak sa to vykonava dynamicky bez refreshu.
Treba pozret audiotrackov prispevok a to co som napisal ja, podla toho sa to v javascripte da velmi pekne nakodit.
na rychlo zbuchane daco, snad pomoze:

Kód: Vybrať všetko

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <title></title>
  <script type='text/javascript'>
  function changeSelect(hodnota){
    //alert(hodnota);
    document.getElementById('class2').length = 0;
    if(hodnota == "Zvieratá"){
      class2.options[0]=new Option("pes","pes", false, true);
      class2.options[1]=new Option("macka","macka", false, false);
    } else if(hodnota == "Politika"){
      class2.options[0]=new Option("fico","fico", false, true);
      class2.options[1]=new Option("miki","miki", false, false);
    } else if(hodnota == "Šport"){
      class2.options[0]=new Option("futbal","futbal", false, true);
      class2.options[1]=new Option("hokej","hokej", false, false);
    } else {
      class2.options[0]=new Option("Vyber hodnotu", null, false, false);
    }
  }
  </script>
  </head>
  <body>
  <form method=post id="formul">
    <select name="class" id="class" size="1" onChange="changeSelect(this.options[this.selectedIndex].value);">
      <option selected="selected">Vyber si kategóriu</option>
      <option>Zvieratá</option>
      <option>Politika</option>
      <option>Šport</option>
    </select>
    <select name="class2" id="class2" size="1">
      <option selected="selected">Vyber hodnotu</option>
    </select>
  </form>
  
  </body>
</html>
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

2 audiotrack:
Nuž ja javascript neviem absolútne a to čo si mi dal ten link tak je to strašne zložité premňa keďže nechápem väčšinu kódu javascriptu.

2 apoloxx: No tak nejak si to predstavujem, ale bez toho refreshu stránky.

2 RA:
Čo si napísal ten kód, tak to je super, len to nefunguje, toťiž nezobrazuje to tie podkategórie ak sa vyberie hlavná kategória, správne si vytvoril tie podkategórie? Prosím prezrel by si to? Ja viem, že to si len tak narýchlo napísal, ale vyzerá to dobré a jednoduché.
awtt
Medium Professional
Medium Professional
Používateľov profilový obrázok
Príspevky: 1234
Registrovaný: 01 nov 2006, 19:37
Bydlisko: San Francisco
Kontaktovať používateľa:

Príspevok od používateľa awtt »

tu maš ten script opravený (ale v IE nefunguje :) )

Kód: Vybrať všetko

<script type='text/javascript'> 
  function changeSelect(hodnota){ 
    //alert(hodnota); 
    document.getElementById('class2').length = 0; 
    if(hodnota == "Zvieratá"){ 
      document.getElementById("class2").options[0]=new Option("pes","pes", false, true); 
      document.getElementById("class2").options[1]=new Option("macka","macka", false, false); 
    } else if(hodnota == "Politika"){ 
      document.getElementById("class2").options[0]=new Option("fico","fico", false, true); 
      document.getElementById("class2").options[1]=new Option("miki","miki", false, false); 
    } else if(hodnota == "Šport"){ 
      document.getElementById("class2").options[0]=new Option("futbal","futbal", false, true); 
      document.getElementById("class2").options[1]=new Option("hokej","hokej", false, false); 
    } else { 
      document.getElementById("class2").options[0]=new Option("Vyber hodnotu", null, false, false); 
    } 
  } 
  </script> 
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

tak som aj ja niečo skúsil. Bolo by to skôr, leby so lepšie čítal. Ja som to robil až pre tri selecty, takže to čo je zakomentované potom môžeš zmazať. Riadky sú tam ako combo[2][2][1] = new Option("bbbbbbbb", "5");
zelená znamená že je to hodnota pre druhý combobox
červená znamená že je to pre hodnotu 2 z predchádzajúceho comba
modrá označuje poradie hodnoty

takže si to môžeš ľahko dorobiť. Malo by to ísť aj vo ff, IE aj v Opere
Prílohy
combo.rar
(943 Bajtov) 25 stiahnutí
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

díky hoši, pomohli ste mi, no ešte by osm niečim potreboval pomoc
takto mi vyzerá celý kód

Kód: Vybrať všetko

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title></title>
  <script language="javascript">
  var combo = new Array(2);
       combo[1] = new Array();
        combo[1][0] = new Array();
          combo[1][0][0] = new Option("Vyber si kategóriu!", "0");
          combo[1][0][1] = new Option("Zvieratá", "1");
          combo[1][0][2] = new Option("Politika", "2");
          combo[1][0][3] = new Option("Bulvár", "3");
        
       combo[2] = new Array();
	 combo[2][0] = new Array();
          combo[2][0][0] = new Option("Vyber si podkategóriu!", "0");
          combo[2][0][1] = new Option(" ", "1");
        combo[2][1] = new Array();
          combo[2][1][0] = new Option("Pes", "2");
          combo[2][1][1] = new Option("Mačka", "3");
        combo[2][2] = new Array();
          combo[2][2][0] = new Option("Fico", "4");
          combo[2][2][1] = new Option("Dzurinda", "5");
          combo[2][2][2] = new Option("Slota", "6");
          combo[2][2][3] = new Option("Gasparovič", "7");
        combo[2][3] = new Array();
          combo[2][3][0] = new Option("Paris Hilton", "8");
          combo[2][3][1] = new Option("Pamela Anderson", "9");
       
  
    function combo_init(){
      napln(1,0);
    }
    
    function napln(ktory,optiony){
        comboboxy = new Array();
        comboboxy[1] = document.getElementById("class");
        comboboxy[2] = document.getElementById("subclass");
        for (m=comboboxy[ktory].options.length-1;m>0;m--) comboboxy[ktory].options[m]=null
        for (i=0;i<combo[ktory][optiony].length;i++) comboboxy[ktory].options[i]=new Option(combo[ktory][optiony][i].text,combo[ktory][optiony][i].value)
        comboboxy[1].onchange = function(){napln(2,this.value)};
        
    }
    
  </script>
  </head>
  <body onload="combo_init()">


<?
echo "<center><table><FORM method='post' action='?page=sent$url'>";
?>

<select id="class" name="class"></select>
<select id="subclass" name="subclass"></select>  


 <TR><TD><B>Otázka: <BR><small></B>(Tvoja otázka môže mať max 250 znakov.)<B></small>:</B></TD><TD width="200"><textarea name="otazka" COLS=58 ROWS=6></textarea></TD></TR>
 <TR><TD>Keď si myslíš, môžeš podrobnejšie opísať otázku: </TD><TD><textarea name="text" COLS=58 ROWS=6></textarea></TD></TR>
 <TR><TD COLSPAN=2 ALIGN=CENTER><INPUT TYPE=SUBMIT VALUE=' Poslať otázku ' CLASS='button'></TD></TR>


</FORM>
 </table></center><BR>

</body>
</html>
V IE mi to funguje bez problémov, no v Opere, keď mením hlavnú kategóriu, tak sa mi zmenšuje textarea, a neviem ako by sa to dalo ošetriť? Máte nápad? V Mozille som to ešte neskúšal.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

mne to v opere ide normálne, žiadnu textareu nezmenšuje. Mám verziu 9.63
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

hej, robilo to len v star3ej veryii 9.23, stiahol som si tú čo máš ty a už mi to nerobí.
--==[ RA ]==--
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 841
Registrovaný: 03 mar 2006, 18:07
Bydlisko: Kosice
Kontaktovať používateľa:

Príspevok od používateľa --==[ RA ]==-- »

Fata! ChaoS: Ano teraz som to spustil v IE a neukazuje hodnoty, moze mi dakto povedat ako ten moj opravit aby mi to islo aj v IE? Ze kde by mohla byt chyba? Viem ze ten audiotrack-ov funguje dobre ale rad by som sa poucil z vlastnych chyb :D
Dakujem

awtt: to je podlamna jedno nahradit class2 za document.getElementById("class2") lebo ti vrati ten isty objekt, to som tak daval pretoze som to robil na rychlo
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

máš tam dve chyby:

1) za vymazaním toho selectu si musíš vytvoriť tú premennú class2 ktorú neskôr používaš:

Kód: Vybrať všetko

var class2 = document.getElementById('class2');
2) ako premennú do funkcie vkladáš value, no ten combobox nemá value, takže ho prerobiš takto:

Kód: Vybrať všetko

    <select name="class" id="class" size="1" onChange="changeSelect(this.options[this.selectedIndex].value);">
      <option selected="selected">Vyber si kategóriu</option>
      <option value="Zvieratá">Zvieratá</option>
      <option value="Politika">Politika</option>
      <option value="Šport">Šport</option>
    </select>
alebo tam nebudeš posielať innerHTML:

Kód: Vybrať všetko

onChange="changeSelect(this.options[this.selectedIndex].innerHTML);"

//edit: vlastne tú prvu ti awt už opravil, no keby si to dal ako premennú (viď môj spôsob) tak by document.getElementById('class2') nemusel písať pred každý riadok
--==[ RA ]==--
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 841
Registrovaný: 03 mar 2006, 18:07
Bydlisko: Kosice
Kontaktovať používateľa:

Príspevok od používateľa --==[ RA ]==-- »

aha jasne uz mi to doslo, hlavne ze FF to bral bez problemov a mna nenapadlo zeby to bolo zle...
Diky pekne za opravu chyb
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

Ľudia mám ešte jednu otázku, keď sa vytvorý option udám mu text a value a potom ak sa vyberie s toho selectu niektorý, tak potom v tej premennej $class bude hodnota value, ale nedalo by sa vycucnúť do nejakej premennej ten text. Lebo tých kategórií budem mať dosť veľa a nechce sa mi toľlko if príkazov písať aby som to podĺa value premieňal na ten text, lebo podľa toho textu to chcem ukladať do databázy. No takže dá sa nejak vycucnúť ten text bez N počtu if príkazov? Ak nie, tak nevadí, len som si chcel ulahčiť prácu :)
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

Fata! ChaoS napísal:Ľudia mám ešte jednu otázku, keď sa vytvorý option udám mu text a value a potom ak sa vyberie s toho selectu niektorý, tak potom v tej premennej $class bude hodnota value, ale nedalo by sa vycucnúť do nejakej premennej ten text. Lebo tých kategórií budem mať dosť veľa a nechce sa mi toľlko if príkazov písať aby som to podĺa value premieňal na ten text, lebo podľa toho textu to chcem ukladať do databázy. No takže dá sa nejak vycucnúť ten text bez N počtu if príkazov? Ak nie, tak nevadí, len som si chcel ulahčiť prácu :)
dá, ale bude to bezpečnostná chyba. Nemusíš to robiť cez n podmienok, stačí si spraviť asociatívne pole a bueš mať k tej hodnote prístup bez jedinej podmienky nejak takto: $hodnoty[$_GET['hodnota_z_value_optionu']]
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

No neviem, či si ma nepochopil alebo len ja nechápem.
Skártka mám nejaký option

Kód: Vybrať všetko

combo[1][0][0] = new Option("Zvieratá", "1");
text=Zvieratá
value=1

keďže select mi vyzerá takto

Kód: Vybrať všetko

<select id="class" name="class"></select>
Tak ak chcem vypísať $class tak mi vypíše 1, čo je to value, ale ja nie tú 1 to value potrebujem, ale ten text, čiže to "Zvieratá". Nechápem jak by sa to dalo s tým $_GET to získať preto sa pýtam, či si ma pochopil správne.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

nechápeš ty. Ide o to, že ak tam budeš mať priamo hodnotu ktorú budeš pchať do db, nie je to bezpečné. Ak ti príde číslo, nič sa nestane lebo z čísla vieš získať meno (keby si to robil cez databázu, kde máš nejaké tie kategorie tak by si veľmi rýchlo zistil že ti stačí číslo, a názov tam pchať nie je dobré)
Potom ti v php príde v $_GET['class'] to číslo, teda napríklad 1 (alebo v $_POST['class'] podľa použitej prenosovej metody). Aby si ale nemusel robiť veľa podmienok typu:

Kód: Vybrať všetko

if($_GET['class'] == 1) $kategoria = "zvierata";
if($_GET['class'] == 2) $kategoria = "politika";
if($_GET['class'] == 3) $kategoria = "bulvar";
.
.
.
prípadne cez case, môže to spraviť asociatívnym poľom ako som spomínal takto:

Kód: Vybrať všetko

$hodnoty = array(1=>"zvierata","politika","bulvar");
$kategoria = $hodnoty[$_GET['class']];
hádam teraz už chápeš. Ver mi, je to tak lepšie ;)
Fata! ChaoS
Star
Star
Používateľov profilový obrázok
Príspevky: 650
Registrovaný: 12 apr 2006, 20:23
Bydlisko: Tvrdošovce
Kontaktovať používateľa:

Príspevok od používateľa Fata! ChaoS »

Aha už chápem, no neskôr si to vyskúšam teraz nestíham, ale nieje to niečo také ako v C# štruktúry?
Napísať odpoveď