Sziasztok!
Van egy oldal, ahol kérés volt, hogy a tartalmakat tetszőlegesen lehessen pozicionálni (tehát mondjuk mi kerüljön címlap első helyre, baloldalt második helyre, stb.).
Ehhez létrehoztam egy szótárt, amiben lévő kifejezések jelölik a pozíciókat.
Azt szeretném elérni, hogy egy pozíció kifejezés egyszerre csak egy node-hoz tartozhasson.
Ezt úgy érem el, hogy új node mentésekor vagy node módosításakor a korábbi nodokról (ha volt rajtuk, akkor) leveszi az adott kifejezést.
Ezt a levételt egyenesen az adatbázisban hajtom végre. A következő táblákat manipulálom (a megfelelő field neve: structure):
field_data_field_structure
field_revision_field_stucture
taxonomy_index
cache_field
Ezekből törlöm a megfelelő sorokat.
Az a kérdésem, hogy a drupal 7 máshol is tárolja azt az információt, hogy egy node adott fieldjéhez milyen termek vannak hozzárendelve, vagy elég ezekből kitörölnöm?
Kösz a segítséget!
Minden jót!
Kód
Beillesztem a kódot is, hátha valaki tudja majd használni még...
A kérdésedre
"Az a kérdésem, hogy a drupal 7 máshol is tárolja azt az információt, hogy egy node adott fieldjéhez milyen termek vannak hozzárendelve, vagy elég ezekből kitörölnöm?"
nem tudom a választ. De igazából nem szerencsés így csinálni (bár megismered így a táblákat), mert pont erre vannak az API függvények, amiknek az a dolguk, hogy minden táblában takarítsanak, ahol kell.
Én így állnék neki:
- A hook_node_presave() hook-ot implementálnám csak.
- Ebben a hook-ban a $node tartalmazza a term id-t ($tid). A term id-vel betöltheted az összes node-ot, ami még ehhez a term-hez van hozzárendelve a taxonomy_select_nodes() függvénnyel.
- A betöltött node-okon végigtekersz egy ciklussal, és megszünteted a hozzárendelésüket az adott term-hez, és elmented mindegyik node-ot.
SZERK: Valahogy így, nem próbáltam a kódot!
Igen, először én is így
Igen, először én is így próbáltam.
De ha jól gondolom ezzel az a gond, hogy amikor a többi noderól leveszi a termet és meghívja azokra a node_save függvényt, akkor azoknál is lefut a node_presave hook, és így szépen (ha jól sejtem) végtelen ciklusba esik a rendszer.
Jól gondolom?
Köszönet a hozzászólásokért!
Jó gondolat
erre nem is gondoltam.
A node_save() tényleg meghívja a hook_node_presave() hook-ot:
Nekem is úgy tűnik, hogy végtelen ciklusba kerül a fenti kód.
Érdekelne, mi az elegáns megoldás erre.
Adatbázis módosítás szebben, Nodequeue modul
field_sql_storage_field_storage_write
Találtam egy ilyet:
http://timonweb.com/how-insert-and-update-only-specific-fields-your-enti...
Itt a field_sql_storage_field_storage_write függvényt ajánlja plusz cache ürítést. Nagyjából azt csinálja, amit én, bár ha jól látom akkor a taxonomy_index táblával nem foglalkozik.
Nodequeue
A nodequeue modul nagyon ígéretes, valóban termenként lehet csinálni egy sort, aminek ráadásul meg lehet határozni a max hosszát. Tehát ha mondjuk a pozíciók szótárra kérem ezt, akkor az összes termnél lesz egy egy hosszú sor.
Ennek a szépséghibája az az, hogy a node szerkesztésénél külön tab-on kell szerkeszteni a queue-ket (hozzáadás, eltávolítása). Egyenlőre beta állapotú a modul. Van ebben olyan funkció, hogy a node szerkesztő űrlapon kért termek esetében a node-ot automatikusan berakja a term-queue elejére, és a queue-ből kitolódó nodeokról meg leveszi? Ha ez menne, akkor meg lenne a megoldás, még több is annál. Így valóban csak a modult kellene telepítenem, és az oldal üzemeltetőinek se kellene új használatot megtanulni.
Én ezt nem találtam meg, esetleg valaki jobban ismeri ezt a modult?
Kösz a segítséget!
Ezt Rules modullal a d6-ban
Ezt Rules modullal a d6-ban meg símán meg lehet csinálni, de d7-ben tudtommal még nincs a Nodequeue modulnak Rules integrációja.
Azt viszont tudja, hogy nem is kell szerkeszteni a node-ot, mert full node nézetben alatta megjelennek a létrehozott és engedélyezett queue-k, így csak egy kattintás és kész.
Persze a sorrendet manuálisan kell módosítani.
Gazsesz
Hat, ezt igy nem kene
"Ezt a levételt egyenesen az adatbázisban hajtom végre"
"Az a kérdésem, hogy a drupal 7 máshol is tárolja azt az információt, hogy egy node adott fieldjéhez milyen termek vannak hozzárendelve, vagy elég ezekből kitörölnöm?"
Ha nem az adatbazisban matatnal kezzel nem kene ilyesmit kerdezned. Arra vannak kulonbozo API-ok hogy ilyesmit ne kelljen megkerdezni mert erre a valasz csak es kizarolag az lehet: fogalmunk sincs. Ez attol fugg milyen module-okat futtatsz milyen beallitasokkal. Egy ennyire kiterjesztheto rendszerben csak akkor nyulunk kozvetlenul az adatbazishoz ha eg a haz.
Szerintem erre a legjobb
Szerintem erre a legjobb megoldás a Nodequeue modul. Pontosan ezt a funkciót valósítja meg, drag&drop módon is tudod a sorrendet változtatni, views integráció, etc minden van.
Gazsesz