Jak vytvořit kalendář v ASP? Dnes začíná zajímavý seriál, který se bude skládat s několika článků, na jejichž vznikne aktivní plánovací kalendář obsahující spoustou zajímavých a užitečných funkcí.

Co vše bude kalendář umět, záleží především na vašem zájmu a námětech, které mi pošlete na můj email. Kalendář se bude postupně, v každém díle zdokonalovat a budu do něj zapracovávat vaše náměty a připomínky. Výsledný rozsah kalendáře je tedy prakticky ve vašich rukou.

První informací, kterou potřebujeme pro vytvoření kalendáře, je počet dní v měsíci, který chceme zobrazit. Nyní si tedy popíšeme, jak tuto informaci rychle a jednoduše získat.

Kolik dní má měsíc?
Ke zjištění počtu dní v měsíci máme dvě možnosti. Buď si vytvoříme pole, ve kterém si pro každý měsíc uvedeme počet jeho dnů. Jenže zde ještě musíme ošetřit počet dní v únoru podle toho, zdali přestupný rok či nikoliv. Test přestupnosti roku provedeme pomocí funkce „Prestupny“, která byla publikována v článku Jak na datum a čas nejen v ASP III..

Jistě je vám všem známo, jak toto řešení realizovat a proto ho zde nebudu uvádět, protože jeho kód je poněkud delší a beztak bych ho v našem kalendáři nepoužil.

Uvedu zde řešení jiné, které je co do velikosti kódu kratší, zbavuje nás nutnosti mít pole s počty dnů (tím šetříme obsazenou paměť) a využívá vestavěných funkcí VBScriptu. K realizaci tohoto řešení potřebujeme funkci day (byla popsána v článku Jak na datum a čas nejen v ASP I.) a funkci DateAdd, která byla popsána v článku Jak na datum a čas nejen v ASP II..

Vtip tohoto řešení spočívá v tom, že se dotážeme na den před prvním dnem následujícího měsíce (tím pádem vlastně na poslední den požadovaného měsíce). Protože funkce Day a DateAdd – jak již víte z předcházejících uvedených článků – pracují bez problému s rokem 2000 a přestupnými roky, odpadá zde nutnost tyto stavy ošetřovat.

Function PocetDniVMesici(ByVal mesic, ByVal rok)
   if mesic=12 then
      mesic=1
      rok=rok+1
   else
      mesic=mesic+1
   end if
   PocetDniVMesici=day(dateadd(„d“,-1,“1.“&mesic&“.“&rok))
End Function

Pro ověření činnosti funkce zde mám příklad, který vypíše počty dní v jednotlivých měsících let 1995 až 2001. Na příkladu vidíte, jak vytvořit pomocí cyklu tabulku a naplnit ji hodnotami. Tuto metodu použijeme později při tvorbě tabulky pro kalendář.

font=“<FONT FACE=““MS SANS SERIF, HELVETICA CE, ARIAL CE, ARIAL, HELVETICA““ SIZE=““1″“>“
Response.Write(„<table border=1 cellspacing=0 cellpadding=0 align=center>“)
Response.Write(„<tr><td>“)
Response.Write(„<table>“)
Response.Write(„<tr><td>“&font&“ </td><td colspan=12 align=center>“&font&“Měsíce/počet dní</td>“)
Response.Write(„<tr><td>“&font&“ Rok </td>“)
for i=1 to 12
   Response.Write („<td>“&font&“<b> „&i&“ </b></td>“)
next
Response.Write(„</tr>“)
for rok=1995 to 2001
   Response.Write („<tr><td>“&font&“<b> „&rok&“ </b></td>“)
      for i=1 to 12
         Response.write(„<td>“&font&“ „&PocetDniVMesici(i,rok)&“ </td>“)
      next
      Response.Write(„</tr>“)
next
Response.Write(„</table>“)
Response.Write(„</td></tr>“)
Response.Write(„</table>“)

Výsledek činnosti příkladu při použití funkce PocetDniVMesici:


