V tomto článku si probereme element form, sloužící jako ohraničující prvek formulářů v XHTML. Také si trochu přiblížíme způsob, jakým se formuláře odesílají.

Element form – ohraničení formuláře

Povolený obsah: %form.content;

Atributy:

%attrs;

Tato parametrická entita obsahuje další parametrické entity:
%coreattrs; (atributy id, class, style a title),
%i18n; (atributy lang, xml:lang a dir) a
%events; (atributy onclick, ondblclick, onmousedown, onmouseup, onmouseover, onmousemove, onmouseout, onkeypress, onkeydown a onkeyup).

action       %URI;       #REQUIRED

Tento atribut určuje URI adresu skriptu, který formulář zpracuje (tzv. cílový skript) – tedy de facto URI, kam se má interpret XHTML přemístit (a poslat sem data z formuláře) po odeslání formuláře uživatelem.

method       (get|post)       'get'

Tento atribut definuje metodu, kterou mají být data z formuláře předána cílovému skriptu (nastavenému atributem action). Hodnotou může být get nebo post, přičemž get je implicitní – nemusíme ji nastavovat a můžeme v takovém případě tento atribut vynechat.

Při metodě get jsou data z formuláře připojeny za URI cílového skriptu ve tvaru jméno=hodnota. URI cílového skriptu a jednotlivé údaje o ovládacích prvcích jsou odděleny otazníkem (?) a údaje o ovládacích prvcích jsou od sebe odděleny ampersandem (&).

Představte si tento příklad: URI cílového skriptu je skript.php, pro odeslání je nastavena metoda get a formulář obsahuje ovládací prvky se jmény rumcajs a cipisek, kterým uživatel nastavil hodnoty les_raholec. Výsledkem odeslání takového formuláře by bylo to, že by prohlížeč zažádal o URI skript.php?rumcajs=les_raholec&cipisek=les_raholec.

Při využití metody post jsou po odeslání formuláře jména a hodnoty ovládacích prvků zařazeny do těla HTTP požadavku o cílový skript (narozdíl od metody get se tedy použití této metody nijak neprojeví na výsledném URI). O tom, v jakém tvaru se data nalézají, rozhoduje hodnota atributu enctype.

Obě metody mají své specifické klady i zápory, a proto každá z nich nalezne využití v jiných případech.

enctype       %ContentType;       'application/x-www-form-urlencoded'

Tento atribut specifikuje pomocí MIME-typu způsob zakódování formulářových dat po odeslání uživatelem. Využít ho lze pouze v případě, že jste jako metodu odeslání (atribut method) zvolili post – u metody get automaticky nabývá své implicitní hodnoty, tedy application/x-www-form-urlencoded (tu má i v případě, že ho neuvedete).

accept       %ContentTypes;       #IMPLIED

Tento atribut se používá v případě, že je ve formuláři možné odeslat soubor (pomocí speciálního ovládacího prvku). Říkáte pomocí něj, jaké formáty souborů je server schopen správně zpracovat. Interpret XHTML poté například může uživateli dovolit vybírat jen soubory těchto formátů.

Hodnotou tohoto atributu je MIME-typ; případně jejich seznam, kde jsou od sebe jednotlivé MIME-typy odděleny čárkou.

Tento atribut je možné využít i u každého ovládacího prvku, umožňujícího odeslat s formulářem soubor.

accept-charset       %Charsets;       #IMPLIED

Pomocí tohoto atributu udáváte, v jakém kódování se mají nacházet odesílaná data. Jeho hodnotou je jméno kódování, případně jejich seznam, kde jsou od sebe jednotlivá kódování oddělena mezerou. Interpret XHTML musí všechna data odeslat v jednom z uvedených kódování (nemůže tedy použít různá kódování pro různé bloky dat) a měl by zároveň zabránit uživateli vkládat znaky, které nelze vyjádřit pomocí daného kódování či escape-sekvencí (viz dále).

Pokud není tento atribut uveden, může interpret XHTML použít k zakódování dat kódování, ve kterém se nachází dokument s formulářem – ale nemusí, takže se na to raději nespoléhejte a accept-charset vždy nastavte.

onsubmit       %Script;       #IMPLIED

Tato událost je aktivována ve chvíli, kdy uživatel formulář odešle. Používá se často ke kontrole zadaných dat na straně prohlížeče.

onreset       %Script;       #IMPLIED

Tato událost je aktivována ve chvíli, kdy jsou ovládací prvky formuláře uživatelem nastaveny na výchozí hodnoty (pomocí speciálního ovládacího prvku).

Element form v XHTML 1.0 Strict DTD

Element form je jakýmsi kontejnerem pro ovládací prvky formuláře. Nastavují se pomocí něj parametry pro odeslání formuláře. Hodnoty všech ovládacích prvků, které se v něm nachází, jsou při jeho odeslání připojeny k požadavku o cílovou stránku. Pokud ovládací prvky nepoužíváte k odeslání dat na server, ale například pouze ve spojení s klientskými skripty, nemá již element form žádné opodstatnění a můžete ho klidně vynechat.

Obsahem elementu form mohou být všechny elementy z parametrické entity %Block; kromě elementu form (formuláře se nesmí vnořovat) – to nám říká parametrická entita %form.content;. Obsahem formuláře tedy nemůže být přímo text – ten se musí nacházet uvnitř nějakého dalšího elementu, obvykle odstavce. Stejně tak se přímo v elementu form nemohou vyskytovat ani ovládací prvky formuláře, ale také musí být „obaleny“ například odstavcem.

Odesílání formuláře

Po odeslání formuláře interpret XHTML nejprve vytvoří soubor všech jmen ovládacích prvků a jejich hodnot (v pořadí, v jakém se vyskytují ve zdrojovém kódu) – pokud nemá nějaký prvek přiřazené jméno nebo nemá nastavenou žádnou aktuální hodnotu, nemusí ho interpret XHTML do tohoto souboru zařazovat. Tento soubor poté zakóduje podle hodnoty atributu enctype. Ten může mít buď implicitní hodnotu application/x-www-form-urlencoded, hodnotu multipart/form-data nebo jakoukoliv jinou – zde záleží na požadavcích a možnostech různých aplikací, hodnota ale musí být registrovaným MIME-typem. Specifikace hovoří pouze o prvních dvou, které jsou také běžně podporovány v prohlížečích.

Při hodnotě application/x-www-form-urlencoded je s daty nakládáno tak, jak jsem již popsal u atributu method, respektive jeho hodnoty get. To znamená, že data z formuláře jsou připojena za URI cílového skriptu ve tvaru jméno=hodnota. URI cílového skriptu a jednotlivé údaje o ovládacích prvcích jsou odděleny znakem ? a údaje o ovládacích prvcích jsou od sebe odděleny ampersandem (&).

Tento způsob zakódování formulářových dat ale nese jedno omezení. Ve jménech a hodnotách ovládacích prvků se smějí používat pouze písmena a čísla ASCII (tedy bez háčků a čárek) – pokud se zde vyskytuje jiný znak, je nahrazen escape-sekvencí, která reprezentuje znak pomocí šestnáctkových čísel udávajících jeho pořadí ve znakové sadě, ve které mají být data odeslána (pouze mezera je nahrazena znakem +) – ta se nastavuje pomocí atributu accept-charset.

Při použití metody multipart/form-data je celý soubor formulářových dat odesílán v těle HTTP požadavku (tento způsob zakódování je tedy dostupný pouze při method='post') a zakóduje se do formátu MIME, přičemž co ovládací prvek, to jedna část požadavku MIME. Důležité je, že každá část může mít své vlastní hlavičky informující o formátu a kódování dané části – díky tomu nemusí být žádné znaky nahrazovány entitami, mohou být posílána data jakéhokoliv druhu (například binární soubory) a to vše může být na serveru bez problémů rozpoznáno.

