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.
Pontosítás
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.
címkézés
Nézd meg pl. a címkézést, vagy bármilyen autocomplete mezőt.
Vajon ezt a hívást melyik PHP
Vajon ezt a hívást melyik PHP kapja el?
(autocomplate.js -> Drupal.ACDB.prototype.search)
ez egy menu callbacknak megy,
ez egy menu callbacknak megy, nem kell neki kulon php, eleg beregisztralni a hook_menube egy MENU_CALLBACK-et, es kesz.
gányolgatni
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.
nem kell, siman print
nem kell, siman print drupal_to_js($output); es exit(). sot, akar meg form-ot is lehet dinamikusan generalni kis trukkel drupal 5 alatt.
még az sem
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.
Egyszerűbb
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?
jo volna kicsit tobbet tudni
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.
Egy kicsit visszavonulok
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?
igy?
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:
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).
Ígéretes
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.)
a callback fuggvenybe
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
Távlatok
: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...
jah csak kicsit egyszerubb a
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.
Rugalmas vagyok
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?
need input
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