<% Function PocetDniVMesici(ByVal mesic, ByVal rok) if mesic=12 then mesic=1 rok=rok+1 else mesic=mesic+1 end if PocetDniVMesici=day(dateadd("d",-1,"1."&mesic&"."&rok)) End Function font="“ Response.Write(„

„) Response.Write(„

„) Response.Write(„

„) Response.Write(„

„) Response.Write(„

„) Response.Write(„

„) for i=1 to 12 Response.Write („

„) next Response.Write(„

„) for rok=1995 to 2001 Response.Write („

„) for i=1 to 12 Response.write(„

„) next Response.Write(„

„) next Response.Write(„

„&font&“  „&font&“Měsíce/počet dní
„&font&“ Rok „&font&“ „&i&“
„&font&“ „&rok&“ „&font&“ „&PocetDniVMesici(i,rok)&“

„) Response.Write(„

„) %>


Nyní, když již známe počet dní v měsíci, můžeme se pustit do tvorby výpisu kalendáře. Pro výpis jednotlivých dní zvolíme tabulku o sedmi sloupcích. Počet řádků bude proměnný podle počtu dní v měsíci.

function kalendar1(mesic,rok)
   font=“<FONT FACE=““MS SANS SERIF, HELVETICA CE, ARIAL CE, ARIAL, HELVETICA““ SIZE=““1″“>“
   pocetdni=PocetDniVMesici(mesic,rok)
   index=1
   tmp=“<table border=1 cellspacing=0 cellpadding=0 align=center>“
   tmp=tmp&“<tr><td align=center>“
   tmp=tmp&“<b>“&mesic&“/“&rok&“</b>“
   tmp=tmp&“</td></tr>“
   tmp=tmp&“<tr><td>“
   tmp=tmp&“<table>“
   do while index<=pocetdni
      tmp=tmp&“<tr>“
      for i=1 to 7 ‚ sloupce tabulky
         tmp=tmp&“<td>“&font
         if index<=pocetdni then
            tmp=tmp&index
         else
            tmp=tmp&“ „
         end if
         index=index+1
         tmp=tmp&“</td>“
      next
      tmp=tmp&“</tr>“
   loop
   tmp=tmp&“</table>“
   tmp=tmp&“</td></tr>“
   tmp=tmp&“</table>“
   kalendar1=tmp
end Function

Všimněte si, že používám proměnnou pocetdni, do které si předem uložím počet dní v měsící a tuto proměnnou pak testuji v cyklu Do While.

Šla by sice použít konstrukce „do while index>=PocetDniVMesici(mesic,rok)“, ale provádění takového cyklu by bylo silně neefektivní, protože by se zbytečně volala funkce PocetDnivMesici při každém průchodu cyklem.

Jak naše nová funkce funguje, si předvedeme pomocí následujícho kódu, kterým si zobrazíme kalendář pro leden, únor a březen 2000.

Response.Write (kalendar1(1,2000))
Response.Write(„<br>“)
Response.Write (kalendar1(2,2000))
Response.Write(„<br>“)
Response.Write (kalendar1(3,2000))

Výsledek použití funkce kalendar1:


<% function kalendar1(mesic,rok) font="“ pocetdni=PocetDniVMesici(mesic,rok) index=1 tmp=“

“ tmp=tmp&“

“ tmp=tmp&“

“ tmp=tmp&“

“ tmp=tmp&“„&mesic&“/“&rok&““ tmp=tmp&“
“ tmp=tmp&“

“ do while index<=pocetdni tmp=tmp&" “ for i=1 to 7 ‚ sloupce tabulky tmp=tmp&“

“ next tmp=tmp&“

“ loop tmp=tmp&“

„&font if index<=pocetdni then tmp=tmp&index else tmp=tmp&" " end if index=index+1 tmp=tmp&"

“ tmp=tmp&“

“ kalendar1=tmp end Function Response.Write (kalendar1(1,2000)) Response.Write(„
„) Response.Write (kalendar1(2,2000)) Response.Write(„
„) Response.Write (kalendar1(3,2000)) %>


