Po stručném úvodu do Perlu v předchozím článku nastal pravý čas k vytvoření první aplikace typu „Ahoj všichni“ (někdy též nepřesně překládáno do angličtiny jako „Hello world“). Proberme si nyní, jak by mohl takový FCGI script fungovat.

Osvědčilo se mi rozdělit skript do dvou funkčně odlišných částí. První z nich je samotná „výroba“ HTML kódu stránek a jeho odeslání do prohlížeče. Tato část je z pohledu databáze charakteristická především čtením. Druhá část scriptu se věnuje zpracování vstupu od uživatele (provádí akce, zapisuje do databáze). Pro řízení programu lze použít globální proměnnou $pg pro identifikaci stránek a proměnnou $op pro spouštění akcí v řídící sekci skriptu. Hodnoty $pg a $op ze stránky na server se předávají pomocí skrytých polí (<input type="hidden">) PG a OP.

Perl obsahuje pro výrobu HTML kódu, obsluhu http vstupu a výstupu objekt CGI. Jeho inicializace je jednoduchá: $query = new CGI();. S tímto si vystačíte v 99 % případů. Přes objekt $query pomocí metody $query->param() lze obdržet hodnoty všech prvků typu INPUT z příchozího GET nebo POST požadavku. A teď už následuje zdrojový kód první FCGI skriptu. Ještě jedna poznámka, pro čtenáře neznalé Perlu – znak „$“ uvozuje proměnnou, znak „#“ je symbol pro komentář v programu:

#!/usr/bin/perl -w
#Standardní hlavička, -w znamená povolení výpisu warningů do logu.
#Následuje sekce use, která do programu včlení pro běh nezbytné moduly
use strict;
use FCGI;
use CGI;
#Toto je sekce pro deklaraci globálních proměnných
use vars qw ($query $op $counter $pg);
#————————————————————————-
#PAGES
#sekce se zdrojovým kódem stránek
#————————————————————————-
#————————————————————————-
sub print_main_page {
#————————————————————————-
print $query->header(-type=>’text/html; charset=iso-8859-2′,
-expires=>’now‘,
-pragma=>’no-cache‘);
print $query->start_html(-title=>’Moje první aplikace‘);
print ‚<script>alert(„Ahoj všichni“);</script>‘;
print $query->end_html();
} #END OF print_main_page();
#————————————————————————-
#ACTIONS
#sekce pro zdrojový kód akcí
#————————————————————————-
sub do_something {
}# END OF do_something();
#————————————————————————-
# MAIN PROGRAM
#————————————————————————-
# MAIN CYCLE
while (FCGI::accept() >= 0) {
$counter++;
$query = new CGI();
$op = $query->param(‚OP‘);
$pg = $query->param(‚PG‘);
#————————————————————————-
# Řídící sekce akcí
#————————————————————————-
if ($op eq ‚do_something‘) { do_something(); }
#————————————————————————-
# Řídící sekce stránek
#————————————————————————-
if ($pg eq ‚main_page‘ or $pg eq “) { print_main_page(); }
#————————————————————————-
#Ukončení jednoho cyklu a dealokace proměnných
#————————————————————————-
undef @CGI::QUERY_PARAM;
undef $op;
undef $pg;
last if ($counter > 100);
}
#————————————————————————-
#Ukončení běhu FCGI scriptu po provedení 100 cyklů
FCGI::flush();
FCGI::finish();
FCGI::set_exit_status(0);
1;
#————————————————————————-
# END OF FILE
#————————————————————————-

A jako výsledek se v prohlížeči zobrazí následující stránka:

<html>
<head>
<title>Moje první aplikace</title>
</head>
<body>
<script>alert(„Ahoj všichni“);</script>
</body>
</html>

Může se to zdát málo, při pohledu na tu spoustu zdrojového kódu, který na to bylo potřeba, ale je nutno si uvědomit, že valná většina z tohoto skriptu zajišťuje vlastní běh aplikace a samotná tvorba stránky je pouze v proceduře print_main_page();.

