Sziasztok!
Hogy van ez a hook dolog (hadd nevezzem a továbbiakban huroknak)?
Ha jól sejtem, egy hurok sehol sincs előre definiálva, egyszerűen attól válik hurokká egy függvény, hogy valahol meg lesz hívva egy module_invoke(), vagy egy module_invoke_all() által. Vagyis amikor nézegetem a Contributions API-t és azt látom, hogy egy modul biztosít néhány hurkot, akkor ez a gyakorlatban azt jelenti, hogy szerepel a modulban néhány module_invoke[_all]() hívás és az adott modul ezáltal teszi lehetővé más moduloknak azt, hogy a module_invoke() hívás helyére "rácsimpaszkodhassanak"?
Jól értem?
Drupal verzió:
Fórum:
igen, így van
A hook megvalósítások 3 leggyakoribb fajtája az amikor az egyik modulnak információra van szüksége a többi modultól. Ilyen például a hook_perm(), a hook_menu() vagy a hook_node_info().
A másik amikor az egyik modulban olyan esemény következik be amiről szeretné értesíteni a többi modult. Például a hook_cron().
A harmadik pedig amikor az egyik modul előállít valamilyen adatot(tartalmat) és lehetőséget ad a többi modulnak, hogy ezt az adatot megváltoztathassák. pl.: hook_form_alter()
Persze ezeket a függvények paraméterezésével lehet variálni.
A trigger modullal az együtt működés egy kicsit összetettebb.
http://api.drupal.org/api/function/hook_hook_info/6
Sorrend
Nekem is lenne egy hook-okkal kapcsolatos kérdésem, ha már így előjött ez. Ha több modul is megvalósít egy hurkot egy adott funkcióra, akkor hogyan alakul a sorrend? Mi alapján dől el, hogy milyen sorrendben futnak le?
Pl. a hook_menu-t szinte majdnem minden minden modul megvalósítja, és itt nem is lényeges a sorrend, de egy hook_form_alter-nél már érdekes lehet.
Szerintem
system tábla: weight
Fox Mulder
hook_nodeapi
az lenne a kérdésem, hogy egy saját magam általam készített modult, amibe található egy hook_noodapi függvény azt, hogyan tudom aktiválni, amikor is azt szeretném elérni, hogy az egyes case esetekben, például delete nél az én kódsoraim lépjenek életbe (a többi case esetben) az alap node jelen esetben delete függvénye helyett. Modult bekapcsoltam (sajátomat) és nem jelez ki rá hibát.
Nem értem a kérdést :-/
Ha azt mondod hogy "amiben implementáltam a hook_nodeapi()-t" akkor mindenkinek egyértelmű hogy miről beszélsz.
A mymodule_nodeapi() függvényt majd a rendszer aktiválja a megfelelő időben.
Az utolsó mondatod kivételével egyik mondatodat sem értem. Bár az is igaz, hogy az utolsó mondatod előtt csak egy mondat van.
hook_noodapi
Szóval van ugye a modules/node mappán belül egy egy node.module fájl. Ennek van egy load,insert,delete függvénye, amiket én bővítettem, de ezt a három bővített függvényt egy külön modulba szeretném kitenni, hogy az illetőnek ne kelljen programozni az alap node.module fájlt, hanem modulként behozni.
Olvastam, hogy ehhez a külön modulba, amit én fejlesztetem ezt a függvényt kell használni
function hook_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
switch ($op) {
case 'load':
és így tovább, ahol a load jelenti ugye a beteöltést.
A gondom az, hogy nem ez fut le, hanem az alapdrupal rendszer szerinti node. module fájlnak a load függvénye és nem az amit én külön modulba megírtam, az előbb említett kód segítségével.
Röviden hogy kell ugy modult fejleszteni, hogy az én függvényeim éljenek, és ne az alaprendszerbeli
pelda
nem, ezt nem igy kell. Rossz a cel is amit kituztel, es az is amit eddig megvalositottal. Szerencsere te is latod, hogy maskepp kell. A Drupal forraskodban nem kell atirni semmit, es a sajat moduljaidban implementalt hookok kiegeszitik az alap kodot nem felulirjak (vagy lecserelik)..
node_example Ezt a peldat probald meg megerteni, es ha valami nem vilagos, kerdezz..
pelda
Olvastam, amit írtál a példával együtt. Annyit sikerült kiokoskodnom belőle, hogy ha például a modulomat valaminek nevezem el, akkor valami_load (&$node) {} függvényt kellem használni a valami.module- omban. A kérdésem az lenne, amit így nemigazán sikerült kihámoznom, hogy mi kell még ahhoz hogy ez a függvény meg is hívodjon. A valami.info fájlba ugye kell, name,description,core és version kötelező jellegel.
semmi nem kell, csak megfelelően kell elnevezni, ez a lényeg
myinsert.info:
myinsert.module:
ez a modul, miután bekapcsoltad egy üzenetet jelenít meg minden node beküldésekor. ennyi.
ha nem szupertitkos nasa fejlesztés, ide is másolhatnád akár a modulfilet és akkor talán előbb megtalálnánk a problémát.
-
clear: both;
Sikerült
Köszi a segítséget, sikerült összhoznom azóta
Ennyi kellet csak
function morelanguages_nodeapi(&$node,$op) {
case stb....
Így már rendesen működnek az általam megírt kódsorok is. Csak a caseknél az aktuális delete,insert stb kulcsszót kellem használni:)