A Drupal moduljai a modules
könyvtár alatt találhatóak. Lehetőség van arra, hogy minden modul közvetlenül ebben a mappában helyezkedjen el, de több fájlból álló modulok esetén célszerű külön alkönyvtárakat létrehozni, hiszen a rendszer azokban is megtalálja a kiegészítőket. A külön alkönyvtár létrehozását egyes kiegészítő modulok telepítési utasításai kifejezetten ajánlják. A későbbi karbantarthatóság érdekében néhányan azt az utat követik, hogy csak az alapmodulokat tartják meg közvetlenül a modules
mappában, és a kiegészítőket mindig alkönyvtárakban helyezik el. Így jobban azonosítható a modulok származási helye. Arra is lehetőség van, hogy egy-egy alkönyvtárba egyszerre több modult helyezzünk, a részmodulokból álló kiegészítések is ezt a megközelítést alkalmazzák.
Előkövetelmények
Lássuk, mi szükséges a modul fejlesztés megkezdéséhez:
- Természetesen nem érdemes saját modul fejlesztésébe fogni, ha nem rendelkezünk adminisztrátori jogosultságokkal egy telepített Drupal rendszeren. Ahhoz, hogy modulokat tudjunk engedélyezni, vagy egy modul beállításait módosítani tudjuk, ilyen jogosultságra szükségünk lesz. Szintén elengedhetetlen, hogy fájlrendszer elérésünk legyen a Drupal telepítéshez, hiszen új illetve módosított modul állományunkat valahogy a rendszer
modules
mappájába kell juttatnunk. - A Drupal moduljai PHP szkriptek, melyeket a rendszer a megfelelő időben betölt, ezért fejlesztésükhöz PHP tudás szükséges. A rendszer fejlettségéhez képest meglepő lehet, de a modulok (és sminkek) készítéséhez objektum-orientált programozási tapasztalat nem szükséges, a Drupal csak adathordozóként használja az objektumokat, viselkedéssel nem ruházza fel azokat. A függvények használata a fejlesztés során természetesen előnyökkel és hátrányokkal is jár. A legfontosabb előnyök: gyors program végrehajtás, könnyű bekapcsolódás a fejlesztésbe, a funkcionalitás egyszerű megosztása különböző fájlok között. A legkomolyabb hátrány a különböző függvényhívások között megőrizhető adatok lehetőségének hiánya, mely problémát azért meg lehet kerülni, és ezt a megoldást a Drupal rendszerben is többször kihasználják.
- Amennyiben modulunk valamilyen adatbázis kezelési műveletet is igényel, SQL tudásra is szükségünk lehet. Ha szélesebb körben használható modult fejlesztünk, akkor oda kell figyelnünk a szabványos SQL használatára.
Elnevezési szabályok
A modulok állhatnak több fájlból is, de mindenképpen szükséges egy a modul neve szerint elnevezett .module
kiterjesztésű fájl, ugyanis ezeket ismeri fel a Drupal modulokként. Amennyiben eseteként betöltendő kiegészítő funkcionalitást is szeretnénk a modulba építeni, akkor azt .inc
állományokba helyezhetjük. Példák: story.module
, bbcode.module
, bbcode-filter.inc
. A Drupal telepítésekor beállított .htaccess
állomány Apache szerver esetén biztosítja azt, hogy a speciális .module
és .inc
kiterjesztés védett legyen a webes kiszolgálás szempontjából, azaz, hogy ne tudják böngészőből lekérdezni a webhelyünk forráskódját.
Moduljainkban főleg az állomány kiterjesztés előtti neve alapján elnevezett függvényeket definiálunk, mint story_help
, story_page
, bbcode_filter
, stb. Ezért nagyon fontos, hogy az állomány nevét úgy válasszuk meg, hogy az csak PHP függvénynévben használható karaktereket tartalmazzon. Nem szabad kötőjelet vagy más speciális karaktert használni a modul fájl nevében, mert ilyenek függvénynévben nem szerepelhetnek.
A Drupal 4.7-ben bevezetett speciális fájlok az .install
kiterjesztésű telepítést kezelő állományok. Ezek segítségével lehet a modulunkhoz telepítés során lefutó kódot csatolni, így létrehozva a kapcsolódó táblákat, felvéve bizonyos beállításokat.
Hurkok és más függvények
Nagyon ritkán fordulhat az elő, hogy a Drupal forráskódját módosítanunk kell, hiszen a rendszer számos ponton lehetővé teszi a folyamataiba történő beavatkozást az úgynevezett hurkokon (hook) keresztül. Ezek olyan speciálisan elnevezett függvények, melyek szükség esetén meghívódnak. Nekünk nem kell törődni azzal, hogy meghívásra kerüljenek, erről a Drupal gondoskodik. A hurkoknak nem csak a neve, hanem a paraméterezése is kötött, a hurok definiálója adja meg, hogy mi az elvárt paraméter lista. Saját hurok megvalósításainkat is ennek megfelelően kell létrehoznunk.
A hurokfüggvények a dokumentációban hook_menu
, hook_block
, hook_perm
, stb. néven vannak definiálva. A saját hurok megvalósításunknál a nevekben a hook
előtagot a modulunk nevére kell cserélni. A fenti példákkal élve story_help
és bbcode_perm
egy-egy hurok megvalósítás. Néhány fontosabb hurok:
hook_help($section)
- A modul leírásának megadására és általában a Drupal rendszer oldalain megjelenő súgók definiálására szolgál. Az adminisztrációs felületek segítő leírásai ezzel adhatóak meg.
hook_menu($may_cache)
- A rendszermenübe történő menüpont felvételt teszi lehetővé, valamint a menütől függetlenül biztosítja webcímek függvényekhez rendelhetőségét. A különböző oldalakon megjelenő fülek definiálására is ezt használhatjuk.
hook_block($op = 'list', $delta = 0, $edit = array())
- Az oldal blokkjainak összeállításakor hívódik meg, lehetővé téve modulunk által definiált blokk illetve blokkok létrehozását. Az ilyen blokkok teljes értékűek a rendszerben, azaz a hagyományos blokk műveletek elvégezhetőek ratjuk.
Ezek a példák csak ízelítőt adnak a hurkok lehetőségeiből, hiszen sokkal több hurok áll rendelkezésre, melyeket felhasználhatunk, sőt saját modulunk is definiálhat hurkot, melyet más kiegészítések implementálhatnak.
Mivel számos hurok lehetséges, azokat a függvényeket, melyeket nem hurok megvalósításnak szántunk, körültekintően kell elnevezni. Gyakori például a modulneve_page
függvény, mely a modul HTML oldalait állítja elő, ez azonban nem hurok, és nem is alkalmazza minden modul ezt az elnevezést az oldalát előállító függvény definiálására. Annak érdekében, hogy elkerülhessük az esetleges név ütközéseket, célszerű a csak belsőleg használt függvények neve elé egy aláhúzást tenni, mint: _story_getcontent
vagy _bbcode_filter_process
.
A szabályok mentén elnevezett függvényeknek még egy csoportja van, ezek pedig a smink függvények. Nem kötelező smink függvényt definiálnunk, ezek segítségével azonban lehetővé tehetjük, hogy modulunk kimenetének valamely részét sminkeljék – kinézetét megváltoztassák. A smink függvények nevének előtagja meghatározott, mégpedig minden esetben theme_modulneve_
. Smink függvény név példák: theme_story_display
, theme_bbcode_list
.
Forrás dokumentáció
Kézikönyvünkben nem vállalkozhatunk arra, hogy minden egyes hurkot dokumentáljuk, különösen, hogy felhasználásuk egy mintát követ, ezért egyik-másik hurok megismerése után újabbak elsajátítása már igen egyszerű. A Drupal jelentősebb verzióról-verzióra változtatja a hurkok paraméterezését, elvárt működését vagy akár nevét is. Éppen ezért a Drupal forrása gazdagon tűzdelt dokumentációs megjegyzésekkel, melyek a phpdoc
formát követik. Ennek keresztreferenciás megtekintéséhez egy külön API modult fejlesztettek ki, melyet mi is telepíthetjük magunknak, hogy közelről böngészhessük az elérhető függvényeket és hurkokat. Azoknak, akik nem szeretnék telepíteni ezt a modult, egy nyilvános felület is elérhető az api.drupal.org címen.
A saját munkánkat is le tudjuk egyszerűsíteni, ha szükség esetén a Drupal által kezelt adatokat a rendszer lekérdező függvényei segítségével szeretnénk megkapni. Az adatbázis függetlenítő, felhasználó kezelő, űrlap generáló, smink kezelő stb. függvényeken túl az egyes modulok is rendelkeznek olyan függvényekkel, amelyeket újra tudunk hasznosítani, meg tudunk hívni, ha adatokra van szükségünk. A hurkokkal lehetőségünk van kiterjesztést fejleszteni, és beépülő komponenseket készíteni, de a hurkokon felül a Drupal függvénykészletének ismerete jelentősen megkönnyíti, hogy gyors, biztonságos és átlátható kódot készítsünk. Az említett forrás dokumentáció ebben is nagy segítségünkre lehet.