AJAX vagyis AJAJ a Drupal hatosban

Majd két évvel ezelőtt jelent meg egy rövidke írásom, ami bemutatta, hogy AJAXos megoldással hogyan lehet dinamikusan legördülő listákat töltögetni. Elérkezett hát az idő, hogy elkészítsem a mintamodul hatos verzióját. Lényeges változások a menu hook függvényben, a űrlapot előállító függvényben és a JavaScript fájlban történtek. No meg természetesen az info fájlt is át kellett írni. Teszteljétek.

Házi Feladat:
A böngészők megjegyzik, ha egy lista valahogy ki volt választva (back gomb) ekkor a program hibásan működik, hisz a második listában olyan elemek vannak amik nem lehetnének. Oldjuk meg a problémát.

CsatolmányMéret
Package icon formproba.zip1.64 KB

Hozzászólások

Kipróbáltam, nem működött localhost-on. A js fájlban a JSON kérés feltételezi, hogy a webhely a webszerver gyökerében található. Az alábbi folt javítja:

  1. --- formproba.js.orig 2009-03-28 11:53:02.000000000 +0100
  2. +++ formproba.js 2009-03-29 13:21:56.000000000 +0200
  3. @@ -1,7 +1,7 @@
  4. // $Id$
  5. Drupal.behaviors.formprobaInit = function (){
  6. $('#edit-select1').change(function(){
  7. - $.getJSON("/",{q: 'formproba/data/' + $(this).val()}, function (data){
  8. + $.getJSON(Drupal.settings.basePath,{q: 'formproba/data/' + $(this).val()}, function (data){
  9. options = ''
  10. for(i in data){
  11. options += '<option value="' + i + '">' + data[i] + '</option>'

Köszi, javítottam.

pp

Hmm, ez erdekes. A kod alapjan azt vartam, hogy meg fog jelenni az "An illegal choice has been detected. Please contact the site administrator." mivel a form keszitesekor csak az alma, korte, barack van a masodik listaban. Tehat ha valami mast valasztok akkor ezt a hibat kellene kapnom, mivel a tobbi elemet js-el valtoztatod.
Szoval egy gyors debug, es azt latom, hogy a submitnal (gomb katt es *_submit kozott) a form ujraepul, tehat a masodik listat ujraszamolja mielott a validacio megtortenne.. De nem latok semmi extra kodot ami a form ujraepitest kerne, ezek szerint ezt a Drupal teszi meg, csak nem ertem miert..

Pedig ez egyszerű. A Drupal ilyen sorrendben hívogatja a függvényeket: formproba_form, formproba_form_validate (ez ugye nincsen), formproba_form_submit. Én a formproba_form függvényben adom vissza a formot de úgy, hogy ha jött adat, akkor a megfelelő listát töltöm be. Ugyan azt a listát, amit a kliens oldalon is töltögetem. A Drupal tehát pont olyan formot kap, mint amit én a kliens oldalon összekattintgattam. Lásd kódot:

  1. $form['select2'] = array(
  2. '#type' => 'select',
  3. '#title' => 'Második választás',
  4. '#options' => isset($form_state['post']['select1'])?formproba_get_select2($form_state['post']['select1']):formproba_get_select2(1),
  5. );

Picit átverem ugye a Drupalt de hát ez van.

Én sajnos viszont megkapom azt a hibaüzenetet, és nem tudom, hogy miért, mindent ugyanúgy csináltam. A különbség talán annyi, hogy nem szimpla formot küldök be, hanem nodet. Ha a probaformot használom, akkor az működik. Hogyan lehetne a hibaüzenettől megszabadulni, vagy esetleg kikapcsolni?

Légyszi a részletes kérdést a drupal.hu megfelelő fórumába tedd fel. Itt és ilyen formán nehéz lesz segíteni.

Köszi

pp

HF megoldás:

  1. --- formproba.js.orig 2009-03-29 13:47:52.000000000 +0200
  2. +++ formproba.js 2009-03-29 13:49:11.000000000 +0200
  3. @@ -8,5 +8,5 @@ Drupal.behaviors.formprobaInit = functio
  4. }
  5. $("#edit-select2").html(options)
  6. })
  7. - })
  8. + }).change();
  9. }

Akkor most már beírhatod az ötöst. Egyébként kerestek szegedi drupalos arcokat és ezt írtam rólad:
Zsemlye Ernő (több DUG-on is tartott előadást, meglátásom szerint jó drupalos szakember)

pp

Kedves István!

Köszönöm szépen a munkádat. Sokat segítettél ilyen kezdő embereknek is, mint én.
Lenne egy kérdésem:
Tanulás gyanánt belefejlesztettem a function formproba_get_select2($id) függvénybe. Majdnem jól működik, csak az a baj vele, hogy az alapértelmezett az 1-es id-vel készíti el a SELECTET.
Pl kilistázom a városokat. 1 Budapest, 2 Debrecen. Akkor a függvény Debrecenre hajtódik végre. Tehát nekem a tömb feltöltése 0 indexel kezdődik azért lehet a baj. Kérdésem az lenne, hogy hogyan tudom befolyásolni azt, hogy a 0 indexel működjön a SELECT?
Köszönöm szépen.

A Pasquallenak írt válaszom kódjának 4. sora végén ne 1 legyen a függvény paramétere, hanem 0.

pp

Köszönöm szépen a gyors válaszod. Természetesen ezt megtettem, ez volt az első. Ekkor a következő figyelmeztetést adja:

warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\xampp\drupal-6.9\includes\form.inc on line 1420.

Ekkor igaz, hogy a nekem az első város lesz az alapértelmezett. De továbbra is a második városra fut le feltöltés.
Valami miatt nem úgy adja nekem vissza a paramétereket. Holott az adatbázisba Budapest ID 1-es, Debrecen 2-es (ehhez nincs is hozzárendelve semmi se)
Ha az adatbázisba átírom, hogy a VID (város azonosító) Budapestre 0-a, akkor jó műkszik. Eltünik a figyelmeztetés is.

function formproba_get_select2($id) {
$queryResults = db_query("SELECT DISTINCT KER FROM kozteruletek.kozterulet WHERE 1 AND VID= '$id' ORDER BY KER");
while($line = db_fetch_object($queryResults))
{
$keruletek[]= $line->KER;

};

if (empty ($keruletek)){
return false;
}
else
return $keruletek;
}

Több ponton is hibás a kódod!
Miért nem kéred le a vid értéket is?
Miért nem írsz normális Drupal szabványnak megfelelő SQL mondatot?
Miért nem használod a vid-et tömb indexként? (honnan tudná szerencsétlen Drupal mi az index, ha nem adod át neki? :D )

  1. function formproba_get_select2($id) {
  2. $queryResults = db_query("SELECT DISTINCT vid, ker FROM {kozterulet} WHERE 1 AND vid= '%s' ORDER BY ker", array($id));
  3.  
  4. $keruletek = array();
  5.  
  6. while ($line = db_fetch_object($queryResults)) {
  7. $keruletek[$link->vid]= $line->ker;
  8. }
  9.  
  10. if (empty ($keruletek)) {
  11. return false;
  12. }
  13. else {
  14. return $keruletek;
  15. }
  16. }

Köszönöm szépen a válaszod!
Még kezdő vagyok, szabad időmben foglalkozom a Drupallal.
Jó a kód, amit küldtél, csak a $link helyett $line kell, szerintem.
Az érdekelne engem, hogy a multiselect hogyan működik? Tehát, ha 2 vagy több kerületet választok ki, akkor, hogy tudom megjeleníteni a hozzá tartozó utcákat? Erre tudnál valami támpontot adni, hogy hogyan induljak el. Köszönöm szépen!

Kedves István!

Lenne még egy kérdésem. Azt szeretném megtudni, hogy a javascript-et hogyan lehet úgy átírni, hogy nem az adott SELECT-ben levő elemek indexét adja vissza, hanem magam az értékét? Sajnos nem látom sehol. Tehát, ha kiválasztok egy elemet a listából, akkor a script ezt az elemet (stringet) adja át a function formproba_data($id) függvénynek.
Köszönöm szépen a segítséget.

Erre ugye nincs szükség, ha a fenti hozzászólásomat elolvasod. Az a gond, hogy nem adod át az azonosítókat ezért kapod azt vissza, hogy az adott elem hányadik a sorban. (amivel ugye nem tudsz mit kezdeni.)

pp

Sziasztok
Arra rájöttem hogy a javascriptben a this.val()-el visszatudom kapni, a kiválasztott elemeket. Ide kellene egy ciklus, amin a javascript JSON részét lefuttatja a megfelelő értékkel. Arra kérnék segítséget, hogy hol lehet megnézni azt, hogy a this-nek milyen függvényei vannak? Ki szeretném nyerni hány elem van benne és ciklusban lefuttatni a JSON részt. Ha tudna valaki ebben segíteni azt is megköszönném.

Elvileg van this.length - ami elvileg visszaadja az elemeinek számát. De hogy konkrétan nálad mi is ez a this, azt meg tudod nézni pl. egy firebuggal.

Szia!

szeretném megcsinálni ugyanezt, csak hook_form_alter-rel, ekkor viszont a

  1. $form['select2'] = array(
  2. '#type' => 'select',
  3. '#title' => 'Második választás',
  4. '#options' => isset($form_state['post']['select1'])?formproba_get_select2($form_state['post']['select1']):formproba_get_select2(1),
  5. );

#options részének első feltétele mintha soha nem lenne igaz, így a "Nem érvényes választást talált a rendszer." hibaüzenetet kapom. Elképzelhető, hogy ebben az esetben nem a hook_form_alter-be kellene írni ezt az ellenőrzést, hanem valamilyen validáló függvénybe?

Válaszodat előre is köszönöm.

Új hozzászólás