[PHP] Jak stworzyć na stronie kalendarzyk z dniami miesiąca na dowolny rok i miesiąc?

0x01 graphic

Chcesz umieścić na swojej stronie kalendarzyk, który pokaże wszystkie dni na dowolny rok i miesiąc. Może on wyglądać dokładnie tak, jak poniżej:

Maj 2004

Nd

Pn

Wt

Śr

Cz

Pt

So

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

 

0x01 graphic

Kalendarzyk może być dodatkowym gadżetem na stronie, ale również potrzebnym i przydatnym narzędziem, szczególnie gdy każdy dzień będzie linkiem do określonych zasobów dostępnych dla tego własnie dnia.

Rozkład dni wygląda o wiele ładniej i czytelniej w postaci tabelki niż jako łańcuch znaków. Oto gotowy kod tworzący kalendarz na każdy miesiąc dowolnego roku z uwzględnieniem lat przestępnych.

<?

function kalendarz($rok,$miesiac) {

$znacznik = mktime(0,0,0,$miesiac,1,$rok);

$iledni = date("t", $znacznik);

$poczatek= date("w", $znacznik);

$miesiace = array("Styczeń","Luty","Marzec","Kwiecień","Maj",

"Czerwiec","Lipiec","Sierpień","Wrzesień","Październik",

"Listopad","Grudzień");

echo "<table border=1 cellspacing=0 cellpadding=2>";

echo "<tr><td colspan=7 bgcolor=#eeeedd align=center>";

echo $miesiace[$miesiac-1]." $rok</td>";

echo "<tr bgcolor=#eeeeee><td>Nd</td><td>Pn</td>

<td>Wt</td><td>Śr</td><td>Cz</td><td>Pt</td>

<td>So</td></tr><tr align=right>";

if ($poczatek>0)

echo "<td colspan=$poczatek bgcolor=#eeeeee>&nbsp;</td>";

for ($i=1;$i<=$iledni;$i++) {

$dzien=date("w", mktime(0,0,0,$miesiac,$i,$rok));

if ($dzien==0) {

echo "</tr><tr align=right>"; $bg="red";

} else {

$bg="yellow";

}

if (mktime(0,0,0,date("m"),date("d"),date("Y"))==

mktime(0,0,0,$miesiac,$i,$rok)) $bg="green";

echo "<td bgcolor=$bg>$i</td>";

}

$koniec=7-($poczatek+$iledni)%7;

if ($koniec<>7)

echo "<td colspan=$koniec bgcolor=#eeeeee>&nbsp;</td>";

echo "</tr></table>";

}

kalendarz(2002,11);

?>

Aby wywołać funkcję, musisz podać rok i miesiąc, dla których ma być tworzony kalendarzyk. Aby uzyskać kalendarz dla aktualnego miesiąca możesz wywołać go w następujący sposób:

kalendarz(date("Y"),date("m"));

Do stworzenia kalendarza potrzebne są dwie dane - ile dni ma miesiąc i od którego dnia tygodnia się zaczna. Tydzień ma siedem dni, wiec tabela będzie miała siedem kolumn. Ilość rzędów może być różna w zależności od tego, w jakim dniu wypada początek miesiąca i ile dni ma miesiąc.

Ponieważ nie każdy dzień zaczyna się od niedzieli, najpierw trzeba wyliczyć początkowy odstęp (puste kratki, a raczej jedną, poszerzoną komórkę tabeli). To akurat łatwo jest zrobić bo numer dnia mówi nam ile kratek trzeba opuścić. Niedziela to dzień nr 0, a zaczynamy przecież liczyć od niedzieli - jeżeli mamy piątek (dzień nr 5), to odstęp wyniesie 5 dni.

Następnie w pętli dodawane są kolejne dni w osobnych komórkach tabeli. Jeżeli wypadnie niedziela, zaczynamy nowy rząd. Dodatkowo ustawiane są kolory dla dni powszednich i niedzieli. Jeżeli podczas tworzenia kalendarza trafimy na aktualny dzień, zostanie on pokolorowany na zielono.

Na końcu występuje podobny problem jak na początku - trzeba znowu wyliczyć brakujące elementy tabeli, bo przecież nie zawsze wypełnia się ona do końca dniami. Sposób jest prosty - sprawdzam ile dni zostaje po podzieleniu przez 7 wszystkich dni miesiąca oraz dni dodanych na początku tabeli i odejmuje wynik od siedmiu. Jeżeli wartość jest różna od 7 to znaczy, że są jakieś puste pola.

Jeżeli chcesz na stronie umieścić kalendarz dla całego roku możesz fukcję wywołać następująco:

<?

$rok=2001;

echo "<center><table>";

for ($i=0;$i<4;$i++) {

echo "<tr valign=top>";

for ($j=0;$j<3;$j++) {

$k++;

echo "<td>";

kalendarz(2002,$k);

echo "</td>";

}

echo "</tr>";

}

echo "</table></center>";

?>

Jeżeli chcesz zarezerwować jakieś dni i zaznaczyć je na kalendarzu, możesz stworzyć tablicę asocjacyjną $waznedaty z datami istotnymi, a potem w pętli, podczas "rysowania" kalendarza kolorować wybrane dni np. na niebiesko (blue):

<?

function kalendarz($rok,$miesiac) {

$znacznik = mktime(0,0,0,$miesiac,1,$rok);

$iledni = date("t", $znacznik);

$poczatek= date("w", $znacznik);

$miesiace = array("Styczeń","Luty","Marzec","Kwiecień","Maj",

"Czerwiec","Lipiec","Sierpień","Wrzesień","PaŸdziernik",

"Listopad","Grudzień");

echo "<table border=1 cellspacing=0 cellpadding=2>";

echo "<tr><td colspan=7 bgcolor=#eeeedd align=center>";

echo $miesiace[$miesiac-1]." $rok</td>";

echo "<tr bgcolor=#eeeeee><td>Nd</td><td>Pn</td>

<td>Wt</td><td>Śr</td><td>Cz</td><td>Pt</td>

<td>So</td></tr><tr align=right>";

if ($poczatek>0)

echo "<td colspan=$poczatek bgcolor=#eeeeee>&nbsp;</td>";

$waznedaty["2004.4.9"]=1;

$waznedaty["2004.4.14"]=1;

$waznedaty["2004.4.15"]=1;

$waznedaty["2004.4.16"]=1;

$waznedaty["2004.4.27"]=1;

for ($i=1;$i<=$iledni;$i++) {

$dzien=date("w", mktime(0,0,0,$miesiac,$i,$rok));

if ($dzien==0) {

echo "</tr><tr align=right>"; $bg="red";

} else {

$bg="yellow";

}

if (mktime(0,0,0,date("m"),date("d"),date("Y"))==

mktime(0,0,0,$miesiac,$i,$rok)) $bg="green";

if ($waznedaty["$rok.$miesiac.$i"]==1) $bg="blue";

echo "<td bgcolor=$bg>$i</td>";

}

$koniec=7-($poczatek+$iledni)%7;

if ($koniec<>7)

echo "<td colspan=$koniec bgcolor=#eeeeee>&nbsp;</td>";

echo "</tr></table>";

}

kalendarz(2004,04);

?>