Iz čega se sastoji modul za Drupal 7?
Pre nego što počnemo da pravimo naš modul, reći ću još nešto o mogućnostima Drupal API-ja. API pruža široke mogućnosti za rad sa taksonomijom, nodovima, korisnicima, unosom i prikazom podataka iz baze. Za međusobnu komunikaciju modula i jezgra Drupala, kao i modula međusobno, postoji sistem hook-ova. Hook je povratni poziv funkcije, odnosno kada se izvršavanje koda dođe do hook-a, izvršava se kod naše funkcije koju definišemo u modulu. Tako možemo obrađivati podatke korisnika, menije, taksonomije, nodove različitih tipova sadržaja.
Na stranici
http://api.drupal.org/api/drupal/includes--module.inc/group/hooks/7
dat je spisak hook-ova jezgra Drupala. Obratite pažnju da se spisak razlikuje po verzijama Drupala. Mi ćemo praviti modul za Drupal 7, pa ćemo koristiti hook-ove za tu verziju.
Hook-ovi u Drupalu imaju sledeći oblik:
ImeModula_NazivHooka
Gde god stoji "hook" u imenu hook-a, treba staviti ime vašeg modula u kojem se hook koristi.
Prvo treba napraviti sam modul.
- Napravite folder u
sites/all/modules
sa imenom budućeg modula, ja ću ga nazvatisitemade
. - U folderu modula napravite dva fajla:
ImeModula.info
iImeModula.module
. U mom slučaju to susitemade.info
isitemade.module
.
U fajlu sitemade.info
napišite:
;$Id$ // ovaj komentar je potreban za lakše postavljanje modula na drupal.org name = Sitemade module // ime modula koje se vidi na listi modula package = sitemade // ime paketa kojem modul pripada core = 7.x // verzija Drupala za koju pravimo modul files[] = sitemade.module // niz fajlova sa PHP kodom
U fajlu sitemade.module
napišite početak PHP koda:
<?php // tag ne mora da se zatvori //$Id$ // dodato radi lakšeg postavljanja na drupal.org
Sada bi vaš modul trebalo da se pojavi u listi modula, uključite ga:
Sada kada je modul uključen, možemo dodavati kod. Predlažem da uklonimo tekstualni blok "History" (Istorija) sa stranice korisnika:
Prvo ćemo videti kako to funkcioniše, biće nam potreban hook hook_user_view
:
http://api.drupal.org/api/drupal/modules--user--user.api.php/function/hook_user_view/7
Ideja ovog hook-a je sledeća: Kada Drupal izvršava kod za prikaz stranice korisnika, uključi i naš hook iz modula. U našem hook-u ćemo iz niza $account
ukloniti informacije o istoriji korisnika. Otvorite sitemade.module
i dodajte ovaj hook:
function sitemade_user_view($account, $view_mode, $langcode){ print_r($account); }
Sačuvajte fajl i očistite keš Drupala da bi se hook učitao. Na vrhu stranice korisnika videćete ispis:
To je zapravo niz $account
koji hook hook_user_view
pruža, a print_r
ispisuje sadržaj niza na stranicu. Ako koristite Mozilla Firefox (preporučujem ga za razvoj), pritisnite CTRL+U da vidite izvorni kod stranice i shvatite šta sve niz sadrži.
Obratite pažnju na polja uid
i name
u kojima su ID i ime korisnika. Ta polja se često koriste za pravljenje linkova ka profilima ili sadržajima korisnika.
Ovde su samo podaci korisnika, nema podataka o tekstualnom bloku History (Istorija). Probajmo drugi hook hook_user_view_alter
:
http://api.drupal.org/api/drupal/modules--user--user.api.php/function/hook_user_view_alter/7
Izmenite kod modula na:
function sitemade_user_view_alter($account, $view_mode, $langcode){ print_r($account); }
Sačuvajte promene. Ispisani niz će biti promenjen, sada je account
samo jedno polje u nizu. U polju summary
nalazi se informacija za blok History (Istorija). Pokušajmo da uklonimo ovo polje i vidimo rezultat. Za brisanje koristimo funkciju unset
:
function sitemade_user_view_alter($account, $view_mode, $langcode){ unset($account['summary']); print_r($account); }
Polje summary
će nestati, ali blok Istorija ostaje. Zašto? Zato što parametar funkcije $account
prima kopiju vrednosti, a ne referencu. To znači da modifikujemo lokalnu promenljivu, ali ne i originalne podatke korisnika. Da bismo menjali original, treba dodati &
ispred promenljive da bismo prosledili referencu.
function sitemade_user_view_alter(&$account, $view_mode, $langcode){ unset($account['summary']); print_r($account); }
Sačuvajte i očistite keš. Sada bi blok History trebalo da nestane. Ampersand &
kreira referencu na promenljivu $account
. Više o referencama u PHP-u možete naći u bilo kom udžbeniku PHP programiranja.