Avatar billede WAMSLERS Nybegynder
30. november 2012 - 07:08 Der er 12 kommentarer og
1 løsning

Dropdown der ændrer sig efter en anden

Jeg arbejder på en tilmeldingsformular der naturligvis skal ligge online. I formularen skal man kunne tilmelde sig et kursus - men det der er specielt er, at der er flere kursussteder at vælge imellem - det er dog ikke alle kurser, der udbydes alle steder - derfor behøves der en dropdown hvor man vælger nærmeste kursussted - og når det er valgt, så tilpasser det næste dropdown felt sig, så kun de kurser der er tilgængelige dér er listet i dropdownfeltet.

Jeg har lavet de to dropdownfelter her med en forspørgsel til min mysql-database. Den første tabel indeholder alle kursussteder og den anden indenholder alle kurser. Hvordan får jeg den første til at påvirke den anden. I tabellen "kurser" er et felt der hedder "location" hvori ID'et til det pågældende kursussted står (adskilt af komma når der er flere kursussteder der udbyder samme kursus), for at referere til tabellen "locations" hvor alle disse er listet:


<?php
echo "<select name=\"fag-loc\" id=\"fag-loc\" class=\"form\">";

$result_kurser = mysql_query("SELECT * FROM locations ORDER BY name ASC");
while($row_kurser = mysql_fetch_assoc($result_kurser)) {

echo ($_POST['kur-kursus']==$row_kurser['name']) ? "<option selected value=\"{$row_kurser['name']}\">{$row_kurser['name']}</option>\n" : "<option value=\"{$row_kurser['name']}\">{$row_kurser['name']}</option>\n";

}
echo "</select>"; ?>



<?php
echo "<select name=\"fag-fag\" id=\"fag-fag\" class=\"form\">";

$result_kurser = mysql_query("SELECT * FROM kurser ORDER BY titel ASC");
while($row_kurser = mysql_fetch_assoc($result_kurser)) {

echo ($_POST['kur-kursus']==$row_kurser['titel']) ? "<option selected value=\"{$row_kurser['titel']}\">{$row_kurser['titel']}</option>\n" : "<option value=\"{$row_kurser['titel']}\">{$row_kurser['titel']}</option>\n";

}
echo "</select>"; ?>


Jeg håber nogen har en løsning?
Avatar billede olsensweb.dk Ekspert
30. november 2012 - 09:08 #1
løsnigen er AJAX
prøv at google php cascade dropdown eller php cascade select
Avatar billede Panen Nybegynder
30. november 2012 - 09:09 #2
Første skridt er at lave en onchange event på din select.

<select onchange="myFunction()">

Så laver du selvfølgelig en tilsvarende funktion, så når værdien i din select ændrer sig, bliver myFunction kaldt.

I myFunction skal du så finde ud af hvordan du vil gøre.
Om du vil hente de ønskede kurser ud med ajax, eller om du vil have dem liggende i et array eller objekt, og sortere i dem.
Avatar billede Slettet bruger
30. november 2012 - 10:55 #3
Et lille design pip

Dropdowns <select> er ikke særligt overskuelige, var det ikke bedre at bruge en stribe radioknapper:
Først sætter man hak ud for kursussted, derefter vises de aktuelle kurser, igen som radioknapper.
- fordi du kan vise mere info (evt. flere linjer. evt. links til mere information) for hver valgmulighed.

Fremgangsmåden, rent teknisk, vil være stort set identisk:
sted.onchange => kursus.innerHTML = sted.aktuelleKurser
Avatar billede olebole Juniormester
30. november 2012 - 16:44 #4
<ole>

#3: Det er altid godt med 'et lille design pip', men det er sjældent muligt at vejlede på det område, når man intet kender til interfacet  =)

Mange, lange grupper med mange radiobuttons i hver er sjældent mere overskueligt end SELECT elementer - tværtimod. Valg af elementer afhænger af, hvordan interfacet i øvrigt ser ud - og hvilke valg, brugeren skal foretage

/mvh
</bole>
Avatar billede WAMSLERS Nybegynder
03. december 2012 - 10:47 #5
Ja, der er tale om en liste på godt 120 kurser - så det vil blive mange radiobuttons.

Jeg arbejder videre nu, og vender tilbage når jeg forhåbentlig får løst mit problem - samt med hvilken løsning jeg vælger.

/Lasse
Avatar billede WAMSLERS Nybegynder
03. december 2012 - 16:00 #6
Jeg har nu hentet en ajax-funktion ned og den kører faktisk nu - men der er et problem med at få det rigtige charset til at køre!

De tre dropdowns i eksemplet bliver genereret via en XML (genereret af PHP) som herunder:

<?php
include("dbconfig.inc.php");

header("Content-type: text/xml");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
echo "<list1>\n";

$result = mysql_query("SELECT * FROM wp_contact_location ORDER BY titel ASC");
while($row = mysql_fetch_assoc($result)) {
    echo "<field1>\n\t<id>".$row['id']."</id>\n\t<titel>".$row['titel']."</titel>\n</field1>\n";
}

echo "</list1>";
?>

I databasen står alle kursustitler korrekt med æ, ø og å. Jeg har prøvet at indsætte en encoding (som ses i koden ovenfor) men uden held - og fordi disse tegn er der vil dropdown nummer to ikke virke.

Ajax-komponentet er hentet her:
http://buffernow.com/2012/08/cascading-dropdown-ajax/
Avatar billede olebole Juniormester
03. december 2012 - 16:23 #7
Du kan ikke se, om æ, ø og å står korrekt - men du se, hvordan dit databaseværktøj viser dem. Det behøver ikke være korrekt  =)

Din database skal være sat op til at bruge utf-8 - og kollationer skal være sat til utf8_danish_ci. Alle dokumenter skal desuden være gemt som utf-8.

NB: Data, som er indsat med forkert tegnsæt, vil ikke ændre sig, når/hvis du ændrer på opsætning/kollationer.
Avatar billede WAMSLERS Nybegynder
03. december 2012 - 16:36 #8
Jep.

Enten står den som "utf8_general_ci" eller "utf8_danish_ci" og når jeg kører udtrækket fra databasen vha. alm. php og mysql så kører det fint med æ, ø og å. Det er først når den kommer ind i den xml det går galt. Jeg plejer nu ikke have problemer med xml, har før arbejdet med æ, ø og å i andre projekter.
Avatar billede olebole Juniormester
03. december 2012 - 17:16 #9
Det skal den ikke. Den skal stå til utf8_danish_ci, hvis danske tegn skal behandles korrekt. Det gælder både ved indsætning og hentning.

Det er ikke XML, som giver dig problemer. Hvilken encoding gemmer du dine filer med?
Avatar billede olsensweb.dk Ekspert
03. december 2012 - 18:08 #10
prøv at sette et charset på din connection

dbconfig.inc.php
<?php
$dbhost = "localhost";
$dbuser = "opalwgb1_drop";
$dbpass = "dropdown";
$dbname = "opalwgb1_dropdown";
// -- do not edit below this line --
// connect using PDO
try { // attempt to create a connection to database   
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname;charset=utf8", $dbuser, $dbpass);
}
catch(PDOException $e) { // if it fails, we echo the error and die.
    echo $e->getMessage();
    die();
}
?>


hvis du anvender filerne fra demo'en så gå ind og gem dem som utf-8 uden BOM, de er alle gemt som ansi
sammen charset hel vejen rundt så er du godt på vej
Avatar billede olebole Juniormester
03. december 2012 - 18:25 #11
At sætte charset ved forbindelsen, slører ofte evt. fejl. Bruger man korrekt tegnsæt hele vejen rundt, gør det til gengæld ingen forskel
Avatar billede WAMSLERS Nybegynder
19. december 2012 - 09:24 #12
Jeg gik lidt død med det charset, da ingen ting jeg prøvede virkede. Derfor lavede jeg dropdown'en med en url-menu/dropdown og efterfølgende med en sql-forspørgsel ud fra et givent parameter i URL'en.
Avatar billede olebole Juniormester
19. december 2012 - 12:50 #13
Det var ærgeligt, for så vil det problem blive ved med at poppe op - og du vil være nødt til at 'hacke' dig ud af de simpleste ting, hvergang det sker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester