XHTML – element form, odesílání formuláře
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;
(atributyid
,class
,style
atitle
),
%i18n;
(atributylang
,xml:lang
adir
) a
%events;
(atributyonclick
,ondblclick
,onmousedown
,onmouseup
,onmouseover
,onmousemove
,onmouseout
,onkeypress
,onkeydown
aonkeyup
). 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ýtget
nebopost
, 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 tvarujmé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 metodaget
a formulář obsahuje ovládací prvky se jményrumcajs
acipisek
, kterým uživatel nastavil hodnotyles_raholec
. Výsledkem odeslání takového formuláře by bylo to, že by prohlížeč zažádal o URIskript.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 metodyget
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 atributuenctype
.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
) zvolilipost
– u metodyget
automaticky nabývá své implicitní hodnoty, tedyapplication/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.
Mohlo by vás také zajímat
-
AI a internetové podvody
29. října 2024 -
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Umělá inteligence v IT
27. září 2023
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024
chybi
Lis 20, 2013 v 13:21kdyz pises text tak uz tam prcnbi i nahled formulare at si clovek overi zda to funguje