[gelöst] jQuery - SQL-Abfrage nach der Dropdown-Auswahl
am 08.11.2010 - 11:56 Uhr in
hallo,
ich habe ein Formular erstellt, wo die Besucher verschiedene CCK-Felder ausfüllen und das Formular abschicken sollen. In dem Formular habe ich auch ein Dropdown-Feld wo die Besucher einen der Werte auswählen können.
Ich möchte irgendwie erreichen, dass je nach der Dropdown-Auswahl, sämtliche Formularfelder sich automatisch mit den Werten aus der DB befüllen.
Ich glaube, so etwas könnte man mit jQuery lösen, oder? Kann mir jemand bitte kurz erklären (am besten auch mit einem kleinem Beispiel) wie man so etwas anlegt.
Vielen vielen dank!!!
Das Formular ist eigentlich ein node/add was ich in einer datentyp-node-form.tpl.php Datei angepasst habe.
//das Dropdown-Feld ist z.B.
<?php print drupal_render($form['field_auto_auswahl']); ?>
//und das Feld was aus der DB ausgefüllt werden sollte ist z.B.
<?php print drupal_render($form['field_km_aktuell']); ?>- Anmelden oder Registrieren um Kommentare zu schreiben

ich habe jetzt folgenden
am 08.11.2010 - 15:35 Uhr
ich habe jetzt folgenden jQuery-Code geschrieben, der nach einer Dropdown-Änderung eine externe dropdown.php aufrufen sollte und mir auch die Daten zurück liefern sollte.
$(document).ready(function(){$("#my_dropdown_field").change(function(){
$.get("dropdown.php", function(data){
alert("Data Loaded: " + data);
});
});
});
Aufruf der Funktion funktioniert prima, die Datei dropdown.php wird auch geladen.
Nun, in dropdown.php habe ich eine DB-Anfrage geschrieben, die mir z.B MAX einer Spalte der Tabelle zurück liefern sollte. Diese funktioniert leider nicht, da ich mich vermutlich hier ernuet an die DB anmelden sollte..... da die Datei dropdown.php nicht direkt vom Core geladen wurde sondern von einem externen Script...
<?php$result = db_query_range('SELECT bla bla bla);
echo $wert = db_fetch_array($result);
?>
Jetzt stehe ich echt im Wald und weiß nicht mehr weiter.... Ich bin mir sicher dass jemand von euch ähnliches Problem hatte und dieses auch gelöst hat.
Ich möchte nicht unbedingt auch in dieser "externen" dropdown.php Datei SQL-Zugangsdaten wiederholen....
Wie komme ich weiter? Wie lade ich die Daten aus der Datenbank in diesem Fall richtig?
Ich glaube, man könnte sogar ein Tutorial draus machen, falls es so funktionieren würde. Ich bin mir sicher, dass einige so etwas brauchen könnten...
Der Drupalweg dazu liegt in
am 08.11.2010 - 15:55 Uhr
Der Drupalweg dazu liegt in einem Minimodul. Du registrierst mit hook_menu einen URL auf Deiner Seite, hinter dem dann Deine Dropdown-Funktion steckt. Da das dann über Drupal passiert, sollte der Code, wie oben von Dir gezeigt, die gewünschten Resultate bringen.
Beste Grüße
Werner
wla schrieb Der Drupalweg
am 08.11.2010 - 16:15 Uhr
Der Drupalweg dazu liegt in einem Minimodul. Du registrierst mit hook_menu einen URL auf Deiner Seite, hinter dem dann Deine Dropdown-Funktion steckt. Da das dann über Drupal passiert, sollte der Code, wie oben von Dir gezeigt, die gewünschten Resultate bringen.
also,
ich brauche ein Minimodul das Hook_menu Funktion beinhaltet...
und wie ruft hook_menu meine externe php-Datei? Wie sieht so etwas aus? kannst Du mir bitte ein Beispiel schreiben?
ah ja, und wie verbinde ich es dann mit meinem jQuery-Script?
Danke
Wie wäre es, wenn Du erst mal
am 08.11.2010 - 17:11 Uhr
Wie wäre es, wenn Du erst mal die Dokumentation zu hook_menu liest? Da sind auch Beispiele dabei.
Mit hook_menu verknüpfst Du einen URL in Drupal mit einer eigenen Funktion in Deinem Minimodul und integrierst da das bisher externe PHP-Script und die Datenbankabfrage.
Beste Grüße
Werner
ja , ich mach es gerade. nur
am 08.11.2010 - 20:11 Uhr
ja , ich mach es gerade. nur ich finde (oder übersehe es) wo und wie binde ich mein jQuery ein ...
Hier mal ein Beispiel für die
am 08.11.2010 - 21:18 Uhr
Hier mal ein Beispiel für die Registrierung eines Pfades:
<?php
function mini_modul_menu() {
$items['mein_pfad/%'] = array(
// alle dürften den pfad erreichen
'access arguments' => array('access content'),
// übergebe argument, also das nach "mein_pfad/" an den seitentitel
'title arguments' => array(1),
// rufe meine untere funktion auf
'page callback' => 'meine_funktion'
);
return $items;
}
// die funktion, die ich mit dem obigen aufrufe - hier kann ich die drupal eigenen mysql-methoden nutzen
function meine_funktion($argument = '') {
return check_plain($argument);
}
?>
ihr redet über hook_menu und
am 08.11.2010 - 22:01 Uhr
ihr redet über hook_menu und ich verstehe es einfach nicht....
hook_menu benutzt man wenn man z.B eigenen Menupunkt einfügen möchte oder das ganze Menü anpassen möchte....
oder?
wie kann dann hook_menu für mein Problem mit einem Dropdown gut sein?
Mein Pfad in dem Fall ist /node/add/meininhalt
wozu brauche ich hier ein Callback?
;-( es wird mir langsam schwindelig
trotzdem, vielen Dank für euere Hilfe !!! 5 ***** Sterne
hook_menu wird bei Drupal
am 08.11.2010 - 22:18 Uhr
hook_menu wird bei Drupal auch dazu benutzt, einen Pfad zu registrieren.
Du kannst in deinem Theme die Datenbankmethoden von Drupal dazu benutzen, um Datensätze aus der MySQL-DB zu holen:
<?php$rez = db_query('SELECT name FROM `users` WHERE `uid` = %s', $res->uid);
$res = db_fetch_object($rez);
?>
Nach Möglichkeit sollte der PHP-Teil möglichst in ein Modul ausgelagert werden. Der Ordnung halber. Aber wenn es bei wenigen Zeilen bleibt, kannst es so machen.
Hook_menu benutzt man, wenn
am 08.11.2010 - 22:21 Uhr
Hook_menu benutzt man, wenn man eine URL in Drupal registrieren möchte, die eine Funktion aufruft. Ob das tatsächlich in einem Menü passiert ist nicht gesagt. Diese URL kann jetzt von Deinem jQuery Script anstelle von dropdown.php aufgerufen werden und liefert die Ergebnisse der dabei aufgerufenen Funktion an das jQuery-Script zurück. Dabei kannst Du dann auch, da sich die Funktion in einem Modul und damit innerhalb von Drupal befindet, die Datenbank Routinen von Drupal benutzen, ohne eine eigene Validierung zur Datenbank aufzubauen.
Ich gebe zu, es dauert ein wenig, bis man diese Verfahrensweise verinnnerlicht hat, aber dann ist es einfach logisch.
Beste Grüße
Werner
so, ich habe den hook_menu()
am 11.11.2010 - 09:49 Uhr
so, ich habe den hook_menu() implementiert, die passende (probe) Funktion geschrieben, und wenn ich es über Menüpunkt oder URL ausführe, bekomme ich in meinem Fall auch eine blanke Seite mit dem ausgegebenen Wert! also das funktioniert wunderbar soweit. (PS danke für die Erklärung über hook_menu())
MINIMODUL mit HOOK_MENU
function jquery_funkcije_menu() {
$items = array();
$items['ajax/%']= array(
'title' => t('AJAX'),
'type' => MENU_CALLBACK,
'page callback' => 'jquery_funkcije_callback_ajax',
'access arguments' => array('access content'),
);
return $items;
}
function jquery_funkcije_callback_ajax() {
echo "blablbalba";
die;
}
So,
wenn ich es aber mit jQuery aufrufen möchte (Dropdown - change) dann gibt mir mein ALERT den ganzen Seitencode als HTML zurück!!
jQuery ,
$(document).ready(function(){$('#edit-field-referenca-auto-nid-nid').change(function(){
$.ajax({
url: 'ajax/test.html',
success: function(data) {
$('.result').html(data);
alert('Load was performed.' + data);
}
});
});
});
HILFE !!! wieso bringt er mir den kompletten Seitencode zurück, ich möchte nur meine Ausgabe "blalbalba" haben.... (das was ich in der jquery_funkcije_callback_ajax() ausgebe....
Ich vermute mal, der Aufruf
am 11.11.2010 - 11:13 Uhr
Ich vermute mal, der Aufruf aus jQuery ist nicht korrekt. Du hast zwar brav das Beispiel von der jQuery -Seite abgeschrieben, aber das paßt nicht zu Deiner Struktur. Der Aufruf, so wie Du ihn in jQuery implementiert hast, geht auf "aktuellepage/ajax/test.html". Das erscheint mir falsch zu sein.
Was Du siehst ist vermutlich eine Fehlerseite von Drupal. Setze bei der Url den korrekten Aufruf einschließlich der Domain rein (ob mit oder ohne http:// davor mußt Du testen), aber dann sollte es gehen.
Beste Grüße
Werner
wla, danke vielmals!!! ich
am 11.11.2010 - 12:14 Uhr
wla,
danke vielmals!!! ich habe echt jetzt schon 20-30 jQuery-Beispiele getestet und angepasst, (und zwar nicht nur nicht nur $.ajax, sondern load(), $.get, $.post...)
und ich habe immer diesen Fehler zurückbekommen.
Jetzt wenn ich die absolute URL nehme, dann funktioniert es einfach tadellos...
Was mich jetzt verunsichert; in jedem jQuery-Beispiel was ich gefunden habe, war immer eine relative URL im Einsatz. Wieso funktioniert bei mir nur ausschließlich wenn ich absolute URL nehme?!
sorry, jetzt geht...
obwohl ich mit HTML seit 1998 beschäftigt bin (oh je, es sind schon 12 Jahre her) habe ich einen Anfängerfehler gemacht...
wie man einen URL-Pfad in HTML zusammen stellt, sollte man auswendig wissen....;-)
alle jQuery-Beispiele die ich durchgemacht habe, haben einen einfachen URL-Pfad gehabt, den ich immer wieder fleißig kopiert habe, obwohl bei mir gar nicht gepasst hat....
Danke Werner, dein Tipp mit der falschen URL war richtig Gold wert.. Ich wollte schon wieder was neues ausprobieren (json), obwohl ich die Lösung schon gestern hatte......
So, jetzt muss ich den jQuery-Script so anpassen, dass er mit die richtige Werte aus der DB zurück liefert. Also, die Werte sollen aus der DB kommen, abhängig davon was im Dropdown ausgewählt wird, Ich vermute mal, (korrigiere mich mal falls ich Unrecht habe), dass ich für so ein jQuery-Callback $.post benötige.... oder würde das auch mit $.get gehen?
Danke Dir nochmal!
Ich vermute jetzt (da habe
am 11.11.2010 - 12:22 Uhr
Ich vermute jetzt (da habe ich noch wenig selber getested), daß beides geht. Ich habe bisher nur $.load genutzt.
Wenn Du diesen Thead als gelöst betrachtest, bitte im ersten Titel ein [gelöst] davor setzen.
Beste Grüße
Werner
ich schließe es sobald ich es
am 12.11.2010 - 10:14 Uhr
also, für alle Themenverfolger die auch das funktionierende Ergebnis interessiert.
Aufgabe: Mittels Dropdown-Select Werte aus der Datenbank auslesen und auf der Seite aktualisieren
Workaround: ein Minimodul das mittels hook_menu() einen Pfad bereitstellt, wodurch ein jQuery-Script externe Berechnung anstoßen kann.
Minimodul:
/**
* Implementation of hook_menu().
*/
function minimodul_menu() {
$items = array();
$items['ajax/%']= array(
'title' => t('AJAX'),
'type' => MENU_CALLBACK,
'page callback' => 'minimodul_callback_ajax',
'access arguments' => array('access content'),
);
return $items;
}
function minimodul_callback_ajax() {
$id= $_GET['id'];
$wert = db_result(db_query('SELECT ANFRAGE WHERE ARGUMENT=%s',$id));
// gibt den Wert an das jQuery zurück
print $wert;
die;
}
jQuery Script habe ich in die bestehende script.js Datei eingebaut (Theme-Ordner)
und diese wird per default aufgerufen
$(document).ready(function(){
$('#mydropdown').change(function() {
var mydropdownvalue = $("#mydropdown").val();
$.get('ajax/test.html', {id: mydropdownvalue}, function(output) {
$('#result').html(output).show();
});
});
});
mydropdownvalue -> hiermit wird der momentane Dropdown-Menu Wert (selected) ausgelesen und an GET abgegeben
#mydropdown -> selektor ID von meinem Dropdown Menü auf der Seite
#result -> DIV mit dem ID result auf der Ziel-Seite, wo das Ergebnis der Anfrage (Resultat) ausgegeben wird
Der Aufruf der ganzen Funktion geht über den Pfad (oder einen Button) der auf die
http://meinedrupal-seite/ajax/irgendwas.html
erfolgt. Das wird im Minimodul, hook_menu() in dieser Zeile definiert:
$items['ajax/%']= array(so, das war schon.
Viel Spass damit