Jaký způsob odeslání zvolit?

Jak vidíte, nabízí nám formuláře v XHTML poměrně pestré možnosti odeslání. Proto byste měli vědět, jaké výhody a nevýhody s sebou nesou jednotlivé alternativy, a podle toho jich optimálně využívat.

Nejjednodušším způsobem odeslání formuláře je metoda get, kdy je soubor hodnot připojen za cílové URI ve formátu application/x-www-form-urlencoded. Hlavní výhoda tohoto způsobu je, že jsou data součástí URI, a tak může být na výslednou stránku odkazováno, uživatel si může její adresu uložit do oblíbených a přistupovat k ní znovu po čase… V praxi se nám to hodí hlavně u formulářů pro vyhledávání (to je poměrně častým a efektivním způsobem navigace, a proto by mělo být možné se na něj odkazovat) a u dalších kratších formulářů, kde se nepředpokládají delší zadané hodnoty – délka URI může být limitována možnostmi různých aplikací, navíc nahrazování nepovolených znaků pomocí escape-sekvencí není příliš efektivní.

Pokud ale odeslání formuláře má určitý postranní efekt (například při registraci uživatele, kdy je přidáván záznam do databáze) nebo nechceme, aby odeslané hodnoty byly vidět „přes rameno“ uživatele (například při přihlašování pomocí hesla), potom bychom měli použít metodu post, kdy jsou data součástí těla HTTP požadavku. K takové stránce již není jednoduché se znovu dostat (její URI nelze uložit do oblíbených ani poslat e-mailem) a navíc odeslané hodnoty nejsou vidět v adresním řádku prohlížeče.

U metody post se také můžeme rozhodnout, jaký způsob zakódování dat použijeme. Při application/x-www-form-urlencoded budou data zakódována stejně jako při použití metody get – jakýkoliv „nepovolený“ znak je zde nahrazen pomocí escape-sekvence, což znamená, že ve výsledku zabere víc bitů než při jeho normálním zápisu. Proto není tento způsob kódování vhodný pro data, kde se vyskytují delší řetězce „nepovolených“ znaků. V těchto případech (tedy u formulářů, kde je očekáváno zadání delšího textu, například při přidávání příspěvků do diskuse) byste měli používat způsob kódování multipart/form-data. Tento způsob také musíte použít, pokud umožňujete pomocí formuláře odeslat uživateli soubor.

Příklady

Nejprve si ukážeme jednoduchý formulář, odesílaný metodou get:

<form action=’http://server.cz/skript_na_zpracovani_formulare.jsp‘ accept-charset=’UTF-8 iso-8859-2 windows-1250′>
… obsah formuláře …
</form>

Formulář může v tomto případě být odeslán v jednom z uvedených kódování. Na dalším příkladu si ukážeme použití metody post:

<form action=’zpracuj_formular.asp‘ method=’post‘ accept-charset=’us-ascii‘>
… obsah formuláře …
</form>

V tomto případě budou akceptována pouze data ve znacích ASCII – interpret XHTML by neměl uživateli povolit zadání jiných znaků (ty nemohou být zakódovány ani pomocí escape-sekvencí, protože není definováno žádné kódování, na které by se tyto sekvence mohly odkazovat).

V dalším příkladu si ukážeme formulář využívající způsob kódování multipart/form-data. Budeme přitom předpokládat, že obsahem formuláře je i ovládací prvek pro připojení souboru – pomocí atributu accept říkáme, které formáty jsou povoleny:

<form action=’formular.phtml‘ method=’post‘ enctype=’multipart/form-data‘
      accept-charset=’UTF-8′ accept=’text/plain‘>
… obsah formuláře …
</form>

Tento formulář tedy předepisuje kódování odesílaných dat UTF-8, přičemž povoluje vkládat pouze textové soubory.

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

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

1 Příspěvěk v diskuzi

Odpovědět