Formulß°e IV.

Ji°φ Kosek ml.

Formulß°i jsme se zab²vali i v n∞kolika p°edchozφch dφlech serißlu. Dnes na nßs Φekajφ poslednφ prvky formulß°∙, kterΘ jsme dosud neprobrali.

Seznamy

K vytvo°enφ seznamu se pou₧φvß element SELECT. Pou₧ijeme ho v p°φpad∞, kdy chceme u₧ivateli nabφdnout mo₧nost v²b∞ru jednΘ z n∞kolika polo₧ek. Pokud pou₧ijeme atribut MULTIPLE, m∙₧e u₧ivatel vybrat i vφce polo₧ek ne₧ jednu. JmΘno vstupnφho prvku se op∞t urΦuje pomocφ atributu NAME. D∙le₧it²m atributem je SIZE, kter² urΦuje poΦet °ßdek, na kter²ch se seznam zobrazφ. Polo₧ky, kterΘ se do tohoto prostoru nevejdou, budou p°φstupnΘ rolovßnφm v seznamu.

JednotlivΘ polo₧ky seznamu se zapisujφ pomocφ elementu OPTION. Jako hodnota polo₧ky se skriptu p°edß text uveden² mezi tagy <OPTION> a </OPTION>. Text je vÜak mnohdy dlouh² a nevhodn² pro dalÜφ zpracovßnφ skriptem. Pokud u OPTION pou₧ijeme atribut VALUE, bude se p°enßÜet jeho obsah mφsto obsahu celΘho elementu.

Pokud mß b²t n∞jakß polo₧ka vybrßna ji₧ hned po zobrazenφ, oznaΦφme ji pomocφ atributu SELECTED.

UkonΦovacφ tag </OPTION> nemusφme ve v∞tÜin∞ p°φpad∙ v∙bec pou₧φvat -- uÜet°φme si tak psanφ:

<FORM ACTION=11-01.php3 METHOD=GET>
╚φsla Φasopis∙, o kterß mßte zßjem: 
<BLOCKQUOTE>
<SELECT NAME="Cisla[]" SIZE=6 MULTIPLE>
<OPTION>1/98
<OPTION>2/98
<OPTION>3/98
<OPTION>4/98
<OPTION>5/98
<OPTION>6/98
</SELECT>
</BLOCKQUOTE>
<P>Formßt, ve kterΘm chcete Φφsla obdr₧et: 
<SELECT NAME=Fmt SIZE=1>
<OPTION VALUE="HTML">HTML strßnka
<OPTION VALUE="PDF">Portable Document Format
<OPTION VALUE="PS" SELECTED>PostScript
<OPTION VALUE="ASCII">Textov² soubor
</SELECT>
<P>E-mail pro zaslßnφ: <INPUT NAME=Email>
<P><INPUT TYPE=SUBMIT VALUE="    OK    ">
</FORM>
Ve jmΘnu prvnφho seznamu jsme pou₧ili hranatΘ zßvorky (Cisla[]), aby PHP pro ·daje z tohoto prvku formulß°e vytvo°ilo pole. Je to nutnΘ, proto₧e u₧ivatel m∙₧e vybrat vφce Φφsel Φasopisu najednou (dφky atributu MULTIPLE).

U vstupnφho pole pro e-mailovou adresu jsme neuvedli typ pole. P°esto se jednß o textovΘ vstupnφ pole, proto₧e standardnφ hodnota atributu TYPE je TEXT.

Obr. 1: Ukßzka formulß°e se seznamy
Ukßzka formulß°e se seznamy

Informace z formulß°e podle pot°eby zpracujeme. Nßsleduje krßtkß ukßzka ze skriptu 11-01.php3, kterß vypφÜe hodnoty vypln∞nΘ do formulß°e:

<P>VybranΘ Φasopisy:<BR>
<?
    for ($i=0; $i<Count($Cisla); $i++):
        echo $Cisla[$i]."<BR>";
    endfor;    
