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/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ý modulsites/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.
Mohlo by vás také zajímat
-
Nejlevnější VPS: To je nový Cloud Server Mini od ZonerCloud
4. června 2024 -
Jak vybrat doménu: Co je dobré vědět?
2. září 2024 -
Jak se chránit před podvody na internetu – část 1
8. října 2024
Nejnovější
-
Co je to GPSR a jak ovlivní české e‑shopy?
28. ledna 2025 -
Apple jde naproti práci s HDR monitory!
17. ledna 2025 -
Jak využít AI potenciál svého Macu?
9. ledna 2025
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.