Einfachen PHP-Kalender für Webseite programmieren
Anzeige Hier werben
Im folgenden Tutorial beschreibe ich euch wie Ihr einen einfach PHP Kalender für eure Webseite bauen könnt.
Grundlage
Als erstes lege ich fest welche Funktionen der Kalender haben soll.
- Jahr zurück
- Monat zurück
- Anzeige des aktuell ausgewählten Monats + Jahr in Deutsch
- Monat vor
- Jahr vor
- Ausgabe aller Tage eines Monats mit gekürztem Wochentag
- PHP Kalender mit Timestamps steuern
1. Aller Anfang ist schwer
Um den ganzen Kalender zu steuern, egal in welche Richtung der Kalender gesteuert wird ( vor oder zurück in der Zeit ) bietet sich ein Timestamp an.
Kurz zur Erklärung. Ein Timestamp gibt das Datum und die Zeit in Sekunden seit dem 1.Januar 1970 00:00 Uhr zurück.
Sprich das Datum: 10.September 2008 00:00:00 entspricht 1220997600. Das heißt seit dem 1. Januar 1970 00:00:00 Uhr sind 1220997600 Sekunden bis zum 10.September 2008 00:00:00 vergangen.
Dadurch ergeben Sie eine Vielzahl von Möglichkeiten in PHP mit einem Timestamp zu arbeiten, auf die ich später noch genauer eingehe.
Als erstes brauchen wir das aktuelle Datum als Timestamp. Dafür benutze ich die in PHP integrierte Funktion time(). time() generiert einen Timestamp bis zur Sekunde in der ich das PHP Skript aufrufe.
Nun gibt es ein Problem. Da nun immer das aktuelle Datum als Standardzeit genutzt wird, bereite ich das Skript auf die Übergabe der Datumsangabe über die URL vor. Dazu benötigen wir die von PHP definierte Variable $_GET. Mit $_GET['timestamp'] bekommen wir immer alle Zeichen die in der URL in der Variable "timestamp" stehen.
In der URL steht z.B. www.google.de/index.php?timestamp=123456789. Mit echo $_GET['timestamp'] würde PHP "123456789" ausgeben..
Kurz zur Erklärung. Wenn die URL wie folgend aussieht index.php?timestamp=1220997600, so prüft nun das PHP Skript ob in der URL die Variable timestamp gesetzt ist und ob die übergebene Variable einen Wert enthält. Wenn die Variable nicht gesetzt ist so wird der aktuelle Timestamp in die Variable $date geschrieben ansonsten wird der Wert aus der Variable Timestamp übernommen.
isset() = Prüft ob die angegebene Variable gesetzt ist.
empty() = Prüft ob die angegebene Variable leer ist
!empty() = Prüft ob die angegebene Variable nicht leer ist
Ich habe nun vier Funktionen angelegt, welche mir anhand der in $date abgelegten Timestamps den jeweiligen gesuchten Timestamp zurückliefert.
1 2 3 4 5 6 7 8 9 10 11 12 | function monthBack( $timestamp ){
return mktime(0,0,0, date("m",$timestamp)-1,date("d",$timestamp),date("Y",$timestamp) );
}
function yearBack( $timestamp ){
return mktime(0,0,0, date("m",$timestamp),date("d",$timestamp),date("Y",$timestamp)-1 );
}
function monthForward( $timestamp ){
return mktime(0,0,0, date("m",$timestamp)+1,date("d",$timestamp),date("Y",$timestamp) );
}
function yearForward( $timestamp ){
return mktime(0,0,0, date("m",$timestamp),date("d",$timestamp),date("Y",$timestamp)+1 );
}
|
Ich erkläre das an der Funktion monthBack().
Innerhalb der Funktion wandle ich den übergebenen Timestamp mit der in PHP implementierten Funktion date() in die gesuchte Form um.
Date("d",$timestamp) = Tag des Timestamps; Rückgabe: z.B.: 7
Date("m",$timestamp) = Monat des Timestamps; Rückgabe: z.B.: 9
Date("Y",$timestamp) = Jahr des Timestamps; Rückgabe: z.B.: 2008
Mit der Funktion mktime() wandel ich nun aus den einzelnen Datums Werten einen Timestamp.
Hierbei ist zu beachten das mktime() wie folgend die Werte erwartet:
mktime(Stunden,Minuten,Sekunden,Monat,Tag,Jahr);
2. Funktion getCalender()
Die Funktion getCalender() erwartet 2 Parameter wobei der zweite nicht Pflicht ist. Der erste Parameter ist das aktuelle Datum welches unter Punkt eins dieses Tutorials in die Variable $date geschrieben wird. Der zweite Parameter ist ein Array mit den Texten für die einzelnen Tagesüberschriften.
- Parameter 1 muss einen Timestamp beinhalten
- Parameter 2 muss ein Array sein. Z.B. array('Mon','Die','Mit','Don','Fre','Sam','Son'); Ist es nicht gesetzt wird Automatisch auf folgendes Array zurückgegriffen array('Mo','Di','Mi','Do','Fr','Sa','So'
Die Funktion ist ansich sehr einfach gehalten. Als erstes wird die Anzahl der Tages des aktuellen Monats ermittelt. Dies kann ganz einfach für die PHP Funktion date() gemacht werden. Dafür wird der Parameter "t" als String und der aktuelle Timestamp an date() übergeben.
$sum_days = date('t',$date);
Als nächstes speichert man zusätzlich die Anzahl der Tage des letzten Monats. Dies wird so ähnlich wie zuvor gemacht, nur dieses mal wird ein neu generierter Timestamp an die date() Funktion übergeben. Diesem Timestamp wurde einfach ein Monat abgezogen.
$LastMonthSum = date('t',mktime(0,0,0,(date('m',$date)-1),0,date('Y',$date)));
Nun werden einfach die übergebenen Überschriften durch eine ForEach Schleife dargestellt.
foreach( $headline as $key => $value ) { echo "<div class=\"day headline\">".$value."</div>\n"; }
Nun soll der Kalender mit dem richtigen Wochentag beginnen. Dafür benötigen wir eine for Schleife, die so oft ausgeführt, wird wie die Summe der Tage des aktuellen Datums sind. Z.B. 31 mal.
/z.B.*/ for( $i = 1; $i <= $sum_days; $i++ ) {...
Für den weiteren Verlauf der Schleife brauchen wir eine Variable die den aktuellen Tagnamen beinhaltet. Diese Variable heißt $day_name und beinhaltet durch date('D',$timestamp) den aktuellen Tagnamen auf Englisch.
Es werden jetzt die Tage vor dem aktuellen Monat berechnet. Da der Kalender nicht mit dem ersten des Monats anfängt, sondern mit dem Tag Montag. Deshalb müssen wir errechnen wie viele Tage vor dem 1 des Monats ausgegeben werden müssen. Dies wird mit der erste IF Abfrage gemacht. Wenn der Counter $i gleich 1 ist, wird wieder eine Schleife duchlaufen, welche mittels array_search() die Anzahl der Tage ausgibt. array_search() gibt den Key des gefunden Array-Values zurück. In unserem fall wäre es ein Zahl, da es sich bei unserem Array um ein Nummerisches Array handelt.
Arrays bieten die Möglichkeit in einer Variable mehrere Werte zu speichern. Dabei wird jeder Wert einem Schlüssel, auch key
genannt, zugewiesen. Wenn die Schlüssel aus Zahlen bestehen, die
üblicherweise bei 0 Anfangen zu zählen, bezeichnet man ein solches
Array als Nummerisches Array.
$num_array = array('a','b','c'); Ergebniss: array( 0 => a, 1 => b, 2 => c);
Oder
$num_array = array(0 => 'a', 1 => 'b', 2 => 'c'); Ergebniss: array( 0 => a, 1 => b, 2 => c);
Nun kommt mit Abstand der einfachste Teil des Kalenders. Die folgende IF Abfrage gibt dem erstellten div Container nun die CSS Klasse "current" oder "normal". Es wird einfach geprüft ob date('d',$date) gleich $i ist.
Als letztes müssen nur noch die Tage nach dem aktuellen Monat berechnet werden. Dazu werden 6 Tage von dem gefundenen ArrayValue abgezogen. Diese Zahl lassen wir wieder durch die FOR Schleife laufen und geben dem Div Container noch die Klasse "after".
Warum 6? Weil ein Nummerisches Array mit 0 beginnt.
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 | function getCalender($date,$headline = array('Mo','Di','Mi','Do','Fr','Sa','So')) {
$sum_days = date('t',$date);
$LastMonthSum = date('t',mktime(0,0,0,(date('m',$date)-1),0,date('Y',$date)));
foreach( $headline as $key => $value ) {
echo "<div class=\"day headline\">".$value."</div>\n";
}
for( $i = 1; $i <= $sum_days; $i++ ) {
$day_name = date('D',mktime(0,0,0,date('m',$date),$i,date('Y',$date)));
$day_number = date('w',mktime(0,0,0,date('m',$date),$i,date('Y',$date)));
if( $i == 1) {
$s = array_search($day_name,array('Mon','Tue','Wed','Thu','Fri','Sat','Sun'));
for( $b = $s; $b > 0; $b-- ) {
$x = $LastMonthSum-$b;
echo "<div class=\"day before\">".sprintf("%02d",$x)."</div>\n";
}
}
if( $i == date('d',$date)) {
echo "<div class=\"day current\">".sprintf("%02d",$i)."</div>\n";
} else {
echo "<div class=\"day normal\">".sprintf("%02d",$i)."</div>\n";
}
if( $i == $sum_days) {
$next_sum = (6 - array_search($day_name,array('Mon','Tue','Wed','Thu','Fri','Sat','Sun')));
for( $c = 1; $c <=$next_sum; $c++) {
echo "<div class=\"day after\"> ".sprintf("%02d",$c)." </div>\n";
}
}
}
}
|
Damit der Kalender noch einigermaßen brauchbar aussieht, vergeben wir noch ein paar CSS-Styles, die wie folgend aussehen könnten.
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 | body {
font-family:verdana;
font-size:12px;
}
a {
color:black;
text-decoration: none;
}
a:hover {
text-decoration: underline;
background: #eaeaea;
}
.calender {
width:280px;
border:1px solid black;
}
* html .calender,
* + html .calender {
width:282px;
}
.calender div.after,
.calender div.before{
color:silver;
}
.day {
float:left;
width:40px;
height:40px;
line-height: 40px;
text-align: center;
}
.day.headline {
background:silver;
}
.day.current {
font-weight:bold;
}
.clear {
clear:left;
}
.pagination {
text-align: center;
height:20px;
line-height:20px;
font-weight: bold;
}
.pagination a {
width:20px;
height:20px;
}
|
- * + html .day = Dieser Style wird nur vom IE 7 interpretiert
- * html .day = Dieser Style wird nur vom IE 6 interpretiert
3. Der Aufruf
Nun kommen wir zum Aufruf des Kalenders. Wie oben schon beschrieben muss $date immer gesetzt sein.
Des weiteren brauchen wir noch ein Array mit deutschen Monatsnamen, da PHP diese standardmäßig auf Englisch wiedergibt. Damit wir in unserem Template auch den deutschen Monatsnamen ausgegeben bekommen wird das Array wie folgend genutzt:
$arrMonth[date('F',$date)];
date('F') gibt den ausgeschriebenen Monatsnamen auf Englisch zurück.
Um noch ein wenig flexibilität in den Kalender zu bringen, kann noch ein Array mit alternativen Überschriften übergeben werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php
if( isset($_REQUEST['timestamp'])) $date = $_REQUEST['timestamp'];
else $date = time();
$arrMonth = array(
"January" => "Januar",
"February" => "Februar",
"March" => "März",
"April" => "April",
"May" => "Mai",
"June" => "Juni",
"July" => "Juli",
"August" => "August",
"September" => "September",
"October" => "Oktober",
"November" => "November",
"December" => "Dezember"
);
$headline = array('Mon','Die','Mit','Don','Fri','Sam','Son');
?>
|
Nun bauen wir die oben beschriebenen Funktionen und Variablen in unser HTML/PHP Gerüst ein.
Um einen Monat zurück zu schalten wird die Funktion monthBack() wie folgt benutzt:
<a href="?timestamp=<?php echo monthBack($date); ?>" class="last">«</a>
Das gleiche kann nun noch für die anderen Funktion gemacht werden.
Als letztes wird nur noch die Funktion getCalender() aufgerufen. Diese bekommt das aktuelle Datum und die alternativen Überschriften übergeben. Es wird bewußt kein echo für die Funktion genutzt, da in der Funktion statt einem retrun Wert eine Ausgabe durch echo macht.
1 2 3 4 5 6 7 8 9 10 11 | <div class="calender">
<div class="pagination">
<a href="?timestamp=<?php echo yearBack($date); ?>" class="last">|«</a>
<a href="?timestamp=<?php echo monthBack($date); ?>" class="last">«</a>
<span><?php echo $arrMonth[date('F',$date)];?> <?php echo date('Y',$date); ?></span>
<a href="?timestamp=<?php echo monthForward($date); ?>" class="next">»</a>
<a href="?timestamp=<?php echo yearForward($date); ?>" class="next">»|</a>
</div>
<?php getCalender($date,$headline); ?>
<div class="clear"></div>
</div>
|
Et voilá! Unser Kalender ist fertig. Hoffe das diese Artikel dem ein oder anderen Anfänger hilft.
4. Die Datei als ganzes
Hier noch einmal die gesamte Datei.
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 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | <?php
function monthBack( $timestamp ){
return mktime(0,0,0, date("m",$timestamp)-1,date("d",$timestamp),date("Y",$timestamp) );
}
function yearBack( $timestamp ){
return mktime(0,0,0, date("m",$timestamp),date("d",$timestamp),date("Y",$timestamp)-1 );
}
function monthForward( $timestamp ){
return mktime(0,0,0, date("m",$timestamp)+1,date("d",$timestamp),date("Y",$timestamp) );
}
function yearForward( $timestamp ){
return mktime(0,0,0, date("m",$timestamp),date("d",$timestamp),date("Y",$timestamp)+1 );
}
function getCalender($date,$headline = array('Mo','Di','Mi','Do','Fr','Sa','So')) {
$sum_days = date('t',$date);
$LastMonthSum = date('t',mktime(0,0,0,(date('m',$date)-1),0,date('Y',$date)));
foreach( $headline as $key => $value ) {
echo "<div class=\"day headline\">".$value."</div>\n";
}
for( $i = 1; $i <= $sum_days; $i++ ) {
$day_name = date('D',mktime(0,0,0,date('m',$date),$i,date('Y',$date)));
$day_number = date('w',mktime(0,0,0,date('m',$date),$i,date('Y',$date)));
if( $i == 1) {
$s = array_search($day_name,array('Mon','Tue','Wed','Thu','Fri','Sat','Sun'));
for( $b = $s; $b > 0; $b-- ) {
$x = $LastMonthSum-$b;
echo "<div class=\"day before\">".sprintf("%02d",$x)."</div>\n";
}
}
if( $i == date('d',$date)) {
echo "<div class=\"day current\">".sprintf("%02d",$i)."</div>\n";
} else {
echo "<div class=\"day normal\">".sprintf("%02d",$i)."</div>\n";
}
if( $i == $sum_days) {
$next_sum = (6 - array_search($day_name,array('Mon','Tue','Wed','Thu','Fri','Sat','Sun')));
for( $c = 1; $c <=$next_sum; $c++) {
echo "<div class=\"day after\"> ".sprintf("%02d",$c)." </div>\n";
}
}
}
}
?>
<html>
<head>
<style type="text/css">
body {
font-family:verdana;
font-size:12px;
}
a {
color:black;
text-decoration: none;
}
a:hover {
text-decoration: underline;
background: #eaeaea;
}
.calender {
width:280px;
border:1px solid black;
}
* html .calender,
* + html .calender {
width:282px;
}
.calender div.after,
.calender div.before{
color:silver;
}
.day {
float:left;
width:40px;
height:40px;
line-height: 40px;
text-align: center;
}
.day.headline {
background:silver;
}
.day.current {
font-weight:bold;
}
.clear {
clear:left;
}
.pagination {
text-align: center;
height:20px;
line-height:20px;
font-weight: bold;
}
.pagination a {
width:20px;
height:20px;
}
</style>
</head>
<body>
<?php
if( isset($_REQUEST['timestamp'])) $date = $_REQUEST['timestamp'];
else $date = time();
$arrMonth = array(
"January" => "Januar",
"February" => "Februar",
"March" => "März",
"April" => "April",
"May" => "Mai",
"June" => "Juni",
"July" => "Juli",
"August" => "August",
"September" => "September",
"October" => "Oktober",
"November" => "November",
"December" => "Dezember"
);
$headline = array('Mon','Die','Mit','Don','Fri','Sam','Son');
?>
<div class="calender">
<div class="pagination">
<a href="?timestamp=<?php echo yearBack($date); ?>" class="last">|«</a>
<a href="?timestamp=<?php echo monthBack($date); ?>" class="last">«</a>
<span><?php echo $arrMonth[date('F',$date)];?> <?php echo date('Y',$date); ?></span>
<a href="?timestamp=<?php echo monthForward($date); ?>" class="next">»</a>
<a href="?timestamp=<?php echo yearForward($date); ?>" class="next">»|</a>
</div>
<?php getCalender($date,$headline); ?>
<div class="clear"></div>
</div>
</body>
</html>
|
Beispiel
Hier ein funktionsfähiges Beispiel!
Diese Seite kann von jedem registrierten Benutzer bearbeitet werden. Bisher haben 4 Personen an der Seite "Einfachen PHP-Kalender für Webseite programmieren" mitgewirkt.
Sie haben einen Fehler entdeckt oder möchten etwas ergänzen? Dann können Sie nach der Anmeldung "Einfachen PHP-Kalender für Webseite programmieren" hier bearbeiten.
-
Ich arbeite als Webentwickler bei der REGIOCAST GmbH & Co KG, seit Aprill 2008. Dort bin ich zuständig für die Seiten des Radiozentrum Kiel's.
-
graphic, motion & web design - kernreaktor - staportal - mukitu
-
Meine Schwerpunkte liegen im Bereich Grafikdesign, SEO und Management. Seit sieben Jahren bin ich als Geschäftsführer der Team23 GbR tätig, die Webdesign in Augsburg anbietet, sowie Webmasterpro.de betreut.
-
Student für Interfacedesign auf Diplom im 7 Semester an der Merz-Akademie Stuttgart. Portfolio: Webdesign und Webentwicklung in Stuttgart, Böblingen und Sindelfingen


Fehler im Kalender!
Habe mir den Kalender angeschaut. Nicht schlecht, nur ein Problem tritt auf. Ab Februar 2038 funktioniert der Kalender nicht mehr.Folgende Fehlermeldung:
Warning: date() expects parameter 2 to be long, string given in C:\server\xampp\htdocs\test_calender.php on line 134
Notice: Undefined offset: 0 in C:\server\xampp\htdocs\ltest_calender.php on line 134
Warning: date() expects parameter 2 to be long, string given in C:\server\xampp\htdocs\test_calender.php on line 134
» »|
Warning: date() expects parameter 2 to be long, string given in C:\server\xampp\htdocs\test_calender.php on line 16
Warning: date() expects parameter 2 to be long, string given in C:\server\xampp\htdocs\test_calender.php on line 17
Warning: date() expects parameter 2 to be long, string given in C:\server\xampp\htdocs\ltest_calender.php on line 17
Hoffe auf eine Lösung
Re: Fehler im Kalender!
Habe leider keine Lösung dafür. Siehe Hier -> http://de.wikipedia.org/wiki/Unixzeit#Jahr-2038-Problem
Datum Farbe ändern
Ich wollte Fragen wie man von den Aktuellen Monat die Farbe des datums ändert, ich habe einen schwarzen hintergrund und die Tage vom 1-31 seh ich garnicht weil die schwarz sind den rest hab ich schon geändert.
Ich hoffe Ihr könnt mir helfen.
Re: Datum Farbe ändern
mit CSS?
.calender .pagination span { Color:#ffffff; }
Hilfe!!!
tolles und Verständliches Skript. Leider schaffe ich es nicht eine Abfrage einzubauen, welche bestimmte Tage anders markiert. Diese Tage sind in einer MySQL-DB gespeichert. Es gibt diort die Felder von und bis (beide im DATE-Format).
Kann mir hier jemand helfen?????????
Re: Hilfe!!!
Na ja ist ganz einfach. Du übergibts ein Array an die Funktion mit den Tagen als $key. Dann kannst du innerhalb der Funktion drüber iterrieren und wenn ein Tag matched dann gibst du ihm eine CSS-Klasse mit.
kleiner Schönheitsfehler :)
Halle, mir ist ein kleiner Schönheitsfehler aufgefallen.
In jedem Monat wird der aktuelle Tag als heute angezeigt.
Bitte folgende Änderung vornehmen:
1 2 3 4 5ändern in:
1 2 3 4 5ansonsten schönes einfaches script, danke.
Re: kleiner Schönheitsfehler :)
leider ist mir noch etwas aufgefallen. Die Anzeige der letzten Zahlen des Vormonats sind leider incorrekt. Der macht ne Zahl zu wenig. Das liegt meiner Meinung nach an dem Befehl arraysearch. ich habe das so gelöst:
1 2 3 4 5 6 71 2 3 4 5 6 7Re: kleiner Schönheitsfehler :)
Baue das doch bitte in den Artikel ein =)
Bug?
An dem Script gibts nen kleines Problem...
Er zeigt in diesem Monat (Dezember) Den 29. (Montag) und 30. (Dienstag) vom Vormonat November falsch.
Er Zeigt den 29. Montag als 30. Und den 30. Dienstag als 29.
Noch Deutlicher wird es, wenn man sich den Monat Januar 2011 ansieht.
HILFE!
Re: Bug?
Ich gucke mir das mal an...
Re: Bug?
So habe den Fehler behoben! Danke. Lag an der getCalender() Funtion. Die bitte Updaten!
Re: Bug?
Anzeige weiterhin fehlerhaft.
p.ex..
Jan. 2011: Dez. 2010 endet mit FR 29.12
Fix:
Zeile16:
$LastMonthSum = date('t',mktime(0,0,0,(date('m',$date)-1),1,date('Y',$date)));
Zeile29:
$x = $LastMonthSum - $b + 1;
Wenn ich falsch liege bitte korrigieren
demo
Klingt wirklich interessant, aber solchen Artikeln sollte es eine Demo geben.
Re: demo
Kommt noch! Aber derzeit must du dich leider nur mit der Beispiel Datei vergnügen!
Re: demo
welche Beispieldatei?
Re: demo
Die als Link seit eben eingebunden ist ;-)