hook_menu Drupal 7 kreiranje stranica kroz modul
U prethodnoj lekciji smo videli kako prikazati informacije iz baze podataka koristeći Drupal API, tačnije hook-ove hook_block_info() i hook_block_view(). U ovoj lekciji ćemo prikazivati stranice, odnosno pomoću hook_menu ćemo povezati stranicu sa drugim delovima Drupala: menijima, modulima za prevod, šablonima itd.
Počnimo jednostavno — prikazaćemo stranicu sa naslovima poslednjih 10 vesti i njihovim opisima. Napravićemo mali feed vesti. Koristićemo hook_menu(). Ispod je njegovo objašnjenje, a zatim ćemo ga koristiti.
hook_menu()
Definiše stavku menija i vraća stranicu.
Ovaj hook koji se poziva u modulu registruje putanju kojom će Drupal upravljati. Putanje mogu biti samo za obradu ili mogu biti smeštene u meni, npr. navigacioni meni. Putanja i povezane informacije se nazivaju stavka menija (menu router item). Hook se retko poziva (npr. kada se uključi modul) i rezultat se kešira u bazi podataka, zato treba čistiti keš kada se menja hook u modulu.
hook_menu() vraća asocijativni niz gde su ključevi putanje, a vrednosti su asocijativni nizovi sa svojstvima putanje (opisano ispod).
Definicija za svaku putanju uključuje vraćenu stranicu koja se prikazuje kada se ta putanja pozove. Ako nema drugih pod-URL-ova, vraća se stranica. Na primer, vaš modul može registrovati put 'abc/def'.
<?php function mymodule_menu() { $items['abc/def'] = array( 'page callback' => 'mymodule_abc_view', ); return $items; } function mymodule_abc_view($ghi = 0, $jkl = '') { // ... } ?>
Kada se pozove put 'abc/def' bez dodatnih segmenata, neće biti prosleđeni dodatni argumenti. Kada se pozove 'abc/def/1/Omsk', funkcija prima argumente "1" i "Omsk". Ovo je korisno pri pravljenju šablona stranica.
Dodatni argumenti se mogu definisati kao asocijativni niz. Lista može sadržati složene ili proste numeričke argumente. Kada su brojevi korišćeni, odgovarajući poziv funkcije (page callback) će dobiti broj kao argument. Na primer, prvi argument je arg(0), drugi arg(1), itd.
<?php function mymodule_menu() { $items['abc/def'] = array( 'page callback' => 'mymodule_abc_view', 'page arguments' => array(1, 'foo'), ); return $items; } ?>
Kada se pozove 'abc/def', stranica će primiti 'def' kao prvi argument i 'foo' kao drugi argument. Detaljan opis hook-a možete naći na: http://api.drupal.org/api/drupal/modules--system--system.api.php/function/hook_menu/7
Napravimo jednostavnu stranicu:
function sitemade_menu(){ $items = array(); // inicijalizujemo niz menija $items['page_example'] = array( // dodajemo stranicu na putanji 'page_example' 'title' => 'Primer stranice', // naslov stranice 'description' => 'Obična stranica', // opis stranice 'page callback' => '_page_example', // funkcija koja vraća sadržaj stranice 'access callback' => TRUE, // svima dozvoljen pristup 'expanded' => TRUE, ); return $items; // vraćamo listu stranica } function _page_example($content = NULL) { $content = ''; // inicijalizujemo prazan sadržaj $query = db_select('node_revision', 'n'); // biramo tabelu node_revision gde su trenutne revizije dokumenata $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // pridružujemo tabelu field_revision_body gde je body $query->innerJoin('node', 'd', 'n.nid=d.nid'); // pridružujemo tabelu node gde je title noda $query->fields('n', array('title'), array('nid'), array('vid')); // biramo polja $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); // filtriramo po tipu sadržaja $query->orderBy('n.timestamp', 'DESC'); // sortiramo najnovije vesti prvo $query->range(0, 10); // biramo poslednjih 10 $result = $query->execute(); // izvršavamo upit while($nodes = $result->fetch()){ // obrađujemo rezultat $content .= '<h3>' . $nodes->title . '</h3>'; // prikazujemo naslov $content .= $nodes->body_value; // prikazujemo body } return $content; // vraćamo sadržaj }
Možemo koristiti svojstvo hook-a type da postavimo gde će se stranica pojaviti u meniju, npr. u admin panelu ili glavnom meniju.
Dodajmo ovo:
function sitemade_menu(){ $items = array(); // inicijalizujemo niz menija $items['page_example'] = array( // dodajemo stranicu na putanji 'page_example' 'title' => 'Primer stranice', // naslov stranice 'description' => 'Obična stranica', // opis stranice 'page callback' => '_page_example', // funkcija koja vraća sadržaj stranice 'access callback' => TRUE, // svima dozvoljen pristup 'expanded' => TRUE, 'type' => MENU_NORMAL_ITEM, 'menu_name' => 'main-menu', ); return $items; // vraćamo listu stranica }
Očistimo keš i sada će se pojaviti link ka stranici u meniju.
Osim običnih menija, možemo dodati i prikaz stranice u Drupal admin panel:
function sitemade_menu(){ $items = array(); // inicijalizujemo niz menija $items['admin/config/content/page_example'] = array( // dodajemo stranicu na putanji 'admin/config/content/page_example' 'title' => 'Primer stranice', // naslov stranice 'description' => 'Obična stranica', // opis stranice 'page callback' => '_page_example', // funkcija koja vraća sadržaj stranice 'access arguments' => array('administer site configuration'), // prava pristupa za admina ); return $items; // vraćamo listu stranica }
Sada se stranica prikazuje samo adminu i link ka njoj je u admin panelu:
Link se pojavljuje jer Drupal automatski dodaje link za putanje koje počinju sa admin/config/content/*. Ako stavite putanju admin/config/people/*, link će se pojaviti u bloku Korisnici (umesto zvezdice možete staviti sopstveno ime, kao kod nas page_example).
Sada znamo kako praviti blokove i stranice, mislim da su ovo osnovni hook-ovi za prikaz sadržaja koji će se često koristiti u vašim modulima.
U sledećoj lekciji ćemo proučiti hook_perm() za kreiranje novih dozvola za korisnike.