[PREV] PHP Kalender
Hallo mensen,
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.
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
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
bouw nog even een beveiliging in zodat je de maand niet >= 13.
Voor de rest ziet t er wel redelijk uit
Voor de rest ziet t er wel redelijk uit
Heb er nog niet goed naar gekeken, maar leer je één ding af en dat is CaMeLcOdInG. Het leest niet lekker, echt niet.
'isset' is 'isset' en niet 'IsSet'. En dat geldt ook voor 'ceil' en alle andere dingen.
'isset' is 'isset' en niet 'IsSet'. En dat geldt ook voor 'ceil' en alle andere dingen.
@GaMer13: Helemaal mee eens. Gelukkig doet hij het consequent. Kijk anders eens hier: http://framework.zend.com/manual/en/coding-standard.html
Een aantal handige handvatten om je code netjes te maken en houden.
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.
Nou ik gebruik al heel lang de hoofdletters op die manier, ik zelf vind het ontzettend fijn en erg nuttig. Het is erg handig want toen ik begon met PHP wist ik niet wat isset precies betekende (mijn Engels was toendertijd ook niet echt goed, nu nog steeds niet, maar goed genoeg).
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.
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.
Ik weet niet of je hier toevallig nog opkijkt... :P
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 ;)
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 ;)




