Architektura Drupalu

Poskytněme si stručný přehled architektury Drupalu.

Z předchozího obrázku získáte velmi hrubou představu o struktuře Drupalu. Rovněž poznáte, jak Drupal zachází s požadavkem. O jednotlivých komponentách si řekneme ve zbytku této části. Nejprve si však projděme zjednodušený příklad toho, jak se zpracovává běžný požadavek na webových stránkách v Drupalu:

  1. Uživatel zadá adresu http://priklad.cz/node/123 do webového prohlížeče a stiskne klávesu Enter.
  2. Webový prohlížeč kontaktuje webový server na doméně priklad.cz a požádá jej o prostředek /node/123.

Začněme vizuálním znázorněním – diagram uvedený na obrázku výše zobrazuje hlavní komponenty Drupalu.

  1. Webový server rozpozná, že tento požadavek musí vyřídit prostředí PHP, a proto jej spustí (nebo kontaktuje), aby zpracovalo daný požadavek.
  2. Prostředí PHP spustí soubor index.php systému Drupal a předá mu cestu /node/123.
  3. Jádro Drupalu postoupí zaváděcí proces, přičemž inicializuje prostředky a následně použije systém nabídek, aby zjistilo, jak obsloužit požadavek na prostředek /node/123.
  4. Systém uzlů odpoví na daný požadavek nahráním uzlu s identifikátorem 123. Tato data se typicky nahrávají z databáze.
  5. Systém témat vzhledu převezme data uzlu a naformátuje je a aplikuje na ně styly – v podstatě je transformuje na kusy kódu jazyka HTML s přidruženými styly jazyka CSS.
  6. Jádro Drupalu dokončí zpracování (přičemž umožní spoustě dalších subsystémů provést svou část zpracování) a vrátí výsledná data klientovi.
  7. Webový prohlížeč klienta vizuálně prezentuje kód jazyků HTML a CSS uživateli a společně s tím spustí nezbytný kód jazyka JavaScript.
  8. Uživatel si prohlédne dokument.

Přestože tato ilustrace nepokrývá všechny technické detaily, nabízí letmý pohled na způsob fungování Drupalu na webu. Výše jste viděli, že za normálních podmínek nahraje prostředí PHP soubor index.php systému Drupal, aby si poradil s příchozím požadavkem. Tento krátký skript zodpovídá za spuštění prostředí Drupalu a je součástí části systému, jež se běžně nazývá jádro Drupalu.

Jádro Drupalu je základní vrstvou systému Drupal, kterou doprovází hrstka hlavních knihoven spolu s více než deseti hlavními moduly. Indexový soubor nahrává tyto knihovny a potom inicializuje systém Drupal v procesu nazývaném zavádění.

Hlavní knihovny Drupalu

Hlavní knihovny poskytují funkce a služby používané v celém Drupalu. Obsahují technické prostředky pro interakci s databází, lokalizace mezi jazyky, korekci uživatelských dat, tvorbu formulářů a zakódování dat. Tyto nástroje budeme nazývat pomůcky – zajišťují efektivní zpracování dat, ale nezodpovídají za obsluhu životního cyklu požadavku. Životní cyklus požadavku totiž obsluhují moduly.

Jakmile Drupal nahraje hlavní knihovny a inicializuje databázi, nahraje povolené moduly a témata vzhledu a posléze začne systematicky (krok za krokem) obsluhovat požadavek. Tento proces nazýváme životním cyklem požadavku. Ten funguje následovně. Drupal postupuje přes několik předurčených operací. Zkontroluje, jestli je nutné inicializovat nějaké moduly. Vyhledá zdrojový kód, jenž zodpovídá za zpracování dané adresy URL. Ověří, že aktuální uživatel smí přistupovat k požadovanému prostředku. Podívá se, jestli nenajde nějaká data ve vyrovnávací paměti. Pokračuje podobnými operacemi, dokud nedokončí zpracování požadavku.

Nejdůležitější věcí na tomto krokovaném postupu je však způsob, jak jej Drupal provádí :)

Háčky Drupalu

Systém Drupal se nesnaží zpracovávat všechny tyto kroky. Místo toho v každém kroku nabídne jednomu nebo několika modulům možnost vypořádat se s tímto krokem. Přeneseno do řeči Drupalu – nabízí modulům příležitost zaháknout se do životního cyklu.

Řekli jsme si například, že Drupal kontroluje, jestli je nutné inicializovat nějaké moduly. Ve skutečnosti dělá to, že se podívá, zda nějaké moduly implementují háček pro inicializaci. Jak to dělá? Prohledává nahrané moduly, aby zjistil, jestli některé z nich implementují funkci hook_init(). Háček implementujeme v Drupalu tak, že deklarujeme funkci, která se řídí vzorem pojmenování háčků. Kdybychom implementovali funkci hook_init() ve fiktivním modulu ahoj, deklarovali bychom funkci s názvem ahoj_init() (nahradili bychom tudíž slovo hook názvem daného modulu).

Vývojáři se znalostí objektově-orientovaného programování nebo s dobrou znalostí návrhových vzorů možná poznali, že tento princip je podobný obsluze událostí zachytávaných ve vzoru Pozorovatel. Pokud nastanou určité události, Drupal umožní modulům odpovědět na ně.