Z výše uvedeného příkladu již vyplývá, jak se vlastně píší v Perlu webové aplikace. V podstatě modul CGI obsahuje celou řadu metod, které vracejí přímo kusy HTML kódu a ty potom stačí ve vhodném pořadí poskládat a následně pomocí příkazu print vytisknout na standardní výstup, v tomto případě na vstup HTTP serveru. Druhým přístupem, někdy bohužel nezbytným, je přímé psaní HTML kódů do FCGI skriptu a jeho vytištění opět pomocí příkazu print. Právě toto bylo prapůvodním důvodem k vývoji Masseru, který volně kombinuje jak HTML kód, tak perlovský kód. (Vzhledem a stylem psaní se poněkud podobá PHP, inspiraci tímto jazykem popírat nebudu.) Oproti „klasickému“ FCGI skriptu je, díky propracovanému systémů includů a napojení na databázi, velice modulární a produktivita práce programátora jde rapidně nahoru. Masser ideově vychází z modulu Pee, který můžete nalézt na Cpanu.

Metody a funkce modulu CGI

Předtím, než začneme probírat přímo Masser, považuj za nutné poněkud blíže seznámit vás s metodami a funkcemi modulu CGI. Vzhledem k tomu, že v tomto článku není prostor pro referenční příručku k modulu CGI, rád bych se zaměřil především na ty nejužitečnější a z mého pohledu nejpoužívanější metody a proměnné.

Vstupním typem prakticky všech metod je pole, seznam dvojic -klíč=>hodnota. Názvy klíčů jsou z velké většiny totožné s názvy parametrů HTML elementů, stejně tak je tomu u hodnot. Zde je příklad zápisu elementu pro textový vstup:

HTML: <input type=“text“ name=“field1″ class=“inputField“ size=“10″ onBlur=“delejNeco(this);“>
Perl: $query->textfield(-name=>’field1′, -class=>’inputField“, -size=>10, -onblur=>’delejNeco(this);‘);

Bezesporu nejpoužívanější jsou metody, pracující s hlavičkou a patičkou stránky, už proto, že bez nich žádnou stránku generovat vlastně nelze.

  • header(): Generuje HTTP hlavičku dokumentu. Nejdůležitějším vstupním parametrem je type, obsahující content-type dokumentu (defaultně je nastaveno „text/html“). Metoda header dále respektuje prakticky všechna nastavení pro hlavičku dokumentu, jako je pragma, expires a podobně.
  • start_html(): Generuje začátek elementů html, head, title, script, style a body. Pro element head jsou asi nejdůležitější následující parametry:
    • title=>’Název stránky‘ – vypíše název stránky
    • script=>$script – vloží mezi <script> a </script> obsah proměnné $script
    • style=>$style – vloží mezi <style> a </style> obsah $style
    • meta=>{‚metatag1′ =>’meta1‘ – vkládá metaelementy dle uživatelské definice

    Další parametry se týkají především elementu body. Použitím konstrukce attribute=>'attribute value' vygenerujete element body s příslušnými hodnotami atributů.

  • end_html(): V současnosti generuje pouze uzavírací tagy stránky (<body> <html>), ale v budoucnu, vzhledem k možným změnám a rozvoji HTML a XML, může generovat podstatně rozsáhlejší kód. Proto ji doporučuji důsledně používat, stejně jako níže uvedenou metodu pro uzavření formuláře.

V pořadí asi druhou nejpoužívanější sadou metod je při tvorbě HTML kódu sada pro generování formuláře a jednotlivých jeho elementů. Metody pro hlavičku a patičku formuláře uvádím níže, podrobného popisu všech metod pro tvorbu obsahu formuláře se dočkáte v příštím článku.

  • start_form(): Generuje počáteční tag elementu form. Obsahuje čtyři základní parametry:
    • method – informace o metodě předání požadavku (GET nebo implicitní POST)
    • action – URL skriptu, který formulář zpracuje (implicitně aktuální URL)
    • name – jméno formuláře
    • onSubmit – funkce, kterou prohlížeč vykoná při odeslání formuláře

    Kromě toho samozřejmě respektuje další vstupní parametry, podobně jako je tomu u body.

  • start_multipart_form(): Stejné použití a fukce jako u předchozí metody, pouze implicitně používá kódování „multipart/form-data“. Zde bych rád poznamenal, že pokud chcete umožnit uživateli upload souboru, je nezbytné použít právě tuto metodu, jinak bude input type="file" obsahovat pouze jeho název.
  • end_form(): Generuje uzavírací tag elementu (</form>).

Pozn. red.: Seriál musel být předčasně ukončen, protože autor nedodal slíbená pokračování. Máte-li zájem v seriálu pokračovat vlastními články, prosíme, kontaktujte redakci.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět