Views segítségével próbáltam létrehozni egy (felhasználói) oldalt, ami egy (egyszintű) hierarchikus szótár kifejezéseit listázza. Olyan oldalt szerettem volna készíteni, mint az admin felület "Kifejezések ebből a szótárból:..." (admin/content/taxonomy/id) lapja.
A kifejezések listázása adott szótárból nem nehéz. Alapértelmezett argumentumként a szülők azonosítóját megadva (1+2+3) a gyermek kifejezések csoportba is rendeződnek. A gond csak annyi, hogy a szülő kifejezések így nem látszanak.
Ekkor kezdtem keresni és ráakadtam Earl válaszára, miszerint a views nem támogatja a hierarchia megjelenítését, mert igen macerás az adatbázis kezelése: http://drupal.org/node/300719#comment-1116531 Ellenben használható a Taxonomy Lineage modul - http://drupal.org/project/lineage -, ami egy plusz táblát helyez el az adatbázisban és így már a Views is boldogul vele.
Én nem szeretnék most emiatt az egy lekérdezés miatt új modult telepíteni, így a hierarchikus szótár helyett valószínűleg több szótárt használok. Viszont arra kiváncsi lennék, hogy az említett admin felületen (admin/content/taxonomy/id) hogyan jelenik me a hierarchikus kifejezés lista. Ott végigzongorázza a rendszer a bonyolult adatbázis lekérdezést?
Ez egy külön szakma. ;)
A hierarchikus adatszerkezetek tárolásának és megjelenítésének hatalmas irodalma van. Számtalan mód ismert. Ezek különböző előnyökkel és hátrányokkal rendelkeznek. Négy esetet kell mindig vizsgálnunk. A három módosítást Insert, Delete, Update és a lekérdezést Select. Amennyiben egy módszer mind a négynél gyorsulást ér el úgy, hogy nem növeli az inkonzisztencia veszélyét akkor technológiai áttörésről beszélünk. Sajnos a gyors lekérdezést teljesítő modellek még az egyes normálformát se hozzák ezzel téve nehézkesen kezelhetővé az adathalmazt.
A Drupal taxonomy rendszer egy igen egyszerű módszert használ, melyben egy adott elemnél az adott elem szülője van letárolva. Ez előnyös, hisz gyorsan módosíthat és viszonylag egyszerű pl. részfákat mozgatni, hisz csak egyetlen egy értéket kell átírni. Így elkerülhető az inkonzisztencia kialakulása. A hierarchia lekérdezése már más kérdés. Ezt nem is lehet egyetlen SQL lekérdezéssel megtenni. A gyermekeket valamilyen - tipikusan rekurzív - kis függvénnyel kell lekérdezni. kb.: Az elem lekérdezése a gyermekek lekérdezése (ami egy újabb elem lekérdezése, ami ugye áll az elem lekérdezéséből és a gyermekei lekérdezéséből, ami egy újabb... egészen addig amíg nincs már több gyermek.) Ezt pedig nem lehet a views-ba integrálni, hisz az egyetlen egy lekérdezés által visszaadott listát jelenít meg. (ha megnézed a taxonomy forrását akkor ezt Te is láthatod. ;))
A Drupal hozzászólásainál már egy egész más módszert használnak. Egy egy hozzászólásnál egy mezőben tároljuk a hierarchiában való elhelyezkedést. Itt most nem részletezném, csak azt kell tudnunk, hogy az előállítása egyszerű és a szülő elem hasonló mezőjéből történik. Ez a megoldás gyors beszúrással és gyors hierarchikus lekérdezéssel rendelkezik. A módosítás viszont nehézkes és gyakran vezethet inkonzisztenciához. Ezért van az, hogy hozzászólás mozgatást ugyan meg lehet oldani, de vagy hányaveti megvalósítást csinál az ember (keresztbe tett ujjakkal lehet használni) vagy normálisat csak pont ezért használhatatlant. Ezért van az, hogy nincs gomb a dh-n egy hozzászólás új témába dobásához.
Ez a megvalósítás azonban tökéletes arra amire eredetileg kitalálták. Felvitel során fixált hierarchia és gyors lekérdezés.;)
A Lineage modul egy harmadik megoldást ad hozzá a rendszerhez, mely lehetővé teszi a hipergyors hierarchia lekérdezést. Cserébe viszont nem tolerálja, ha változtatsz a hierarchián. Sem a beszúrást sem bármilyen más módosítást nem ajánlatos használni ilyenkor. Tehát ha felteszed a Taxonomy Lineage modult, akkor ne nagyon módosítsd a hierarchiádat. Ezt egyébként le is írják a modul oldalán. ;)
Szóval a lehetőség az, hogy vagy írsz egy modult ami listázz, vagy használod a lineage-t a views integrációhoz.
pp
Palócz István
https://palocz.hu | https://tanarurkerem.hu
Kérdés - modul?
Köszi a kimeritően részletes hozzászólást! ;o) Azért jó látni, ha valaki ilyen szinten tisztában van az általa használt rendszer működési hátterével!
Egyébiránt van listázó modul: http://drupal.org/project/taxonomy_list - de nem nagyon tetszik. És egyetlen lap kedvéért... :o(
A kérdésemre egyébként nem válaszoltál(?) Hogyan készül az admin felületen a lista? Illetve mégis - gondolom: egyedi kóddal („...írsz egy modult, ami listáz”) :o)
Hál' Istenek, mint írtam, választhatok másik utat - hátha az kezelhetőbb lesz.
Üdvözlettel:
Hajas Tamás
Pedig ott van a válasz.
Az első rész pont azt taglalja. Persze abban igazad van, hogy elég hányaveti módon olyan TIT stúdiós ködösítéssel. Tehát pontosan a taxonomy_overview_terms() függvény állítja elő, amely a taxonomy_get_tree() függvénytől kapja meg a hierarchikus adatszerkezetet. Ez utóbbi az emlegetett rekurzív függvény. A lényeg, hogy ezt nem arra találták ki, hogy minden egyes oldalletöltéskor legenerálódjon egy több százezer szavas szótár. Tehát ha a három fő biológiai rendszertant szeretnéd Drupalba begyötörni amit az egyetemen tanultál, hát ne ezzel csináld.
A jelzett kérdésed pedig ott a todo listámban, igyekszem mielőbb válaszolni rá!
pp
Palócz István
https://palocz.hu | https://tanarurkerem.hu
Ok, köszi!
Nem kötözködöm! Köszönöm, hogy reagáltál!
Igazábol sokáig gondolkodtam, hogy beküldjem-e egyáltalán a témát. Egyéni gondomon túl főleg a kérdés érdekessége motivált, de így is bizonytalan voltam. Aztán csak észrevettem, hogy már megnyomtam a „Mentés” gombot... ;o)
A másik kérdésen való gondolkodást is köszi - én is ezen dolgozom - mint a példa mutatja ;o)
Üdvözlettel:
Hajas Tamás