[PREV] PHP Kalender
Niet schrikken van de titel, ik zoek er geen :)
Naar aanleiding van het topic 'Datum probleem' en nadat ik op de SQL site een aantal opties zag, dacht ik, laat ik eens een PHP kalender maken.
Een hele tijd terug heb ik genoeg kalender gevonden maar ik vond ze lang niet altijd goed. Dit omdat het aantal weken vast stond met een for-loop op 6 (6 loops), en dat in de laatste loop werd gecontroleerd of er uberhaupt nog wel dagen in deze week voor kwamen. Dit vond ik echt slordig, maar ik had toen nog niet de skills die ik nu heb.
Code (php)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
date_default_timezone_set('Europe/Amsterdam');
$iMonth = IsSet($_GET['month']) && Is_Numeric($_GET['month']) ? $_GET['month'] : Date('m');
$iYear = IsSet($_GET['year']) && Is_Numeric($_GET['year']) ? $_GET['year'] : Date('Y');
$sDate = MkTime(00, 00, 00, $iMonth, 1, $iYear);
$iFirstDay = Date('N', $sDate);
$iTotalDays = Date('t', $sDate);
echo '<table>
<tr>
<td style="font-weight: bold;">W</td>
<td style="font-weight: bold;">M</td>
<td style="font-weight: bold;">D</td>
<td style="font-weight: bold;">W</td>
<td style="font-weight: bold;">D</td>
<td style="font-weight: bold;">V</td>
<td style="font-weight: bold;">Z</td>
<td style="font-weight: bold;">Z</td>
</tr>';
$iDayOfMonth = 1;
For($iWeek = 1; $iWeek <= Ceil(($iTotalDays + $iFirstDay - 1) / 7); $iWeek++)
{
echo '
<tr>
<td>'.(Date('W', $sDate) + $iWeek - 1).'</td>';
For($iDayOfWeek = 1; $iDayOfWeek <= 7; $iDayOfWeek++)
{
$iDayOfWeek1 = $iFirstDay - $iDayOfWeek - 1;
If($iWeek == 1 && $iFirstDay > $iDayOfWeek)
{
echo '<td style="background-color: #ccc;">'.(Date('t', MkTime(00, 00, 00, $iMonth-1, 1, $iYear)) - ($iFirstDay - $iDayOfWeek - 1)).'</td>';
}
ElseIf($iDayOfMonth > $iTotalDays)
{
echo '<td style="background-color: #ccc;">'.($iDayOfMonth - $iTotalDays).'</td>';
$iDayOfMonth++;
}
Else
{
echo '<td>'.$iDayOfMonth.'</td>';
$iDayOfMonth++;
}
}
echo '
</tr>';
}
echo '
</table>
<a href="calendar.php?month='.($iMonth == 1 ? '12&year='.($iYear - 1) : ($iMonth - 1).'&year='.$iYear).'" title="Previous">Previous</a> - <a href="calendar.php?month='.($iMonth == 12 ? '1&year='.($iYear + 1) : ($iMonth + 1).'&year='.$iYear).'" title="Next">Next</a><br />
<a href="calendar.php?month='.$iMonth.'&year='.($iYear - 1).'" title="Previous">Previous</a> - <a href="calendar.php?month='.$iMonth.'&year='.($iYear + 1).'" title="Next">Next</a>
';
?>
date_default_timezone_set('Europe/Amsterdam');
$iMonth = IsSet($_GET['month']) && Is_Numeric($_GET['month']) ? $_GET['month'] : Date('m');
$iYear = IsSet($_GET['year']) && Is_Numeric($_GET['year']) ? $_GET['year'] : Date('Y');
$sDate = MkTime(00, 00, 00, $iMonth, 1, $iYear);
$iFirstDay = Date('N', $sDate);
$iTotalDays = Date('t', $sDate);
echo '<table>
<tr>
<td style="font-weight: bold;">W</td>
<td style="font-weight: bold;">M</td>
<td style="font-weight: bold;">D</td>
<td style="font-weight: bold;">W</td>
<td style="font-weight: bold;">D</td>
<td style="font-weight: bold;">V</td>
<td style="font-weight: bold;">Z</td>
<td style="font-weight: bold;">Z</td>
</tr>';
$iDayOfMonth = 1;
For($iWeek = 1; $iWeek <= Ceil(($iTotalDays + $iFirstDay - 1) / 7); $iWeek++)
{
echo '
<tr>
<td>'.(Date('W', $sDate) + $iWeek - 1).'</td>';
For($iDayOfWeek = 1; $iDayOfWeek <= 7; $iDayOfWeek++)
{
$iDayOfWeek1 = $iFirstDay - $iDayOfWeek - 1;
If($iWeek == 1 && $iFirstDay > $iDayOfWeek)
{
echo '<td style="background-color: #ccc;">'.(Date('t', MkTime(00, 00, 00, $iMonth-1, 1, $iYear)) - ($iFirstDay - $iDayOfWeek - 1)).'</td>';
}
ElseIf($iDayOfMonth > $iTotalDays)
{
echo '<td style="background-color: #ccc;">'.($iDayOfMonth - $iTotalDays).'</td>';
$iDayOfMonth++;
}
Else
{
echo '<td>'.$iDayOfMonth.'</td>';
$iDayOfMonth++;
}
}
echo '
</tr>';
}
echo '
</table>
<a href="calendar.php?month='.($iMonth == 1 ? '12&year='.($iYear - 1) : ($iMonth - 1).'&year='.$iYear).'" title="Previous">Previous</a> - <a href="calendar.php?month='.($iMonth == 12 ? '1&year='.($iYear + 1) : ($iMonth + 1).'&year='.$iYear).'" title="Next">Next</a><br />
<a href="calendar.php?month='.$iMonth.'&year='.($iYear - 1).'" title="Previous">Previous</a> - <a href="calendar.php?month='.$iMonth.'&year='.($iYear + 1).'" title="Next">Next</a>
';
?>
Hier is dus mijn script, en ik zou graag wat commentaar willen :)
Wat kan beter etc.
Ik hang er nog geen DB achter want heb het net gemaakt.
En ook niet zeuren over dat het in een HTML-table is :), dat vond ik wel zo moeilijk om het even te maken. Het gaat dus puur om de PHP-code.
Preview: http://www.dennismertens.nl/calendar.php
Edit:
De variabele $iDay naar $iDayOfMonth verandert, duidelijker.
Edit:
Kom er net achter dat ik de week nummers mis. Even proberen in te bouwen :)
Edit:
Week nummer zit erin :)
M.v.g.
Dennis Mertens
Gewijzigd op 01/01/1970 01:00:00 door Dennis Mertens
Voor de rest ziet t er wel redelijk uit
'isset' is 'isset' en niet 'IsSet'. En dat geldt ook voor 'ceil' en alle andere dingen.
http://framework.zend.com/manual/en/coding-standard.html
Een aantal handige handvatten om je code netjes te maken en houden.
@GaMer13: Helemaal mee eens. Gelukkig doet hij het consequent. Kijk anders eens hier: Een aantal handige handvatten om je code netjes te maken en houden.
Voor een kalender kun je heel goed een table gebruiken. Tables gebruik je niet voor layout zaken, wel voor tabulaire data.
Elk woord met een hoofdletter en ik weet zeker dat meer mensen dat doen. Vooral bij variabele is het ontzettend handig.
Maar ik snap je punt.
Daarnaast script ik bijna nooit met iemand, maar dit wou ik even laten zien, aangezien ik de meeste kalenders echt bagger vind, zie mijn topic bericht.
En een 13e maand zou geen foutmelding geven, wellicht is dit niet netjes, maar dat doe de bezoeker op dat moment zelf. Daarnaast is dit gewoon de basis en heb dit even 'snel' gemaakt. Hierop kun je nog een DB hangen etc. etc..
Ik vind het gewoon niet netjes om hiervoor een table te gebruiken. Dit kan makkelijk met divjes of zelfs met een list (ul li). Dat vind ik zelf persoonlijk mooier.
Maar de opmerkingen vallen wel mee :), had er meer verwacht.
Het is opzich wel een mooie kalender alleen omdat je in de adresbalk gewoon het jaartal kan aanpassen etc. krijg je automatisch dat het niet klopt
zie odnerstaande link:
http://www.dennismertens.nl/calendar.php?month=354&year=2009
Hij zegt dat het januari 1970 is bij mij..
terwijl als ik gewoon http://www.dennismertens.nl/calendar.php?month=14&year=2009 doe, doet hij wel gewoon februari 2010...
suc6 verder ;)