9.2. Šta znači "hook" u Drupalu?
Ovaj članak ima za cilj da vas upozna sa Drupalom, dalje ćemo pisati primere koda, nakon dodavanja našeg prilagođenog modula.
Drupal nije monolitni sistem u kome je sve savršeno i ništa ne treba menjati. Vrlo često se od programera traži da se na sajt doda ova ili ona funkcionalnost. Da bismo mogli da održavamo Drupal core kod i dodajemo funkcionalnosti Drupalu, koristimo module. Modularni sistem omogućava proširenje mogućnosti Drupala. Ali šta ako treba proširiti mogućnosti gotovog modula za brojanje? Naravno, možemo poslati zahtev za unapređenje funkcionalnosti kreiranjem issue-a na drupal.org i možda za mesec, dva... godinu ili dve, dobićemo željenu funkcionalnost u određenom modulu. Ali možemo i drugačije – napisati potrebni kod sami. Da bismo proširili mogućnosti dodatnih modula Drupala, kao i samog Drupala, koristićemo hook-ove i plugine u sopstvenim modulima.
Glavna ideja je da ne treba da održavamo Drupal kod, kod dodatnih modula, čime se štedi novac za rad programera. Da bismo lako mogli da ažuriramo kod modula i Drupala, ne smemo menjati Drupal core i kod modula. Inače će se sve izmene izgubiti pri sledećem ažuriranju modula ili Drupala.
Za povezivanje modula sa Drupal core-om, kao i modula međusobno, Drupal ima sistem hook-ova. Hook je funkcija koja se poziva kao povratni poziv (callback), tj. kada izvršavanje koda dođe do hook-a, ubacuje se kod naše funkcije koju dodajemo u modulu. Tako možemo obrađivati korisničke podatke, menije, taksonomije, node-ove raznih tipova sadržaja pri promeni, dodavanju, brisanju ili samo pri učitavanju i prikazu. Postoji mnogo hook-ova za Drupal 8, mada manje nego za Drupal 7, jer je dosta hook-ova prebačeno u spoljne Symfony komponente:
https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x
A ako pogledate Drupal 7 verziju, moraćete dugo da skrolujete:
https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x
To ne znači da je Drupal 8 manje moćan, već da se sve što je bilo hook-om u Drupal 7 sada u Drupal 8 dodaje kroz odgovarajući plugin.
Ako pažljivo pogledate listu hook-ova u Drupal 8, videćete da na kraju imena često stoji _alter, što znači da je hook namenjen promeni vrednosti promenljivih, na primer:
hook_form_alter() – omogućava izmenu niza forme tokom njene obrade u Drupalu. Kasnije ćemo analizirati kako se forme generišu iz nizova u Drupalu. Da biste primenili ovaj hook u modulu, kao i ostale hook-ove, jednostavno napišete funkciju:
function mymodule_form_alter() {
// promenite niz forme
}
Pojednostavio sam primer, nisam napisao argumente funkcije ni namespace, to ćemo kasnije razumeti, trenutno treba shvatiti kako hook-ovi funkcionišu. Mymodule je naš modul, umesto reči hook pišemo ime našeg modula i funkcija automatski prepoznaje i menja niz forme. Kako to radi? U metodi prepareForm se poziva druga metoda alter():
$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);
To znači da svaki modul u Drupalu koji implementira hook_form_alter() ubacuje svoj kod na ovo mesto. Dakle, ako želimo da dodamo kod na neko mesto u Drupalu, prvo idemo hook-om, zatim pluginom, a ako je baš nemoguće drugačije, patch-ujemo / menjamo / hack-ujemo modul (nažalost, ponekad moramo). Za sada nismo imali zadatke koji zahtevaju menjanje plugina, pa hajde da naučimo kako se pišu sopstveni moduli.