?>
<P>Po₧adovan² formßt: <?echo $Fmt?>
<P>Zaslat na: <?echo $Email?>

Vφce°ßdkov² text

Pro vstup delÜφch text∙ je urΦen element TEXTAREA. Jeho jmΘno se urΦuje op∞t pomocφ atributu NAME. Krom∞ toho musφme pomocφ atribut∙ ROWS a COLS urΦit poΦet °ßdek a sloupc∙ vstupnφho pole.

P°i pou₧itφ musφme v₧dy pou₧φvat poΦßteΦnφ i ukonΦovacφ tag. Text mezi nimi se zobrazφ na zaΦßtku editace ve vstupnφm poli.

<TEXTAREA NAME="Poznamka" ROWS=4 COLS=40>
Sem m∙₧ete vepsat dalÜφ informace o objednßvce.
                        D∞kujeme
</TEXTAREA>

Obr. 2: Vstupnφ pole pro vφce°ßdkov² text
Vstupnφ pole pro vφce°ßdkov² text

Formulß°e na ·rovni

P°i vytvß°enφ webovsk²ch formulß°∙ mßme pom∞rn∞ velkou volnost. Nenφ tak problΘm vytvo°it formulß°, kter² je pro u₧ivatele nep°ehledn², nebo naopak formulß°, kter² je radost vypl≥ovat.

Vytvo°it p°ehledn² formulß°, zvlßÜt∞ pokud mß obsahovat mnoho vstupnφch polφ, je n∞kdy um∞nφ. I p°esto existuje n∞kolik zßsad, jejich₧ dodr₧ovßnφ nßm pom∙₧e vytvß°et pro u₧ivatele p°ehlednΘ formulß°e.

P°ehledn² formulß° mß jednotlivß vstupnφ pole jasn∞ oznaΦena a zarovnßna p°ehledn∞ pod sebou. K dosa₧enφ tohoto efektu lze vyu₧φt tabulku -- prvnφ sloupec bude obsahovat popis vstupnφho pole a druh² samotnΘ vstupnφ pole.

Celkem u₧iteΦnΘ je u₧ivateli napov∞d∞t v jakΘ form∞ mß data do jednotliv²ch vstupnφ polφ zadßvat. M∙₧eme tedy do tabulky p°ipojit t°etφ sloupec, kter² bude znßzor≥ovat ukßzkov∞ vypln∞nß data. Druhou mo₧nostφ je zobrazenφ ukßzkov²ch dat p°φmo ve vstupnφm poli s vyu₧itφm atributu VALUE. U₧ivatel pak pouze p°epφÜe p°edp°ipravenΘ ·daje.

Pro u₧ivatele je p°φjemnΘ, pokud vidφ cel² vypl≥ovan² formulß° najednou na obrazovce. Pokud pot°ebujeme od u₧ivatele tolik ·daj∙, ₧e se formulß° nevejde najednou na obrazovku, je lepÜφ vytvo°it n∞kolik strßnek s menÜφmi formulß°i, kterΘ postupn∞ od u₧ivatele vyzv∞dφ po₧adovanΘ ·daje.

Mnoho formulß°∙ na Webu (nap°. r∙znΘ registrace) vy₧adujφ vypln∞nφ pouze n∞kter²ch povinn²ch Φßstφ formulß°e. V t∞chto p°φpadech je vhodnΘ povinnß pole n∞jak odliÜit -- nap°. pou₧itφm v²razn∞jÜφho pφsma nebo barevnΘho pφsma u popisky pole.

Pokud obsluhujφcφ skript zjistφ, ₧e u₧ivatel nevyplnil vÜechny ·daje, po₧aduje dopln∞nφ chyb∞jφcφch. V tomto p°φpad∞ by se p°ed u₧ivatelem m∞l objevit formulß° s ji₧ zadan²mi daty. Bohu₧el na mnoha strßnkßch se v tomto p°φpad∞ objevφ nov² prßzdn² formulß° a u₧ivatel musφ zadßvat vÜe znovu. My si ukß₧eme, jak m∙₧e vypadat formulß°, kter² vy₧aduje vypln∞nφ urΦit²ch polφ, ale nabφzφ u₧ivateli pohodln² zp∙sob dopln∞nφ chyb∞jφcφch ·daj∙:

