Vývoj modulů pro CMS systém Drupal 6.x (2. díl)

5. listopadu 2009

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/modules budeme ukládat vlastní moduly a do složky site/all/themes vlastní 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í:

  1. inicializace a konfigurace
  2. ranná page cache
  3. inicializace databázové vrstvy
  4. identifikace uživatele a případné odmítnutí přístupu
  5. session
  6. pozdní page cache
  7. paths inicializace
  8. 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.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

4 komentářů

  1. 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.

    Odpovědět
  2. anonym

    Lis 25, 2009 v 18:46

    nejak ten zajimave vypadajici serial umrel :(

    Odpovědět
  3. Jan Sova

    Lis 25, 2009 v 21:55

    Nezemrel! Nebojte, jsou jiz pripraveny k publikovani dalsi dva dily a pokud bude zajem ctenaru, pokracujeme dal (vlastne jiz pisi dalsi tri).

    Honza Sova

    Odpovědět
  4. Miroslav Kučera

    Lis 25, 2009 v 22:11

    Potvrzuji, neumrel :-) Zitra vyjde dalsi dil.

    Odpovědět

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *