Vývoj modulů pro CMS systém Drupal 6.x (2. díl)
V tomto druhém pokračování seriálu o vývoji modulů pro Drupal nahlédneme hlouběji do systému samotného. Probereme souborový systém a zpracování požadavků Drupalem.
Souborový systém
Drupal má vlastní souborový systém, který musíme při vývoji a správě obsahu respektovat. V krátkosti projdeme všechny hlavní adresáře a zmíníme se o důležitých podadresářích.
| includes | Obsahuje základní soubory jádra Drupalu. | 
| misc | Obsahuje JavaScriptový kód, miscellaneous (v překladu znamená miscellaneous „různého druhu“) ikony a obrázky, které jsou aktivní během instalace systému. | 
| modules | Zde jsou obsaženy základní moduly jádra Drupalu. Každý z modulů ve své vlastní složce. Rozhodně nedoporučuji (jak jsme se již zmiňovali) tuto složkou používat k uložení rozšiřujících modulů (i když se z funkčního hlediska o chybu nejedná). | 
| profiles | Složka pro profily Drupalu z nichž si můžeme vybrat (pokud není prázdná) při instalaci a ovlivnit tak jádro a nastavení Drupalu. Dobrým příkladem je profil pro elektronický obchod (e-commerce). | 
| sites | V tomto adresáři by měli být uloženy všechny vaše modifikace sítě. Do složky site/all/modulesbudeme ukládat vlastní moduly a do složkysite/all/themesvlastní themes. | 
| themes | Obsahuje template engines (které interpretují skriptovací jazyky v nichž jsou napsány themes) a základní themes. | 
Shrnutí: vlastní modifikace Drupalu budeme ukládat do těchto složek:
- sites/all/modules– pokud půjde o nový modul
- sites/all/themes– pokud půjde o nové theme
Upozornění: při instalaci Drupalu (přesněji některých verzí) se vytvoří pouze adresář sites/all/, podadresáře modules a themes je třeba vytvořit dodatečně a ručně. Častou začátečnickou chybou je nahrát modul přímo do adresáře sites/all/. Z tété lokace jsou však moduly pro Drupal neviditelné.
Zpracování požadavku
Při vývoji modulů je velice užitečné mít rámcový přehled o tom, jak Drupal zpracovává požadavky (requests) na jejichž základě generuje stránky pro návštěvníky.
Na proces se podíváme jen v nezbytné míře a pokud chcete získat komplexnější náhled do zpracování požadavku Drupalem, doporučuji studium souboru index.php (ten zpracovává většinu requestů Drupalu) s debuggerem a velkou dávkou trpělivosti. Zmíníme se o některých důležitých souborech a funkcích, které jsou za proces odpovědné, což by mohlo být pro vás užitečné v případě hlubšího studia problematiky.
Celý proces od zavolání souboru index.php po vygenerování HTML kódu požadované stránky můžeme rozdělit do dvou částí:
- Bootstrap proces – zaváděcí proces
- Theming – vygenerování konečného HTML kódu na základě aktivního theme a dat z databáze
Bootstrap proces (zaváděcí proces)
Zaváděcí proces je prvním z procesů, kterým začíná zpracování požadavku od uživatele. Jeho vykonání zajišťuje první kódový řádek v souboru index.php:
require_once './includes/bootstrap.inc';
Zaváděcí proces je definován v souboru includes/bootstrap.inc. Zde se také v komentářích můžeme dočíst, že se proces skládá z následujících částí:
- inicializace a konfigurace
- ranná page cache
- inicializace databázové vrstvy
- identifikace uživatele a případné odmítnutí přístupu
- session
- pozdní page cache
- paths inicializace
- konečné načtení Drupalu
Během zaváděcího procesu jsou mimo jiné inicializovány mnohé globální proměnné a načteny funkce, z nichž některé budeme později používat ve svých modulech a zde se o nich v souvislosti s zaváděcím procesem zmíníme.
Proces zavádění probíhá vždy, když dostane Drupal žádost o nějakou stránku, ale nemusí proběhnout celý (může například skončit odmítnutím přístupu nebo načtením stránky z page cache). Výsledkem zaváděcího procesu je načtení mohutného frameworku Drupalu, který je použit pro příjem a zpracování požadavku a ke konečnému vygenerování HTML stránky, která je zaslána návštěvníkovi.
Poznámka: již v souboru bootstrap.inc je definována řada funkcí a proměnných, které budeme později (při psaní modulů) používat, jedná se například o funkce: variable_get, variable_set, drupal_get_filename, drupal_set_message apod.
Inicializace a konfigurace
Za fázi inicializace je odpovědná funkce conf_init, která se nachází v souboru bootstrap.inc. Během procesu dochází k nastavení základních globálních proměnných (base_url, base_path, base_root a dalších). Během tohoto procesu je také parsován soubor settings.php, z něhož jsou vyčteny hodnoty některých globálních proměnných.
Ranná page cache (non-database cache)
Jedná se o cachování, který proběhne ještě před připojením do databáze, tu zde nahrazují soubory. Cachování urychluje běh systému a ve chvíli, kdy se v souborové cache nachází právě požadovaná stránka, odpadá nutnost jejího vytváření (a tím i mnoho dotazů do databáze).
Inicializace databázové vrstvy
Během tohoto procesu jsou nejprve načteny funkce ze souboru database.inc, kde se nachází všechny funkce, které souvisejí s prací s databází: db_query, db_set_active apod. Následně dojde k připojení do databáze voláním funkce db_set_active. Funkce db_set_active se nachází v souboru database.inc.
Tip: Referenci k databázové vrstvě (přesněji bychom měli psát Database abstraction layer) naleznete na adrese http://api.drupal.org/api/group/database/6.
Identifikace uživatele a případné odmítnutí přístupu
Během procesu dojde k rozhodnutí o tom, zda uživatel má do systému přístup. K rozhodnutí o zamítnutí přístupu dojde prostřednictvím voláním funkce drupal_is_denied, která se nachází v souboru bootstrap.inc a obsahuje jeden SELECT dotaz do databáze.
Session
Drupal používá sessions. Během fáze, kdy dochází k inicializaci sessions je načten soubor session.inc (obsahuje funkce které se sessions souvisí) a volána funkce session_start.
Pokud je vám cizí vlastní pojem session a rádi byste se dozvěděli více, doporučuji například články Začínáme používat sessions v PHP a Pracujeme se session v PHP.
Pozdní page cache
Jedná se o page cache, který probíhá po připojení k databázi a data (konkrétní stránky nebo jejich části) jsou také z databáze vyčítána.
Paths inicializace
Je načten soubor path.inc a volána funkce drupal_init_path. Funkce drupal_init_path inicializuje proměnnou $_GET['q'], ke které se později vrátíme (budeme s ní v modulech pracovat).
Dokončení procesu
Je načten soubor common.inc, v němž se nacházejí mnohé další základní funkce, a dále je volána funkce _drupal_bootstrap_full (která se nachází v právě načteném souboru common.inc). V této funkci jsou načteny další soubory: theme.inc, pager.inc, menu.inc a další. Dále je voláno několik inicializačních funkcí, z nichž je pro nás nejzajímavější funkce module_load_all (funkce je definována v souboru module.inc), která načte všechny aktivní moduly. Funkce module_load_all je velice jednoduchá, pouze volá dvě daší funkce:
function module_load_all() {
  foreach (module_list(TRUE, FALSE) as $module) {
    drupal_load('module', $module);
  }
}
Funkce module_list se také nachází v souboru module.inc a vrací seznam aktivních modulů. Funkce drupal_load je definována v souboru bootstrap.inc a slouží k načtení souboru, jehož název je předán parametrem. Zaváděcí proces zakončuje druhý programový řádek v souboru index.php:
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Theming
Po zavedení systému je Drupal připraven přejít do další fáze, kde již zpracovává konkrétní request. Konkrétním požadavkem může být například URL http://www.vasesite.cz/q=node/123. Generování dat, která se mají zobrazit, začíná načtením menu (funkce menu_execute_active_handler) a následuje theming (funce theme) a připojení patičky (funkce drupal_page_footer) – výsledkem procesu je HTML stránka, která je zaslána uživateli jako odpověď na jeho požadavek.
Za tento proces je odpovědný zbytek souboru index.php:
$return = menu_execute_active_handler();
// Menu status constants are integers; page content is a string.
if (is_int($return)) {
  switch ($return) {
    case MENU_NOT_FOUND:
      drupal_not_found();
      break;
    case MENU_ACCESS_DENIED:
      drupal_access_denied();
      break;
    case MENU_SITE_OFFLINE:
      drupal_site_offline();
      break;
  }
}
elseif (isset($return)) {
  // Print any value (including an empty string) except NULL or undefined:
  print theme('page', $return);
}
drupal_page_footer();
Závěr
Nahlédli jsme hlouběji do systému a měli bychom mít základní přehled, jak Drupal pracuje. Na znalosti z tohoto i předcházejícího dílu seriálu prakticky navážeme v dílu následujícím, v němž se orientačně seznámíme s databází Drupalu a začneme vývoj prvního modulu: hlasování pro článek.
 
											
											 
											
											 
											
											 
											
											







Ivan Jaroš
Lis 6, 2009 v 22:20„Častou začátečnickou chybou je nahrát modul přímo do adresáře sites/all/“
Omnoho castejsiou a väcsou chybou je umiestnovanie modulov a tem do korenovych adresarov /modules a /themes.
anonym
Lis 25, 2009 v 18:46nejak ten zajimave vypadajici serial umrel :(
Jan Sova
Lis 25, 2009 v 21:55Nezemrel! Nebojte, jsou jiz pripraveny k publikovani dalsi dva dily a pokud bude zajem ctenaru, pokracujeme dal (vlastne jiz pisi dalsi tri).
Honza Sova
Miroslav Kučera
Lis 25, 2009 v 22:11Potvrzuji, neumrel :-) Zitra vyjde dalsi dil.