Also gut.... Meine Lösung funktioniert soweit ich weiß ausschließlich im Google Chrome.
Code:
function combobox_filtered ($tabelle, $spalte, $id_selected, $spalte_filter, $filterkriterium, $feldname, $listenname, $feldgroesse=30, $url_basiclevel="", $function_to_run="") {
// Der 1. Teil schafft die Liste für das Drop-Down-Menu und fügt einen Inhalt in das Textfeld ein
$mysqli=MyDatabase();
$abfrage = "SELECT * FROM `$tabelle` WHERE `$spalte_filter`='$filterkriterium' ORDER BY `$spalte` ASC";
$abfrage2 = "SELECT * FROM `$tabelle` WHERE `ID`='$id_selected'";
// Prüfung, ob bereits ein Inhalt ausgewählt ist
if ($result = $mysqli->query($abfrage2)) {
while ($row = $result->fetch_object()) {
$inhalt = $row->$spalte;
}
}
else {
$inhalt = "";
}
echo '<input name="auswahl_'.$feldname.'" id="auswahl_'.$feldname.'" value="'.$inhalt.'" list="'.$listenname.'"
onblur="f_dropdown_id_eintragen(\'auswahl_'.$feldname.'\', \''.$feldname.'\', \''.$tabelle.'\', \''.$spalte.'\', \''.$url_basiclevel.'\', \''.$function_to_run.'\')">
<datalist id="'.$listenname.'">';
if ($result = $mysqli->query($abfrage)) {
while ($row = $result->fetch_object()) {
$inhalt = $row->$spalte;
echo '<option value="'.$inhalt.'">';
}
}
echo '</datalist>';
// Nun wird ein unsichtbares Feld geschaffen, in welches die ID des ausgewählten Datensatzes eingetragen wird
echo '<input name="'.$feldname.'" id="'.$feldname.'" type="hidden" value="'.$id_selected.'">';
}
Das ganze bedient sich des HTML-Tags "datalist", welches aber unglücklicherweise nicht von allen Browsern unterstützt wird. Freue mich natürlich über jede Verbesserung dieser Funktion.
Fangen wir von vorne an:
$tabelle - versteht sich von selbst was die Funktion hier erwartet, gell?
$spalte - Spalte in der die Einträge des Combofelds sind
$id_selected - Wenn bereits beim Bilden des Combofelds ein Listeninhalt im Feld sein soll, wird hier die ID des Eintrags angegeben (setzt in der Datenbanktabelle eine Spalte ID voraus).
$spalte_filter - ich filtere z.B. danach, ob ein Element in der Tabelle in der Spalte 'aktiv' 0 oder 1 stehen hat. Hier gebe ich also 'aktiv' an - den Namen der Spalte, wo das Filterkriterium ist
$feldname - In meinen Anwendungen soll nicht der Inhalt der Combobox über das Fortmular weitergegeben werden, sondern die ID des in der Combobox erscheinenden Eintrags. Hierfür wird direkt neben der Combobox ein unsichtbares Feld geschaffen welches die ID beinhaltet. Es bekommt den hier angegebenen Namen.
$listenname - der wird benötigt für den Tag <datalist>.
$feldgroesse - versteht sich zwar von selbst, funktioniert aber irgendwie ohnehin nicht. :-) Vllt. findet jnd. von euch den Fehler
$url_basiclevel - die Variable beinhaltet den Bezug der Seite, deren Code ich gerade schreibe, zum Anfangsniveau, zum "HTML" Ordner deines Webservers. Wenn ich also auf
www.meine-seite.de einen Ordner habe und in diesem Ordner eine Datei habe deren Code ich jetzt schreibe, muss ich zum "Anfangsniveau" ein mal zurück, dann ist $url_basiclevel eben "../". Befinde ich mich auf dem "Grundniveau", ist es "". Etwas verwirrend?... Kann sein, sorry!
$function_to_run - wenn ich möchte, dass eine JS-Funktion läuft, sobald ich das Feld verlasse, wird hier deren Name eingetragen.
Diese PHP-Funktion benötigt zum Laufen noch folgende JS-Funktion:
Code:
function f_dropdown_id_eintragen(inputfeld, hiddenfeld, tabelle, spalte, url_basiclevel, function_to_run) {
inhalt = document.getElementById(inputfeld).value;
mein_link = url_basiclevel+"abrechnung/AJAX_REQUESTS.php?aktion=dropdown&inhalt="+inhalt+"&hiddenfeld="+hiddenfeld+"&tabelle="+tabelle+"&spalte="+spalte+"&function_to_run="+function_to_run;
resOb = erzXHRObjekt();
resOb.open('get', mein_link, false)
resOb.onreadystatechange = f_dropdown_id_eintragen_AJAX;
resOb.send(null);
}
function f_dropdown_id_eintragen_AJAX() {
if (resOb.readyState == 4) {
myArray=new Array;
myText=resOb.responseText;
myArray=myText.split(";");
id = myArray[0];
hiddenfeld = myArray[1];
function_to_run = myArray[2];
document.getElementById(hiddenfeld).value = id;
// Jetzt muss geprueft werden, ob der Eintrag im Feld einem Element aus der Liste entspricht
if (id < 1) {
document.getElementById("auswahl_" + hiddenfeld).style.backgroundColor="tomato";
alert("Der Eintrag entspricht keinem Element aus der Liste");
}
else {
document.getElementById("auswahl_" + hiddenfeld).style.backgroundColor="honeydew";
// Wenn der Eintrag gültig ist, werden evtl. verschiedene Funktionen gestartet:
if (function_to_run == "f_beratung_dokumentation_open") {
f_beratung_dokumentation_open();
}
}
}
}
In der Funktion f_dropdown_id_eintragen_AJAX() werden im unteren Teil (ab "// Wenn der Eintrag gültig ist, werden evtl. verschiedene Funktionen gestartet:") die Aufrufe der Funktionen gestartet, deren Name über die Variable $function_to_run an die ursprüngliche PHP-Funktion übergeben wurde.
Der Link "mein_link" in f_dropdown_id_eintragen() muss natürlich auch angepasst werden.
Der Teil PHP-Teil, an den sich AJAX wendet, ist hier:
Code:
if ($aktion == "dropdown") {
$inhalt = GetMyVar("inhalt","");
$tabelle = GetMyVar("tabelle","");
$spalte = GetMyVar("spalte","");
$hiddenfeld = GetMyVar("hiddenfeld","");
$function_to_run = GetMyVar("function_to_run","");
$id = gesuchtes_feld($inhalt, $tabelle, $spalte, "ID");
echo "$id;$hiddenfeld;$function_to_run";
}
Meine PHP-Funktion GetMyVar() kann natürlich hier mit $_GET[""] ersetzt werden. Der Vollständigkeit halber aber auch diese Funktion:
Code:
function GetMyVar($x,$leer) {
if (isset($_GET["$x"])) {
$myVar=$_GET["$x"];
}
else {
if (isset($leer)) {
$myVar=$leer;
}
else {
$myVar="";
}
}
return $myVar;
}
Die benutze ich nur, um keine Fehlermeldungen zu bekommen, wenn $_GET nach einem Wert fragt, der gar nicht übergeben wurde.
Ich weiß, ist etwas viel und wahrscheinlich schreiben gleich paar Kollegen, dass es womöglich kein schöner Programmierstil etc ist :-))), ich bin eben noch ein Anfänger. Falls ich etwas vergessen haben sollte und das ganze nicht läuft, meldet euch.