Jak jistě vidíte, kalendář zde zobrazený má ještě spoustu nedostatků, které budeme postupně krok za krokem odstraňovat. Jeden z nedostatků v kalendáři je ten, že vlastně nevíme, který den je který. Proto si nejprve ukážeme, jak vyřešit tento problém.

Aby jsme se zbavili závislosti na nastavení systému, vytvoříme si funkci, která nám bude vracet dvojpísmenný název dne.

function kteryden(den)
   select case den
      case 1
         tmp=“Po“
      case 2
         tmp=“Út“
      case 3
         tmp=“St“
      case 4
         tmp=“Čt“
      case 5
         tmp=“Pá“
      case 6
         tmp=“So“
      case 7
         tmp=“Ne“
   end select
kteryden=tmp
end function

Jako další krok provedeme doplnění funkce pro tvorbu kalendáře a kód, který zajistí vypsání názvů dní do prvního řádku tabulky. Protože jde jenom o doplněk do již existující funkce, uvedu v kódu jenom tu část, která byla modifikována:

tmp=tmp&“<table>“ ‚TENTO ŘÁDEK JE Z PŮVODNÍHO KÓDU
indexdne=1
tmp=tmp&“<tr>“
cislodne=weekday(„1.“&mesic&“.“&rok,2)
do while indexdne<=7
   tmp=tmp&“<td>“&font
   tmp=tmp&kteryden(cislodne)
   tmp=tmp&“</td>“
   indexdne=indexdne+1
   cislodne=cislodne+1
   if cislodne>7 then cislodne=1
loop
tmp=tmp&“</tr>“
do while index<=pocetdni ‚TENTO ŘÁDEK JE Z PŮVODNÍHO KÓDU

A výsled upraveného kódu je zde:


<% function kteryden(den) select case den case 1 tmp="Po" case 2 tmp="Út" case 3 tmp="St" case 4 tmp="Čt" case 5 tmp="Pá" case 6 tmp="So" case 7 tmp="Ne" end select kteryden=tmp end function function kalendar2(mesic,rok) font="“ pocetdni=PocetDniVMesici(mesic,rok) index=1 tmp=“

“ tmp=tmp&“

“ tmp=tmp&“

“ tmp=tmp&“

“ tmp=tmp&“„&mesic&“/“&rok&““ tmp=tmp&“
“ tmp=tmp&“

“ indexdne=1 tmp=tmp&“

“ cislodne=weekday(„1.“&mesic&“.“&rok,2) do while indexdne<=7 tmp=tmp&"

“ indexdne=indexdne+1 cislodne=cislodne+1 if cislodne>7 then cislodne=1 loop tmp=tmp&“

“ do while index<=pocetdni tmp=tmp&"

“ for i=1 to 7 ‚ sloupce tabulky tmp=tmp&“

“ next tmp=tmp&“

“ loop tmp=tmp&“

„&font tmp=tmp&kteryden(cislodne) tmp=tmp&“
„&font if index<=pocetdni then tmp=tmp&index else tmp=tmp&" " end if index=index+1 tmp=tmp&"

“ tmp=tmp&“

“ kalendar2=tmp end Function Response.Write (kalendar2(1,2000)) Response.Write(„
„) Response.Write (kalendar2(2,2000)) Response.Write(„
„) Response.Write (kalendar2(3,2000)) %>


Ano – správně namítáte, že v každém z měsíců je pokaždé v prvním sloupci jiný den. Přiznávám se, že to byl úmysl, aby jsem vám mohl demonstrovat, jak probíhá vývoj a vy jste snadno pochopili moje jednotlivé kroky při tvorbě této funkce.

To je pro dnešek vše. A co nás čeká příště? Doplníme funkci možnost volby, kterým dnem má začínat řádek tabulky. Dále přidám barevné odlišení sobot a nedělí a ještě vyznačení aktuálního dne a místo čísla měsíce bude možnost zobrazit měsíc slovy.

Na závěr bych chtěl připomenout, že funkce, které bude kalendář obsahovat závisí i na vás. Náměty prosím pište na můj e-mail nebo do diskuse pod tímto článkem.

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