Suuniitelen tämmöistä juttua, johon sitten liittyy myös ajax ja php.
Tietokannassa on seuraavankaltaisia tauluja listauksineen:
+Osastot
+ + Alaosastot
+ + + Alimmat_osastot
Tarkoitus on seuraava:
Käyttäjä valitsee ensin jonkin osaston listasta Osastot.
Valinnan seurauksena viereen avautuu select-valikko, joka listaa valittuun osastoon kuuluvat alaosastot.
Kun on valittu alaosasto, tehdään samanlainen listaus alimmista osastoista.
Lisäksi pitäisi jotenkin saada sama tapahtumaan automaattisesti linkeillä.
Linkki lomake.php?c1=10&c2=2&c3=4 avaisi valikosta kyseiset osastot valmiiksi valittuina.
Suomennos:
c1= Osasto Id nro 10
c2= Osasto nro 10:n Alaosasto nro 2
c3= Osasto nro 10:n Alaosasto nro 2:n osasto nro 4
Lähinnä tässä on ongelma miettiä miten nuo valinnat siis tapahtuu javascriptissä.
Ajaxia en osaa mutta itsellä hiukan samanlainen systeemi tulossa omaan projektiin ja oppaita etsiessä löytyi tuollainen:
http://www.w3schools.com/php/php_ajax_database.
Pekka Mansikka kirjoitti:
Lähinnä tässä on ongelma miettiä miten nuo valinnat siis tapahtuu javascriptissä.
Onchangella ja selectedIndexillä ensiksi ja sitten juuri linkatun tapaista requestia.
Pete2 kirjoitti:
Onchangella ja selectedIndexillä ensiksi ja sitten juuri linkatun tapaista requestia.
Kuinkahan tuo oikein tuohon liittää...ei sytytä :)
Nyt toimii siten, että listaa tuon Osaston alaosastot, mutta siitä tehty valinta ei tee mitään. Myöskään $_POST-lähetykseen ei tallennu tuo alempi valinta, joka tehdään Ajaxin hakemalla listalla...
EDIT: Nyt sain tuon postauksen toimimaan oikein... pieni kirjoitusvirhe oli kentän nimessä, josta haettiin tietoa.
Mutta edelleen pähkäilen, miten saan tuon alimman osaston tulostumaan...olen tehnyt melkein samanlaisen funktion sille, mutta ei tee mitää...selectIndex?
Edit kaksi. laitampa tässä tekemäni värkin. Ei löydä alaos.php tiedostoa ollenkaa.
function PikkuOsastot(str1,str2) { if (str2=="") { document.getElementById("txtOsa").innerHTML=""; return; } if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("txtOsa").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","alaos.php?c1="+str1+"&c2="+str2,true); xmlhttp.send(); }
Tiedostossa getuser.php (en ole muuttanut tuon esimerkkifileen nimeä):
<select size=1 name="osastot2" onChange="PikkuOsastot($q,this.value)">
Post-vastaanotto siis löytää tältä lomakkeelta tehdyn valinnan.
Tuo str1 on siis ihan ekalistalta tehty valinta, jonka valitseminen tulostaa listauksen getuser.php tiedostossa.
Tervehdys Pekka Mansikka.
En hoksannut kysymystäsi, mutta inspiraation tullessa tein pienen esimerkki koodin. En ole testannut kyseistä koodia, joten se saattaa sisältää bugeja.
Tein koodin w3schoolsin ajax oppaan selittämällä tavalla, mutta suosittelen perehtymään jQuery-javascript kirjastoon, jonka avulla ajaxin käyttö on helppoa.
<?php // index.php // Tietokanta haut voisivat olla esimerkiksi seuraavanlaisia... // Noudetaan osastojen tiedot $sql = "SELECT id, name FROM osastot ORDER BY name ASC"; $result = mysql_query($sql) or trigger_error(mysql_error(), E_USER_ERROR); while ($rivi = mysql_fetch_assoc($result)) { $osastot[$rivi['id']] = $rivi['name']; } // Noudetaan alaosastojen tiedot, jos urliin syötetty if (isset($_GET['c1'])) { $sql = "SELECT id, name FROM alaosastot WHERE id = " . intval($_GET['c1']) . " ORDER BY name ASC"; $result = mysql_query($sql) or trigger_error(mysql_error(), E_USER_ERROR); while ($rivi = mysql_fetch_assoc($result)) { $alaosastot[$rivi['id']] = $rivi['name']; } } // Noudetaan alimpienosastojen tiedot, jos urliin syötetty if (isset($_GET['c2'])) { $sql = "SELECT id, name FROM alimmatosastot WHERE id = " . intval($_GET['c2']) . " ORDER BY name ASC"; $result = mysql_query($sql) or trigger_error(mysql_error(), E_USER_ERROR); while ($rivi = mysql_fetch_assoc($result)) { $alimmatosastot[$rivi['id']] = $rivi['name']; } } ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv= Content-Type" content="text/html; charset=UTF-8" /> <script type="text/javascript"> function haeAlaosastot(str) { if (str=="") { document.getElementById("alaosastot").innerHTML=""; return; } if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("alaosastot").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","ajax.php?c1="+str,true); // Kyseisessä esimerkissä GET:in pituusrajoitus ei tulene vastaan, mutta muissa sovelluksissa POST:in käyttäminen saattaisi olla järkevämpää xmlhttp.send(); } function haeAlimmatosastot(str) { if (str=="") { document.getElementById("alimmatosastot").innerHTML=""; return; } if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("alimmatosastot").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","ajax.php?c2="+str,true); xmlhttp.send(); } </script> <title></title> </head> <body> <form action="jokusivu.php" method="post"> <div id="osastot"> <?php if (isset($osastot)) { ?> <select name="osasto" onclick="haeAlaosastot(this.value)"> <?php foreach ($osastot as $osastoId => $osastoName) { ?> <option value="<?php echo $osastoId; ?>"><?php echo $osastoName; ?></option> <?php } ?> </select> <?php } ?> </div> <div id="alaosastot"> <?php if (isset($alaosastot)) { ?> <select name="alaosasto" onclick="haeAlimmatosastot(this.value)"> <?php foreach ($alaosastot as $alaosastoId => $alaosastoName) { ?> <option value="<?php echo $alaosastoId; ?>"><?php echo $alaosastoName; ?></option> <?php } ?> </select> <?php } ?> </div> <div id="alimmatosastot"> <?php if (isset($alimmatosastot)) { ?> <select name="alinosasto"> <?php foreach ($alimmatosastot as $alinosastoId => $alinosastoName) { ?> <option value="<?php echo $alinosastoId; ?>"><?php echo $alinosastoName; ?></option> <?php } ?> </select> <?php } ?> </div> </form> </body> </html>
<?php // ajax.php if (isset($_GET['c1'])) { $sql = "SELECT id, name FROM alaosastot WHERE id = " . intval($_GET['c1']); $result = mysql_query($sql) or trigger_error(mysql_error(), E_USER_ERROR); ?> <select name="alaosasto" onclick="haeAlimmatosastot(this.value)"> <?php while ($rivi = mysql_fetch_assoc($result)) { ?> <option value="<?php echo $rivi['id']; ?>"><?php echo $rivi['name']; ?></option> <?php } ?> </select> <?php } if (isset($_GET['c2'])) { $sql = "SELECT id, name FROM alimmatosastot WHERE id = " . intval($_GET['c2']); $result = mysql_query($sql) or trigger_error(mysql_error(), E_USER_ERROR); ?> <select name="alinosasto"> <?php while ($rivi = mysql_fetch_assoc($result)) { ?> <option value="<?php echo $rivi['id']; ?>"><?php echo $rivi['name']; ?></option> <?php } ?> </select> <?php }
-Othnos
Ps: Toivoisin putkan guruilta vinkkejä koodin muotoiluun ja kaikkiin epäkohtiin
Oli tuossa muutamia bugeja SQL-lauseessa, kuten välilyönnit pilkun ja muuttujan välissä ym.
Mutta en siitä sen kummempaa.
Oleellisempaa on minusta mysql-taulujen rakenne.
Minulla on siten, että kunkin Osaston Alaosastot numeroidaan esim. numeroin 1-3, jos siinä on kolme alaosastoa, ei siis auto_increment-kentän mukaan. Samoin alimmat osastot.
Niimpä siellä on kentät Osasto_Id ja AlaOsasto_Id (alimmassa osastossa).
Osasto_id kertoo ylemmän osaston numeron ja AlaOsasto_id alaosaston järjestyksen alkaen numerosta 1.
En saanut tuota vielä toimimaan oikein, listasi ihan vääriä listoja alimmassa osastossa...sitä hakiessa pitää tunnistaa nuo kaksi kenttää, jotta tulee oikea lista.
Noh niin, tämähä meni hyvin.
Sain toimimaan tuon Ajax-hommalla valinnan oikein.
Sen sijaan tuo linkki-juttu on vähän erilaisempi...siihen pitää vielä saada oikea selected-valinta.
Kiitoksia Onthos.
Seuraavilla koodinpätkillä pääset varmasti alkuun
Edelliseen koodiin unohtui tuo XSS-aukko. Kannattaa ajaa nuo kaikki "name":t htmlspecialchars-funktion lävitse.
<?php // index.php // Korvaa edellinen $_GET['c2'] rimpsu tällä // Noudetaan alimpienosastojen tiedot, jos urliin syötetty if (isset($_GET['c1']) && isset($_GET['c2'])) { $sql = "SELECT c2Numero, name FROM alimmatosastot WHERE c1Numero = " . intval($_GET['c1']) . " AND c2Numero = " . intval($_GET['c2']) . " ORDER BY name ASC"; $result = mysql_query($sql) or trigger_error(mysql_error(), E_USER_ERROR); while ($rivi = mysql_fetch_assoc($result)) { $alimmatosastot[$rivi['c2Numero']] = htmlspecialchars($rivi['name']); } }
Selected valinnan saat vertaamalla annettuja tietoja foreach-loopissa.
<?php if (isset($osastot)) { ?> <select name="osasto" onclick="haeAlaosastot(this.value)"> <?php foreach ($osastot as $osastoId => $osastoName) { if (isset($_GET['c1']) && $_GET['c1'] == $osastoId) { ?> <option value="<?php echo $osastoId; ?>" selected="selected"><?php echo $osastoName; ?></option> <?php } else { ?> <option value="<?php echo $osastoId; ?>"><?php echo $osastoName; ?></option> <?php } } ?> </select> <?php } ?>
Ja sitten vain soveltamaan...
Kiitoksia!
Ehdin jo väkerrellä omalla systeemillä tuon homman toimivaksi.
Käytin for-silmukkaa ja array_keys funktiota Id:n selvittämiseen...
Vielä jotain hienosäätöä saatta siitä vielä löytyä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.