[PHP] Jak stworzyć na stronie kalendarzyk z dniami miesiąca na dowolny rok i miesiąc?
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 |
|
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> </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> </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ń","Padziernik",
"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> </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> </td>";
echo "</tr></table>";
}
kalendarz(2004,04);
?>