Systém Drupal nabízí skrz tento háček hook_init() modulům příležitost, aby inicializovali sebe nebo své prostředky hned na začátku zpracování požadavku. Až se všechny moduly inicializují, Drupal přejde k dalšímu kroku. Když zpracovává požadavek, volá háček za háčkem, a tak dává modulům šanci se připojit se svou troškou do mlýna. Nakonec provede ještě jedno volání pro moduly implementující háček hook_exit() a následně vrátí výsledná data klientovi a ukončí požadavek.

Systém háčků je pravděpodobně nejdůležitějším aspektem programování v Drupalu. Většina (pokud ne všechny) modulů není nic víc než skupina implementací háčků, které Drupal automaticky volá, jak postupuje životním cyklem požadavku. Jádro Drupalu není jediné, jež deklaruje a volá háčky. Libovolný modul může deklarovat a volat své vlastní háčky. Spousta modulů skutečně deklaruje své vlastní háčky, což umožňuje ostatním modulům napojit se na jejich služby.

Hlavní moduly Drupalu

Jak už víme, Drupal nabízí několik hlavních modulů. Tyto moduly nelze zakázat, protože jejich dovednosti se zapojují do standardní funkčnosti Drupalu. Hlavní moduly fungují stejně jako ostatní moduly (včetně těch, co budeme psát), a to implementováním háčků. Jak Drupal volá tyto háčky, jednotlivé hlavní moduly odpovídají dle potřeby, čímž se vykonávají klíčové funkce v určitém čase v průběhu zpracování požadavku. V následující části si podrobněji popíšeme některé hlavní moduly, přičemž si objasníme, k jakým účelům slouží.

Databáze

Dopřáli jsme si čilou procházku typickým zpracováním požadavku v Drupalu a zjistili jsme něco málo o modulech a knihovnách. Co však s databází? Na rozdíl od spousty jiných architektur v Drupalu nestojí databáze na čelním místě. Databázová vrstva není modul, ani moduly nemusí deklarovat svůj vztah s databází. Ve skutečnosti existují moduly, které s databází vůbec nekomunikují.

Na rozdíl od frameworků postavených na vzoru MVC (Model-View-Controller), Drupal nevyžaduje od svých modulů, aby se řídily tímto vzorem. Díky tomu může existovat modul, který nemá žádné databázové struktury (modely), centrální řadič, ani témata vzhledu (pohled).

Drupal tudíž nenakládá s databází jako centrální komponentou své architektury, ale pouze poskytuje rozhraní API pro práci s databází. V Drupalu je databáze pouhým místem, kam ukládáme svá data. Potřebujete vlastní tabulky? Drupal nabízí systém pro jejich deklaraci. Chcete získat data z databáze? Vložit je tam nebo je aktualizovat? K tomuto účelu Drupal poskytuje funkce a objektově-orientovanou knihovnu. Jestliže ale takové funkce ve svém zdrojovém kódu nepotřebujete, nemusíte pracovat s databází vůbec. Později si napíšeme náš první modul, aniž bychom museli napsat jediný dotaz v jazyce SQL. Jindy si vysvětlíme, jak komunikovat s databází prostřednictvím robustních databázových nástrojů Drupalu.

Víc než jen data

Do databáze Drupalu se ukládá kromě aplikačních dat (nebo obsahu) také konfigurace, vyrovnávací paměti, metadata (data o datech), strukturní informace a někdy dokonce kód jazyka PHP.

Přestože Drupal se nezaměřuje na databázi jako na hlavní součást, zcela jistě potřebuje databázi. Drupal se připojuje k databázi a načítá z ní konfigurační data. Později během toho, co se načítají některé hlavní moduly, kontaktují databázi, aby z ní získaly nebo v ní aktualizovaly informace. Pro většinu modulů je databáze místem, kam ukládají svá data.

Systém témat vzhledu

Poslední komponentou z našeho úvodního diagramu s architekturou je systém témat vzhledu. Drupal odděluje komponenty upravující vzhled od zbytku systému a nabízí programový způsob pro změnu vzhledu data. Systém starající se o tento problém nazýváme systém témat vzhledu.

Některé komponenty systému témat vzhledu sídlí v hlavních knihovnách Drupalu. Tato část zodpovídá za inicializaci témat vzhledu a vyhledávání vhodných funkcí a šablon za daných podmínek.

Většina zdrojového kódu pro řešení tohoto problému se však nachází v tématech vzhledu a modulech.

Téma vzhledu je strukturovaný svazek zdrojového kódu (podobně jako modul), jenž poskytuje nástroje pro transformaci prostých dat na formátovaná výstupní data. Pro webové stránky v Drupalu používáme alespoň jedno téma vzhledu, abychom dosáhli konzistentního vzhledu mezi všemi jejich stránkami.

Téma vzhledu ale neobsahuje veškerý svůj zdrojový kód. Jednou z nesporných výhod Drupalu je možnost definovat výchozí téma vzhledu v modulech. Dále nabízí mechanismy, s jejichž pomocí může vrstva témat vzhledu selektivně přepsat tyto témata vzhledu. Jinými slovy – modul může deklarovat hrubé rozvržení komponenty a Drupal poskytuje strukturu pro vývojáře témat vzhledů, aby mohli dodatečně upravit téma vzhledu (ne modul), a tím změnit rozvržení komponenty.