jQuery-nek hívják a barátom?

nagygdev képe

Készítenék egy saját adatbázist, Drupalos környezetben. Nem modulok segítségével (CCK, Views, stb.), hanem klasszikus módon. Az adatbázis nagy, struktúrája összetett.

Az elgondolás: pl. a felhasználó beírja az irányítószámot, a script pedig AJAX-on keresztül a saját táblámból beírja a település nevét a következő mezőbe. Illetve szeretnék különböző összetett SQL lekérdezésekkel adatokat kinyerni a tábláimból, szintén AJAX megoldással. Számomra csak a POST eljárás a járható csatorna, és az XML forma a kívánatos válaszformátum.

A kérdésem: magam készítsek egyedi AJAX motort, hogy akár összetett SQL lekérdezést is futtatni tudjak, vagy a jQuery a leendő barátom, mert van benne előre elkészített lehetőség, csak használni kellene.

A saját AJAX motorommal ott akadtam meg, hogy a dolog a Drupal nélküli, Windows alapon localhost-ra telepített Apache2-PHP5-MySQL5 tesztkörnyezetben POST-on keresztül gyönyörűen megy (a megoldást az "application/x-www-form-urlencoded" mime típus hozzáadása jelentette az Apache konfigurációs fájljában), de a Linux alapú, ugyanilyen környezetben, Drupal oldalban felhasználva a scriptjeimet hiába adom meg a mime típust, nem boldogulok. (GET-tel megy, csak az nekem nem jó.)

Előre is köszönöm a kedves válaszokat.

nagygdev képe

Illetve természetesen a kérdés valódi lényege: van-e olyan PHP motor a Drupalban, ami a lekérdezést és a válasz továbbítását elvégzi - mert a jQuery biztosan ad csatlakozási pontot.

0
0
Illyés Edit képe

Nézd meg pl. a címkézést, vagy bármilyen autocomplete mezőt.

0
0
nagygdev képe

