Drupal 6 architektúrája
Bemutatkozás
● Demeter-Haludka Tamás● Programtervező informatikus hallgató● 2 éve Drupal fejlesztő a Pronovix-nál● Számos contrib modul karbantartója
Tervezési minták
● Részei a programozói folklórnak● Általános megoldások általános
problémákra● Közös szótár a programozók között
Drupal 6 és a tervezési minták
● Presentation-abstraction-control● Observer● Visitor● Chain of responsibility● Convention over configuration
Presentation abstraction control
● Ismertebb változat: hierarchical MVC (modell-view-controller)
● Különbség: a HMVC kevésbé szigorú abban, hogy a view-k és modellek kommunikálhat egymással, a kontroller kihagyásával
Observer
● Eseménykezelő minta
Visitor
● Az algoritmus külonválasztása az adatstruktúrától
● Előny: új műveleteket lehet könnyedén definiálni az adatstruktúrán
● Általában arra használják, hogy virtuális függvényeket adjanak osztályok egy csoportjához azok módosítása nélkül
● Drupalban az Observeren keresztül került implementálásra
Chain of responsibility
● Egy parancs és sok végrehajtó egység sorban
● Mindegyik végrehajtó egység tudja, hogy az adott parancsot végre tudja-e hajtani, és ha csak részben, akkor mit kell átadni a többi végrehajtó egységnek
Convention over configuration
● Elnevezési konvenciók konfiguráció helyett
● Ügyes elnevezésekkel a keretrendszer kitalálja, hogy miket kell használnia
Tervezési minták Drupalban
● A rendszer egésze: Presentation abstraction control
● Hook rendszer: observer és visitor● Menü rendszer: chain of responsibility● Convention over configuration: rengeteg
helyen
A hook rendszer
● Alapötlet: convention over configuration● A hookokra mindig hook_hookneve()
formátumban hivatkozunk, ahol implementáláskor a hook szót kicseréljük a modul nevével, pl.: hook_form_alter() → taxonomy_form_alter()
Hookok csoportosítása
● Alter hookok: visitor minta az observeren keresztül megvalósítva
● A hook neve _alter-rel végződik● Valamilyen adatstruktúra referenciaként
van átadva, és ezt lehet módosítani● Hívása: drupal_alter()● Pl.: hook_form_alter()
Hookok csoportosítása
● Event hookok: az összes többi● Valamilyen eseményre lehet reagálni, és
további műveleteket elvégezni● Hívása: module_invoke_all()● Példa: hook_nodeapi()
Hookok működése
● Meghívás: név, majd a paraméterek listája● Végigiterál az engedélyezett modulok
listáján (amik a system táblában vannak tárolva, ahol van egy weight mező, ami alapján történik a rendezés – ezt csak speciális modulok használják ki)
● Ha létezik a modulneve_hookneve függvény, akkor a megadott paraméterekkel meghívásra kerül
Példa hookra
Mi történik egy lapletöltéskor?
● Bootstrap● menu_execute_active_handler()● theme('page')
Bootstrap
● Configuration● Early page cache● Database● Access● Session● Late page cache● Language● Path● Full
Bootstrap: configuration
● register_globals káros hatásainak száműzése
● Időzítő indítása● Konfigurációs állományok betöltése (pl.:
settings.php)
Bootstrap: early page cache
● Betölti a cache-t● Megnézi, hogy implementálva van-e a
page_cache_fastpath()● Ha igen, akkor kilép
Bootstrap: database
● Kapcsolódás az adatbázishoz● Lock api betöltése
Bootstrap: access
● IP alapú tiltás
Bootstrap: late page cache
● Változók inicializálása● Page cache ellenőrzése● Ha nem létezik vagy létezik és az
aggresszív cache-elés nincs engedélyezve, akkor a modulok betöltődnek és a hook_boot lefut
● Ha létezik a page cache, akkor kiíródik a kimenetre, és ha nincs aggresszívre állítva a cache, akkor meghívódik a hook_exit, majd kilép
Bootstrap: language
● Nyelv meghatározása (beállítások illetve HTTP_ACCEPT_LANGUAGE vizsgálata)
Bootstrap: path
● Path kiderítése a $_GET['q'] alapján● Aliasok visszafejtése● custom_url_rewrite_inbound() hívása, ha
létezik
Bootstrap: full
● Alrendszerek és API-k betöltése● Hibakezelő beállítása● Magic quotes GPC visszaállítása● Összes modul betöltése● hook_init lefuttatása