LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (85) - CGI - generování dokumentu modulem CGI

Perl Dnes postupně projdeme nejdůležitější funkce, jež nabízí modul CGI a podrobněji si rozebereme jejich možné parametry.

10.8.2009 01:00 | Jiří Václavík | Články autora | přečteno 8916×

Již víme, jak pomocí modulu CGI vytvořit jednoduchý HTML dokument. Uvedli jsme si základní použití fukcí, které si dnes rozebereme důkladněji.

Hlavička dokumentu

Hlavička rozhoduje o tom, jak se bude dále ubírat generování dokumentu. Buď se vygeneruje dokument, nebo, v případě přesměrování, se zavolá nějaká jiná stránka.

Poznámka - Obyčejně prohlížeč hlavičky nezobrazuje. Pokud bychom je chtěli kontrolovat, lze spouštět skript s textovým výstupem z příkazového řádku nebo využít například lynx.

$ lynx -mime_header http://localhost/cgi-bin/skript.cgi

Určení typu dokumentu

Hlavička standardně obsahuje několik informací, z nichž nejdůležitější je datový typ dokumentu. Často se zde setkáme s informacemi o nastavení jazyka, kódování, datu vypršení platnosti stránky apod.

Nejjednodušší volání funkce header je bez parametrů. V takovém případě se do výsledné stránky vygeneruje řetězec Content-Type: text/html.

header však navíc volitelně přijímá hash s určenou strukturou. Ta je dána seznamem následujících klíčů.

HlavičkaVýznam
-typeMIME typ generovaného dokumentu
-statusstavový kód vrácený webovým serverem
-charsetkódování
-attachmentje-li jako -type application/octet-stream, stránka bude otevřena jako příloha s daným názvem
-expiresdatum a čas nebo změna oproti okamžiku, kdy dokument ztratí platnost
-targetpodpora rámců
-cookiepodpora cookies (jim bude speciálně věnován příští díl)

Pomocí header je ale možné vytvořit libovolnou hlavičku. I přesto, že uvedeme klíč, jejž funkce header nerozpoznává, se vytvoří hlavička. Jejím jménem je automaticky klíč (bez úvodní pomlčky a s nahrazenými podtržítky) a hodnotou předaná hodnota prvku.

Přesměrování

Pokud nechceme generovat dokument, ale pouze přesměrovat jinam, použijeme funkci redirect, která funguje podobně jako header. Předáváme ji hash s hodnotami uvedenými v tabulce.

HlavičkaVýznam
-locationcelá URL adresa stránky, kam se bude přesměrovávat
-statusstavový kód vrácený webovým serverem (měl by mít standardně formát 3XX, což znamená "přesměrování požadavku")
-cookiepodpora cookies (jim bude speciálně věnován příští díl)

Hlavička HTML

Zatímco hlavičky dokumentu v předcházejícím oddílu mohly platit obecně, dále budeme předpokládat, že naše CGI skripty generují HTML dokumenty.

HTML potřebuje také svoji vlastní hlavičku. Ta obsahuje vše od určení DTD souboru pomocí <!DOCTYPE> až po element <BODY>. Dále následuje obsah dokumentu a na závěr je třeba vytisknout HTML patu, která zahrnuje elementy </BODY> a <HTML>.

Hlavičku generuje na základě předaných parametrů funkce start_html. Parametrem funkce start_html je hash, jehož rozpoznávané prvky jsou uvedené v tabulce.

KlíčVýznam
-titletitulek stránky
-encodingkódování, implicitně je nastaveno ISO-8859-1
-authorkontakt na autora
-baseurčuje adresář, vzhledem ke kterému se berou relativní odkazy
-dtdurčení DTD souboru
-langjazyk
-scriptpřípadné Javascript soubory
-noscriptobsah elementu NOSCRIPT
-metapřípadné další meta řádky, přidávají se parametry name a content
-headpřípadný další obsah HTML hlavičky
-styleumístění kaskádového stylu

Uvedeme-li prvek, který není funkcí start_html rozpoznán, je z něj vytvořen parametr elementu <BODY>.

Jako příklad HTML hlavičky si uveďme následující kód.

my $meta = {"keywords" => "linux software", "description" => "archiv softwaru pro linux"};
print start_html(
    -title=>"Linux Software",
    -author=>'autor@server.cz',
    -lang=>"cs",
    -encoding=>"ISO-8859-2",
    -meta=>$meta,
    -style=>"/styles/style.css",
    -bgcolor=>"green"
);

Ten vytvoří HTML hlavičku tak, jak ji vidíme v dalším výpisu.

<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="cs" xml:lang="cs">
<head>
<title>Homepage</title>
<link rev="made" href="mailto:autor%40server.cz" />
<meta name="keywords" content="linux software" />
<meta name="description" content="archiv softwaru pro linux" />
<link rel="stylesheet" type="text/css" href="/styles/style.css" />
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" />
</head>
<body bgcolor="green">

HTML obsah

Modul CGI obsahuje značné množství funkcí. Bylo by zbytečné zde uvádět kompletní přehled, neboť pro většinu elementů, které budeme potřebovat, s největší pravděpodobností platí, že jsou implementovány jako funkce se stejnými názvy jako elementy. Později si představíme pouze práci s formuláři, neboť ta je pro náš záměr klíčová. V tomto okamžiku si ukážeme pouze stručný úsek textu ze zdrojového kódu.

print h1("Vítejte");
print hr;
print start_p, "můžete mi napsat ";
print a({-href=>'mailto:muj@mail.cz'}, "email");
print end_p;