Vajon ezt a hívást melyik PHP kapja el?
(autocomplate.js -> Drupal.ACDB.prototype.search)

    // Ajax GET request for autocompletion
    $.ajax({
      type: "GET",
      url: db.uri +'/'+ Drupal.encodeURIComponent(searchString),
      success: function (data) {
0
0
snufkin képe

ez egy menu callbacknak megy, nem kell neki kulon php, eleg beregisztralni a hook_menube egy MENU_CALLBACK-et, es kesz.

0
0
Illyés Edit képe

Meg kell egy kicsit gányolgatni a page.tpl.php-ben, hogy a csupasz tartalmat adja vissza, ne a template-tel körített teljes oldalt. Talán a D7-ben meg lesz oldva.

0
0
snufkin képe

nem kell, siman print drupal_to_js($output); es exit(). sot, akar meg form-ot is lehet dinamikusan generalni kis trukkel drupal 5 alatt.

0
0
Illyés Edit képe

Hát elvileg még a drupal_to_js() sem kell, printelhet közvetlenül XML-be, ha azt szeretné visszakapni, ahogy írja.

Mondjuk én abból indultam ki, hogy azért használ Drupalt, mert nem csak olvasni hanem kezelni is akarja az adatbázist Drupal segítségével. A külső adatbázisból származó adatokat menti valahová, valamilyen mezőkbe, amiket nem akar CCK-val kezelni – akkor gondolom sok kis node típusa van, és átmenetileg azokban tárolja az adatokat, akkor viszont belefut a node_page_default()-ba. De lehet, hogy teljesen más a feladat, több infó kellene.

0
0
nagygdev képe

A Drupallal nem kezelném az adatokat, ha nem muszáj - bár lehet, hogy ésszerűbb lenne - igaz, a biztonság itt nem számít, mert az adatfelviteli űrlap nem nyilvános (csak belépett családtagok láthatják, szóval nem kell injection-tól tartani), a kapcsolat SSL-lel védett, illetve az adatbázis nem fogad el mástól, csak a localhosttól érkező kéréseket.

Az űrlap adatai közvetlen utaznak az adattábláimba. Az adattábláimat az egyszerűség kedvéért külön adatbázisba helyeztem, hogy ne keveredjenek a Drupaléval, de nem lenne nagy gond a közös adatbázis sem, legfeljebb előtagot használok a táblaneveknél. Ahogy az adatbázis absztrakciós réteget nézem, lehet, hogy az utóbbi megoldás az egyszerűbb.

Mivel a Drupal felszín alatti világát - code-korallok, halacskAPI-k ;) - most feldezem fel, egy icipici iránytűmég kéne, vagyis merre induljon az adatom:

Űrlap vezérlőelem tartalom --> elfogja egy beregisztrált eseménykezelő, mondjuk onChange-nél (De melyik? Egy saját gyártmány?) --> átadja a megfelelő - általam dinamikusan gyártott - SQL-kéréssel egy motornak --> a PHP motor végrehajtja az SQL-t a saját tábláimon --> a választ visszakapom XML-ben --> majd azzal a saját JS kódom a megfelelőt teszi (feltölt vele egy mezőt, vagy egy select-et, megjeleníti őket egy dinamikus div-ben plusz információként, stb.), amit - gondolom - mint "onreadystatehange"-szerű eseményt a kéréskor beállítottam.

Ehhez hasonló folyamatot várnék, de valamiért az a megérzésem, más lesz a megoldás. Vagy tévedek?

0
0
snufkin képe

jo volna kicsit tobbet tudni az adatstrukturarol, ez igy elegge vaktaban tanacsadas.

viszont par tipp, ami igy elsore lejott a kommentedet olvasva: ha mar Drupal, akkor hasznalj jQuery-t, nezd meg, hogy az ilyen AJAX-os csodamodulok, mint nodereference hogyan tolti be magat, csatlakozik az adott form elemekre.

XML helyett esetleg JSON-t erdemes megfontolnod, valamit ha Drupal kozeli megoldast keresel, akkor ajanlom a Services + json_server modulokat.

0
0
nagygdev képe

No, most egy kicsit elmegyek felderítő útra, a nodereference kódtengerre... :)

Addig is a több info (a példa kedvéért egyszerűsítek, ettől tűnik kicsit bugyutának :). Tudom, ezt a példát meg lehet csinálni CCK-val is, de a tényleges adatstruktúra jóval összetettebb és szerteágazóbb.

A Drupal adatbázisának a neve: familia
A sajat adatbázisom neve: csalad

Telepulesek - tábla (törzs adatok):
irsz, telepulesnev

Szemelyek - tábla (törzs adatok):
id(kulcs, numerikus), keresztnev, vezeteknev

Cimek - tábla (mozgás adatok):
id(idegen kulcs: személyek), tipus(idegen kulcs: CimTipusok), irsz, telepules, cim

CimTipusok - tábla (törzs adatok):
tipus(kulcs, numerikus), elnevezes (ide kerülnek: lakcím, postacím, ideiglenes lakcím, stb.)

Kontaktok - tábla (mozgás adatok):
id(idegen kulcs: személyek), tipus(idegen kulcs: KontaktTipusok), cim

KontaktTipusok - tábla (törzs adatok):
tipus(kulcs, numerikus), elnevezes (ide kerülnek: telefon, mobil, e-mail, stb.)

Az adatfelviteli űrlapon megjelenő elemek:
Mezők:
- Vezetéknév, Keresztnév
- Cím típusa (select - az elnevezések látszanak, nem a típusok), Irsz. (select), Település (select), Cím, "Hozzáadás" gomb (a címet adja hozzá)
- Egy div elem a már felvitt címek megjelenítéséhez
- Kontakt típusa (select), Kontakt címe, "Hozzáadás" gomb (a kontaktot adja hozzá)
- Egy div elem a már felvitt kontakt adatok megjelenítéséhez

1. Ha új személy adatait viszem fel, a személy ID-je automatikusan növekszik majd az új rekord hozzáadásakor.
2. Amikor beírom az irányítószámot, szeretném, hogy ez alapján az a település neve bekerüljön a Település mezőbe egy AJAX lekérdezéssel.
3. Amikor a címet írom be, majd kattintok a Hozzáad gombra, szépen megjelenik az alatta lévő div elemben a cím, a mezők pedig kiürülnek az új adat felviteléhez. (A Kontakt adatok dettó így működnek.)
4. Ha szerkesztésre használom az űrlapot (pl. úgy érkezek ide egy másik oldalról, hogy az űrlap megkapja a személy ID-jét GET-tel az URL-ben), betölti a vezetéknevet, keresztnevet, a div tagokba pedig az eddig felvitt címeket és kontaktokat.
5. Ha átírom a nevet, (onChange) módosítja azt az adatbázisban kérdezés nélkül.
6. A többi mezővel pedig tudok új cím és kontakt adatokat hozzáadni az eddigiekhez.
Mindezeket az oldal újratöltése nélkül!!! (AJAX)

A lényeg: ezeket Drupal nélkül, klasszikus módon már megvalósítottam, működik az egész. Drupal alatt viszont nem megy a POST metódus (lásd fentebb), ha saját AJAX motort használok. Ezért gondoltam, hogy a Drupalnak biztos van saját motorja (jQuery + egy PHP-s fogadó oldal), így a html oldalaim body részét egyszerűen átemelem egy Drupal oldalba, importálom a saját JS kódkészletemet ahol kell, és átírom azt a részt jQuery kompatíbilisre, ami a saját AJAX motort valósítja meg, illetve kihagyom a dologból a saját PHP-oldali AJAX "fogadóbizottságot".

;) need more?

0
0
snufkin képe

nos hat ez mind megoldhato, sajat php fogado oldal helyett a hook_menu segitsegevel kesziteni kell egy MENU_CALLBACK-et, a megadott path lesz a cim, amit a jQuery scriptbol hivni kell majd.

pelda jQuery post request-re:

function jquery_post_menu($may_cache) {
  $items = array();
  $items[] = array(
    'path' => 'jquery_post',
    'callback' => 'jquery_post_page',
    'type' => MENU_CALLBACK,
    'access' => TRUE,
    );
  return $items;
}
 
function jquery_post_page() {
  if(!empty($_POST)) {
    print_r($_POST);
  }
  else {
    echo "Empty \$_POST";
  }
}

jQuery call: $.post('http://d/5/s/jquery_post', {string: "test string"});

ha firebuggal leteszteled, akkor eleg a fentit berakni egy modulba, a JS kodot meg konzolon lefuttatod, es elvileg (nalam legalabbis mukodik) a response-ba megjelenik a test string (persze az URL-t at kell irnod).

0
0
nagygdev képe

Szépen elindul a POST. :)

De hova jön itt az adatbázis kiválasztása, illetve az SQL-em? (Bocsánat, ha tudnom kellene, de eddig még nem jutottam el a kutatásban.)

0
0
snufkin képe

hat a callback fuggvenybe pakolod bele a sajat query-jeidet. a peldaban a callback fuggveny a jquery_post_page, ez az elejen a hook_menu-ben van definialva

0
0
nagygdev képe

:O A Service screencastokat nézegeve úgy látom ez itt a "Mariana árok". Olyan lehetőségeket nyit meg, miről álmodni sem nagyon mert az ember fia. ;) Sok új barátom lesz, úgy látom...

0
0
snufkin képe

jah csak kicsit egyszerubb a valtozokonvertalas, mint az xml-t manualisan osszerakni, aztan JS-ben parzolgatni (ok, csak egy find(), de meg igy is egyszerubb). mindegy, ezt csak arra irtam, hogy a template bezavarna.

Azt nem ertem, hogy a node_page_default()-ba hogyan fut bele. Ha sajat adatstrukturaja van, akkor custom tablakba menti, a node-ok, akkor meg callback segitsegevel drupal_execute() es letrehozza a node-okat az API-n keresztul. Legalabb is igy elsore en igy csinalnam.

0
0
nagygdev képe

Szívesen lemondok az XML-ről, ha kell, nem gond.

Jól értem az elgondolásod, hogy node-ként jönne vissza a lekérdezés eredménye, amit a JS scriptem szétszedeget a használathoz?

0
0
snufkin képe

nem tudom mi a terved, ha node-kent akarod az informaciot tarolni, akkor valoszinuleg. ha csak nehany resze kell vissza a node-nak, mint pl body, vagy egyeb, akkor nem kell az egesz object-et visszatolni...

de ehhez tenyleg jo volna tudni mit is akarsz csinalni

0
0