<HTML>
<HEAD>
<TITLE>Ukßzkov² formulß°</TITLE>
<STYLE TYPE="text/css">
<!--
    TD B { color: red }
-->
</STYLE>
</HEAD>
<BODY>
<?

$Formular = true; // p°φznak zobrazovßnφ formulß°e

if ($Odeslano=="true"):  // Byl formulß° odeslßn?

  if ($Jmeno=="" ||    // Kontrola vypln∞nφ
      $Prijmeni=="" || // povinn²ch ·daj∙
      $Email==""):

    echo "<H1>Musφte vyplnit vÜechny 
          povinnΘ ·daje!</H1>";
    echo "Jsou oznaΦeny tuΦn²m Φerven²m popisem.";

  else:     // Mßme povinnß data, zpracujeme je

    $Formular = false;
    // Zde se informace z formulß°e zpracujφ
    echo "<H1>D∞kujeme za registraci!</H1>";

  endif;

else:       // Formulß° je zobrazovßn poprvΘ

  echo "<H1>Pro zaregistrovßnφ vypl≥te tento
        formulß°!</H1>";
  echo "PovinnΘ ·daje jsou oznaΦeny tuΦn²m
        Φerven²m popisem.";

endif;

?>

<? if ($Formular): // mß se zobrazovat formulß°? ?>
<FORM METHOD=POST>
<TABLE BORDER=0>
<TR>
<TD><B>JmΘno:</B>
<TD><INPUT NAME=Jmeno 
           VALUE="<?echo $Jmeno?>" SIZE=30>
<TR>
<TD><B>P°φjmenφ:</B>
<TD><INPUT NAME=Prijmeni
           VALUE="<?echo $Prijmeni?>" SIZE=30>
<TR>
<TD>Pohlavφ:
<TD><INPUT TYPE=RADIO NAME=Pohlavi VALUE="Muz"
     <?echo $Pohlavi=="Muz" ? " CHECKED" : ""?>>
    Mu₧&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    <INPUT TYPE=RADIO NAME=Pohlavi VALUE="Zena"
     <?echo $Pohlavi=="Zena" ? " CHECKED" : ""?>>
    Äena
<TR>
<TD><B>E-mail:</B>
<TD><INPUT NAME=Email 
           VALUE="<?echo $Email?>" SIZE=30>
<TR>
<TD>WWW strßnka:
<TD><INPUT NAME=Web 
           VALUE="<?echo $Web?>" SIZE=30>
<TR>
<TH COLSPAN=2><INPUT TYPE=SUBMIT
               VALUE="    Registrace    ">    
</TABLE>
<INPUT TYPE=HIDDEN NAME=Odeslano VALUE=true>
</FORM>
<? endif ?>

</BODY>
</HTML>
Cel² skript si zajistφ jist∞ mal² komentß°. V²sledkem skriptu mohou b²t t°i odliÜnΘ strßnky -- viz obrßzky 3-5. Pokud je skript vyvolßn u₧ivatelem poprvΘ, zobrazφ se prßzdn² formulß°. Pokud u₧ivatel formulß° odeÜle, mohou nastat dva p°φpady. Pokud jsou vÜechny povinnΘ ·daje vypln∞ny, skript zobrazφ pouze potvrzenφ registrace. Pokud n∞jak² povinn² ·daj chybφ, zobrazφ se formulß°, kter² obsahuje ji₧ d°φve vypln∞nß pole a po₧aduje dopln∞nφ chyb∞jφcφch polφ.

Skript na obsluhu dat z formulß°e volß sßm sebe, a proto nemusφme u elementu FORM uvßd∞t pomocφ atributu ACTION jmΘno skriptu urΦenΘho pro zpracovßnφ formulß°e.

Jak skript poznß, zda je u₧ivatelem vyvolßn poprvΘ nebo zda jen u₧ivatel nevyplnil ₧ßdnΘ pole? Do formulß°e jsme p°idali skrytΘ pole (TYPE=HIDDEN). Toto pole se nezobrazuje, ale jeho hodnota se p°enßÜφ s ostatnφmi ·daji z formulß°e. Podmφnkou

if ($Odeslano=="true"):  
tak snadno otestujeme, zda do skriptu ji₧ putujφ ·daje z formulß°e nebo zda je spouÜt∞n poprvΘ.

V dalÜφ Φßsti skriptu testujeme, zda vÜechna povinnß pole obsahujφ n∞jakou hodnotu. Pokud ne, vypφÜeme zßhlavφ strßnky, kterΘ po₧aduje dopln∞nφ chyb∞jφcφch ·daj∙. Pokud jsou vÜechna povinnß pole vypln∞na, pod∞kuje skript za vypln∞nφ formulß°e.

DalÜφ v∞tev skriptu pat°φ k prvnφ podmφnce. Provede se pouze pokud je skript volßn u₧ivatelem poprvΘ a vyzve ho k vypln∞nφ formulß°e.

Nßsleduje samotn² HTML k≤d pro zobrazenφ formulß°e. Tento k≤d se do prohlφ₧eΦe odeÜle pouze, pokud mß prom∞nnß $Formular hodnotu true. Tato prom∞nnß je nastavena na hodnotu false, pokud skript obdr₧el vÜechna povinnß pole a my tedy ji₧ po u₧ivateli nechceme doplnit ₧ßdnΘ ·daje.

Jako hodnotu atributu VALUE u jednotliv²ch vstupnφch polφ uvßdφme krßtk² PHP skript, kter² doplnφ obsah tohoto pole z poslednφho odesφlanΘho formulß°e. Tφm mßme zaruΦeno, ₧e pokud u₧ivatel vyplnφ pouze n∞kterΘ ·daje a je po₧ßdßn o dopln∞nφ chyb∞jφcφch povinn²ch ·daj∙, nemusφ znovu vypl≥ovat zbytek formulß°e. P°i prvnφm spuÜt∞nφ skriptu neobsahujφ pou₧itΘ prom∞nnΘ ₧ßdnou hodnotu a vstupnφ pole budou prßzdnß (viz obr. 3).

Zatφmco dopln∞nφ hodnoty textovΘho vstupnφho pole je jednoduchΘ, u p°epφnacφch tlaΦφtek je situace pom∞rn∞ slo₧itß. Pokud mß b²t tlaΦφtko zaÜkrtnuto, je pot°eba u p°φsluÜnΘho tagu <INPUT> uvΘst atribut CHECKED. Pou₧ili jsme proto konstrukci:

<?echo $Pohlavi=="Muz" ? " CHECKED" : ""?>
Ta pou₧φvß specißlnφ operßtor podmφnka ? v²raz1 : v²raz2. Pokud je podmφnka spln∞na je v²sledkem v²raz1, jinak v²raz2. Pokud jsme tedy odeslali formulß° se zaÜkrtnut²m tlaΦφtkem mu₧, vrßtφ skript p°epφnacφ tlaΦφtko:
<INPUT TYPE=RADIO NAME=Pohlavi VALUE="Muz" CHECKED>
Pokud nebylo pohlavφ mu₧ vybrßno, dorazφ naopak:
<INPUT TYPE=RADIO NAME=Pohlavi VALUE="Muz">
a tlaΦφtko tedy z∙stane nezaÜkrtnutΘ.

Obr. 3: Formulß° p°i prvnφm naΦtenφ
Formulß° p°i prvnφm naΦtenφ

Obr. 4: Zapomn∞li jsme vyplnit e-mailovou adresu
Formulß° ₧ßdß dopln∞nφ ·daj∙

Obr. 5: VÜe je v po°ßdku -- jsme zaregistrovßni
Jsme zaregistrovßni
© Ji°φ Kosek 1999