K němu snad jediný komentář. Výsledkem je řetězec na jediném řádku. To není u jazyka HTML podstatné, protože nebere bílá místa navíc v potaz. Máte-li zájem o přehledný výsledný HTML kód, je třeba na místech zalomení používat \n. Znak \n se promítne jako nový řádek do zdrojového kódu, ale nezmění výslednou podobu HTML dokumentu. Pro nový řádek v HTML se použije funkce br.

Autoloading

Pokud by vám zde i přes velké množství nějaký element scházel (například tehdy, máte-li svůj vlastní DTD soubor), je zde možnost autoloadingu. Lze tak volat metodu s prakticky libovolným názvem.

K tomu stačí zavést do programu modul s přepínačem -autoload.

use CGI qw(-autoload);

Pokud použijeme autoloading, pak musí mít každá funkce závorky i v případě, že jí nepředáváme žádný parametr.

Generování formulářů

Formuláře jsou základním HTML prvkem pro uživatelský vstup a následně tedy kritériem dynamičnosti. Z tohoto důvodu jim nyní budeme věnovat větší prostor.

HTML podporuje několik formulářových prvků, kterými uživatel ovlivňuje vstup. Jsou to tyto prvky.

  • skrytý text
  • jednořádkový text
  • víceřádkový text
  • heslo
  • soubor
  • zaškrtávací seznam
  • přepínací seznam
  • rozbalovací seznam
  • tlačítka

Pro všechny tyto prvky existují v modulu CGI příslušné funkce, které je generují.

Nicméně používat CGI pro generování formuláře, pokud se na základě nějakých vstupních dat jeho struktura nemění, není teoreticky vůbec nutné. Nutné je CGI pouze pro zpracování získaných hodnot. Chcete-li formuláře vytvářet staticky, můžete klidně následující část přeskočit.

Všechny prvky jednoho formuláře jsou uvnitř elementu FORM. Tento element určuje mimo jiné metodu odesílání dat a umístění, kam se budou data spolu s požadavkem posílat. Základní struktura každého formuláře tak bude vypadat takto.

use CGI qw(*form);
print start_form(-method=>"post", -action=>"/cgi-bin/form.cgi");
#...
print end_form;

Uvnitř budou jednotlivé prvky formuláře, které jsou vytvářeny konkrétními funkcemi. Každá z nich přijímá jako hodnotu minimálně jméno a implicitní hodnotu - tedy klíče -name (který je jako jediný vždy povinný) a -value v předávaném hashi.

Právě podle -name každý formulářový prvek vrací hodnotu zadanou uživatelem. Pokud jako -name použijeme slovo password, pak funkce param na základě identifikátoru password vrátí heslo zadané uživatelem.

Tlačítko

V HTML je několik typů tlačítek. My se budeme zabývat pouze tím nejdůležitějším - tlačítkem pro odeslání dat. K jeho vytvoření slouží funkce submit.

print submit(-name=>"akce", -value=>"Odešli data!");

Zadání textu a hesla

Funkce textfield resp. password_field vytvářejí prvky pro zadání jednořádkového textu resp. hesla. Dále je k dispozici funkce textarea pro textové pole.

print textfield(-name=>"url, -value=>"http://, -size=>50);

Seznamy

Funkce popup_menu vytváří rozbalovací seznam.

print popup_menu(-name=>"list, -value=>["textfield","password_field","textarea"], -default=>"textarea");

Zaškrtávací pole

Máme 2 funkce, které vytváří zaškrtávací pole. Pro skupinu polí se stejným jménem zde je checkbox_group a samostatné pole použijeme checkbox.

Zde je ukázka jednoduchého checkboxu. Je-li položka zaškrtnuta, automaticky se vrátí hodnota on.

print checkbox(-name=>"checkbox_name", -checked=>1, -label=>"I agre");

Skupinu zaškrtávacích políček se stejným jménem lze formátovat do daného počtu sloupců nebo řádků. Pomocí -colheaders nebo -rowheaders lze navíc dát jednotlivým sloupcům titulek.

print checkbox_group(-name=>"mesto", -values=>[qw(Praha Ostrava Brno Plzeň Liberec)], -columns=>2);

Přepínač

Přepínací pole se vytváří pomocí funkce radio_group. Funguje podobně jako skupina checkboxů s tím rozdílem, že nelze označit libovolný počet polí. Syntaxe je také totožná.

Skrytá hodnota

Velice často užívaný prvek hidden slouží pro předávání nějaké proměnné hodnoty, kterou však nezadává uživatel. Jeho typickým užitím je například uchování id uživatele, který mění údaje ve svém profilu. Sám uživatel o id nic neví a přesto bychom bez něj nevěděli, koho údaje změnit.

print hidden(-name=>"user_id", -default=>215);

Upload souboru

Na závěr uvedeme, jak lze získávat od uživatele soubory. K tomu je určena funkce filefield, jejíž volání může vypadat například takto.

print filefield(-name=>"jméno_souboru");

Zajímavější je obsluha takového formuláře. Na to použijeme funkci upload a získanou proměnnou dále používáme jako ovladač. Tento kód vytiskne obsah textového souboru na výstup.

$fh = upload("jméno_souboru");
while (<$fh>) {
    print;
}

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

13.9.2017 8:00 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

31.8.2017 12:11 / Jaromir Obr
Re: ukůládání dat ze souboru

30.7.2017 11:12 / Jaromir Obr
Národní znaky

27.7.2017 12:24 / Jaromir Obr
Cteni/zapis

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze