[PHP/JSS] Funktion in PHP mit OnChange?
-
Hallo Zusammen
Ich habe ein Formular mit zwei Selectboxen das so aussieht:
<select name="kanton"> <option value="1">Aargau</option> <option value="2">Bern</option> </select> <select name="ort"> <--- PROBLEMZEILE ---> </select>
Dort wo Problemzeile steht ist eigentlich meine Frage.
Wie kann ich erreichen dass, wenn der Benutzer des FOrmulars im obigen Selectfeld den Kanton ausgewählt hat, dass dann anhand des Rückgabewertes Aargau oder Bern beim zweiten Selectfeld die Orte angzeigt werden?Wenn also oben Aargau gewählt wurde sollte dann unten Aarau und Baden stehen, wurde Bern gewählt sollte Lyss und Herzogenbuchsee stehen. Aber alles müsste passieren während der User das Selectfeld auswählt und NICHT erst nachdem Submitbutton.
Ich habe es mit einer Testmethode wie dieser versucht:
<?php switch($_REQUEST['op']) { case 'send': { break; } default: { switch($_REQUEST['formdata']) { case '1': { if($_POST['select1'] == "1") { $select2 = "<select name=test><option value=1>Nummer 1 gewählt</option></select>"; } else { $select2 = "<select name=test><option value=1>Nummer 1 gewählt</option></select>"; } break; } case '2': { break; } default: { ?> <form action="test.php?op=send" method="post"> <br> <select name="select1" onChange="window.open('test.php?formdata=1')"><option value="1">Test</option><option value="2">Test 2</option></select> <br> <? echo $select2; ?> <br> <input type="submit" value="OK"> </form> <?php break; } } break; } } ?>
Leider geht das auch nicht so wie ich es gerne hätte.
Hat mir jemand eine Lösung??
Vielen Dank!
Gruss
WolfPS: Wir suchen noch Interessenten welche gerne an unserem Projekt teilhaben wollen. SEi es in der Community oder sonst wo. www.globesolutions.ch
-
hm... is ne zeit her, als ich sowas gemacht hab, kann dir also nicht aus dem Stegreif helfen...
grob gesagt musst du im Hintergrund einen HTTP-Request losschicken, dessen Rückgabe du dann mit JS weiterverarbeiten kannst (die Rückgabe könnte in deinem Fall die Liste der Städte sein)... Im Prinzip also AJAXHeute Abend kann ich evtl mehr dazu sagen (wenn bis dahin nicht jemand anders schneller war ;))
-
Ich hab mal was probiert. Nun jetzt geht es mit der Anzeige der zweiten Selectzeile. Allerdings aber wird immer Nummer2 angeben und nicht numer 1 falls wieder nur Test gewählt wurde.
Und das alles aber in einem neuen Fenster! Wie bringe ich JS dazu dies in einem einzigen Fenster, also quasi im gleichen Fesnter als PHP_SELF zu öffnen??
Ich habe es nun so, funktioniert nur halbwegs:
<?php switch($_REQUEST['op']) { case 'send': { break; } default: { switch($_REQUEST['formdata']) { case '1': { if($_POST['select1'] == "1") { $select2 = "<select name=test><option value=1>Nummer 1 gewählt</option></select>"; ?> <form action="test.php?op=send" method="post"> <br> <select name="select1" onChange="window.open('test.php?formdata=1')"><option value="1">Test</option><option value="2">Test 2</option></select> <br> <? echo $select2; ?> <br> <input type="submit" value="OK"> </form> <?php } else { $select2 = "<select name=test><option value=2>Nummer 2 gewählt</option></select>"; ?> <form action="test.php?op=send" method="post"> <br> <select name="select1" onChange="window.open('test.php?formdata=1')"><option value="1">Test</option><option value="2">Test 2</option></select> <br> <? echo $select2; ?> <br> <input type="submit" value="OK"> </form> <?php } break; } case '2': { break; } default: { ?> <form action="test.php?op=send" method="post"> <br> <select name="select1" onChange="window.open('test.php?formdata=1')"><option value="1">Test</option><option value="2">Test 2</option></select> <br> <? echo $select2; ?> <br> <input type="submit" value="OK"> </form> <?php break; } } break; } } ?>
7
@zwutz: Jo ich lass mich mal auf Deine Version überraschen. Danke Dir
Gruss Wolf
-
so... erstmal brauchst du eine JS-Datei
die könnte in etwa so aussehen:
var ResObjekt = null; function erzXMLHttpRequestObject() { var resObjekt = null; try { resObjekt = new ActiveXObject("Microsoft.XMLHTTP"); } catch(Error) { try { resObjekt = new ActiveXObject("MSXML2.XMLHTTP"); } catch(Error) { try { resObjekt = new XMLHttpRequest(); } catch(Error) { alert("Erzeugung des XMLHttpRequest-Objekts ist nicht möglich"); } } } return resObjekt; } function sndReq() { var kanton = ""; // hier musst du irgendwie an den Inhalt des Textfeldes kommen... mir fällt nur grad nicht ein, wie :/ resObjekt.open( 'get', 'handle.php?kanton='+kanton, true ); resObjekt.onreadystatechange = handleResponse; resObjekt.send(null); } function handleResponse() { if(resObjekt.readyState == 4) { // in resObjekt.responseXML bzw resObjekt.responseText // steht dir nun der Inhalt der PHP-Datei zur Verfügung } } resObjekt = erzXMLHttpRequestObject();
die Funktion erzXMLHttpRequestObject() erzeugt, wobei die verschiedenen Möglichkeiten ausprobiert werden... damit funktionierts sowohl mit IE als auch mit Fx und anderen gängigen Browsern (hab aber net alle getestet)
sndReq() übernimmt als Parameter den Kanton, der dann einer PHP-Datei übergeben wird... diese PHP-Datei kümmert sich dann darum, eine XML- oder Klartext-Datei zusammenzubauen. Wenn die Datei fertig geladen ist (readyState == 4) kannst du über responseXML bzw. responseText auf den Inhalt der PHP-Datei zugreifen und mit JS entsprechend weiterverarbeiten. Achte bei XML darauf, dass die Datei wirklich als XML interpretiert wird (Validität ist das eine, der richtige Content-Type das andere). Bei reinem Text reichen normale echos aus (was in deinem Fall, da du eine Liste brauchst, nicht ausreichen wird)als nächstes kommt das HTML-Formular
am anfang musst du natürlich obige JS-Datei einbinden
<script language="javascript" src="handle.js"></script>
das formular könnte so aussehen
<form action="test.php" method="get"> <p> <select name="select1" onChange="sndReq()"> ... </p> </form>
sollte eigentlich funktionieren (zumindest in der Theorie ^^)
wenn du eine LineByLine-Erklärung haben willst sag bescheid...
Alternativ kannst du auch diverse Bücher, Openbooks oder Tutorials zum Thema AJAX und Co. zu Rate ziehen...
Das ganze kann man natürlich noch etwas erweitern, vereinfachen, aber das Grundgerüst sollte dürs erste reichen... und genug hast du trotzdem noch zu tun (die php-datei und die Verarbeitung der Daten ist deine Sache)
-
Vielen Dank für Deine Antwort.
Ich werde mir das einmal anschauen, sieht kompliziert aus.JA wie ich dort an den Inhalt komme sei dahingestellt. Es sei denn ich binde <script=Javascript> gleich in eine PHP-Datei mitein und verlinke dann anhand von POST und SWITCH mithilfe global Vars. Was meinst Du?
thx