Dnes si ukážeme, jakým způsobem se v ASP zpracovávají formulářové hodnoty SELECTů, CHECKBOXů, RADIO buttonů a jak rozeznávat, které tlačítko bylo ve formuláři stisknuto. Také si ukážeme, jak nenutit uživatele vyplňovat formulář neustále znovu, pokud například vyplní jednu z položek špatně a jak tyto chyby ve formulářích zpracovávat.

Testování chyb, které je jednoduché na provedení a přitom vysoce funkční, může pracovat na tomto principu: stránka s formulářem v sobě obsahuje v podstatě dvě části. Část s formulářem, který se zobrazí standardně při načtení této stránky do prohlížeče. Tento formulář odesílá data sám na sebe. Skript na začátku stránky vyhodnotí, zda jsou mu předána nějaká data z formuláře – pokud ano, data nějakým způsobem zpracuje a zobrazí jakousi „druhou část“ stránky s výsledkem (nebo třeba odešle mail, uloží do databáze apod.). Pokud nejsou předávána žádná data nebo je v nich chyba, zobrazí opět první část stránky s formulářem, do kterého před-vyplní údaje, které byly správně a současně zobrazí chybové hlášení.

Teď si povíme o formulářích naprosto základní informaci: úplně každý prvek formuláře se ve výsledku posílá ve formátu jméno_prvku=jeho_hodnota. Ať jde o jakýkoliv druh formulářového prvku, vždy se jeho hodnota pošle v tomto formátu. To nám velmi ulehčuje práci, protože můžeme k jakémukoliv prvku přistupovat stejným způsobem. Popíšeme si, jak se s nimi pracuje a jakým způsobem je můžeme pro uživatele před-vyplnit.

Textové pole

Zpracování textového pole jsme si ukázali minule. Každé textové pole (INPUT) má i nepovinný parametr VALUE, do kterého můžeme zadat hodnotu, u které chceme aby byla standardní hodnotou. V našem případě budeme chtít do pole doplnit hodnotu proměnné strJmeno. Pomocí ASP to provedeme velice jednoduše:

<% strJmeno = "Luděk Roleček" %>

<input type="text" name="jmeno" value="<%= strJmeno %>">

Rozbalovací nabídka – SELECT

Každý SELECT má svoje jméno, na které se v ASP odkazujeme. Každá položka tohoto SELECTu má pak svůj obsah, který se doplní do příslušné kolekce, pokud je tato položka vybrána. Každá položka SELECTu může mít ještě nepovinný parametr VALUE, kterým můžeme určit, že se předá jiná hodnota, než jaká se vypisuje v prohlížeči. To je výhodné třeba u různých číselníků apod., kde zobrazujeme třeba název zboží, ale aplikaci předáváme jeho skladové číslo. Pokud hodnota VALUE u položky chybí, je při jejích vybrání vrácen jako hodnota obsah položky (tedy text, který se zobrazuje v prohlížeči). To, která položka je vybrána, je zajištěno parametrem SELECTED, který se má vyskytovat pouze u jediné položky z celého seznamu. Tato položka je pak prohlížečem „předhozena“ uživateli jako vybraná. Pokud tedy chceme, aby byla před-vybrána položka, jejíž hodnotu máme v proměnné, musíme u každé položky otestovat, jestli se nerovná hodnota položky hodnotě proměnné a v případě, že ano, vypsat skriptem parametr SELECTED.

<% strStat = "CZ" %>

<select name="stat">
 <option value="US" <% If strStat="US" Then Response.Write "selected" %>>USA</option>
 <option value="CZ" <% If strStat="CZ" Then Response.Write "selected" %>>Česká republika</option>
 <option value="SK" <% If strStat="SK" Then Response.Write "selected" %>>Slovenská republika</option>
</select>

Přepínací tlačítko – RADIO

Jako radio-button se označuje skupina tlačítek, ve které může být zaškrtnuté pouze jedno z nich. Všechny tyto prvky mají STEJNÉ jméno a jako svoji hodnotu vrací zvolené políčko hodnotu uvedenou v parametru VALUE, který je u radio-buttonu povinný (jinak by nebylo co vracet). Pokud chcete určit, které políčko ze skupiny bude zaškrtnuté, uvedete u něho parametr CHECKED – tedy použijeme v podstatě stejný postup, jako v případě SELECTu.

<% strMesto = "brno" %>

Ve kterém městě se podle OMARTa nejlépe paří?<br>
<input type="radio" name="mesto" value="praha" <% If strMesto="praha" Then Response.Write "checked" %>> v Praze<br>
<input type="radio" name="mesto" value="brno" <% If strMesto="brno" Then Response.Write "checked" %>> v Brně

Zaškrtávací políčko – CHECKBOX

Funguje stejně jako radio-button jenom s tím rozdílem, že je to samostatný prvek a není sdružovaný v žádné skupině. Má svoje jméno, hodnotu uvedenou v parametru VALUE a nepovinný parametr CHECKED, který určuje, zda je políčko zaškrtnuté nebo ne. Pokud je políčko při odeslání formuláře zaškrtnuté, pošle se standardní formou jmeno=hodnota. Pokud zaškrtnuté není, nepošle se NIC (tedy NE prázdná hodnota, ale NIC).

<% strDeti = "ano" %>

<input type="checkbox" name="deti" value="ano" <% If strDeti="ano" Then Response.Write "checked" %>> mate deti?

Takže nyní, když víte, jak ovládat jednotlivé prvky formuláře, si napíšeme krátkou demonstrační aplikaci, která bude dbát na to, jestli je formulář vyplněný správně. Pokud nebude hodnota vyplněná, tak oznámí chybu a doplní do formuláře zpět uživatelovy hodnoty, aby je nemusel vyplňovat znovu.

<%
Option Explicit
Dim strJmeno, strPlatforma, strMonitor, strInternet
Dim blnZpracovani, strChyba
strJmeno = "" : strPlatforma = "" : strMonitor = "" : strInternet = ""
blnZpracovani = False : strChyba = ""
‚ pokud bylo stisknuto tlacitko Zpracovat, tak zpracujeme odeslana data
If Request.Form("btnZpracovat") <> "" Then
  strJmeno = Request.Form("strJmeno")
  strPlatforma = Request.Form("strPlatforma")
  strMonitor = Request.Form("strMonitor")
  strInternet = Request.Form("strInternet")
  ‚ proverime chyby a pripadne je zapiseme do promenne
  If strJmeno = "" Then strChyba = strChyba & "<li> musíte zadat jméno<br>"
  If strPlatforma = "" Then strChyba = strChyba & "<li> musíte zvolit používanou platformu<br>"
  If strMonitor = "" Then strChyba = strChyba & "<li> musíte vybrat velikost monitoru<br>"
  ‚ pokud nebylo zaskrtnuto policko Internet, znamena to odpoved NE
  If strInternet = "" Then strInternet = "ne"
  ‚ pokud je vse bez chyb, nastavime priznak pro zpracovani
  If strChyba = "" Then blnZpracovani = True
End If
%>
<html>
<head>
  <title>Dotazník</title>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<%
If blnZpracovani Then
  ‚ pokud byl nastaven priznak pro uspesne zpracovani, zobrazime vysledek
  Response.Write "<p>Vámi vyplněné údaje jsou následující:<br><hr><br>"
  Response.Write "<b>Jméno:</b> " & strJmeno & "<br>"
  Response.Write "<b>Platforma:</b> " & strPlatforma & "<br>"
  Response.Write "<b>Monitor:</b> "
  Select Case strMonitor
    Case "0": Response.Write "trpaslík, který nestojí za zmínku"
    Case "999": Response.Write "záviděníhodný obr"
    Case Else: Response.Write strMonitor & """"
  End Select
  Response.Write "<br>"
  Response.Write "<b>Přístup k internetu:</b> " & strInternet & "</p>"

Else
  ‚ pokud zobrazujeme stranku poprve nebo se vyskytly chyby, zobrazime formular
  ‚ pokud se vyskytly chyby, tak je vypis
  If strChyba <> "" Then Response.Write "<p><font color=""red""><b>Došlo k následujícím chybám:</b><br>" & strChyba & "</font></p>"
%>
<p><b>Vyplňte následující formulář:</b></p>
<form name="dotaznik" method="post" action="formular.asp">
 <table border="0" cellspacing="0" cellpadding="3">
   <tr>
    <td align="right">Jméno: </td>
     <td><input type="text" name="strJmeno" value="<%= strJmeno %>"></td>
   </tr>
   <tr>
     <td align="right">Platforma: </td>
     <td>
       <input type="radio" name="strPlatforma" value="Windows" <% If strPlatforma="Windows" Then Response.Write "checked" %>> Windows&nbsp;&nbsp;&nbsp;&nbsp;
       <input type="radio" name="strPlatforma" value="Mac" <% If strPlatforma="Mac" Then Response.Write "checked" %>> Mac
     </td>
   </tr>
   <tr>
     <td align="right">Monitor: </td>
     <td>
       <select name="strMonitor">
         <option value="">— vyberte velikost —</option>
         <option value="0" <% If strMonitor="0" Then Response.Write "selected" %>>úplně malinkatý monitorek</option>
         <option value="14" <% If strMonitor="14" Then Response.Write "selected" %>>14 palců</option>
         <option value="15" <% If strMonitor="15" Then Response.Write "selected" %>>15 palců</option>
         <option value="17" <% If strMonitor="17" Then Response.Write "selected" %>>17 palců</option>
         <option value="19" <% If strMonitor="19" Then Response.Write "selected" %>>19 palců</option>
         <option value="21" <% If strMonitor="21" Then Response.Write "selected" %>>21 palců</option>
         <option value="999" <% If strMonitor="999" Then Response.Write "selected" %>>mnohem větší dělo</option>
       </select>
     </td>
  </tr>
  <tr>
    <td align="right">Přístup k internetu: </td>
    <td><input type="checkbox" name="strInternet" value="ano" <% If strInternet="ano" Then Response.Write "checked" %>></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><br><input type="submit" name="btnZpracovat" value="Zpracovat"></td>
  </tr>
</table>
</form>

<% End If %>

</body>
</html>

Celý kód stránky si můžete také stáhnout tady. Doufám, že nyní už máte dobrou představu, jak pracovat s formuláři v ASP stránkách. Jak vidíte, je ošetření chyb a před-vyplnění formuláře (hlavně SELECTů) velmi pracné. V praxi se proto většinou třeba SELECTy generují jiným způsobem. O tom ale možná někdy příště, dnes jsem chtěl zachovat co největší srozumitelnost příkladu.

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