Einfacher Kalender mit PHP in 100 Zeilen

Einfacher Kalender mit PHP in 100 Zeilen

Heute möchte ich euch zeigen, wie man einen einfachen Kalender mit Hilfe von PHP erstellen kann. Dieser Kalender ist bei meiner Arbeit an einem Projekt entstanden und wird in einer angepassten Form dort verwendet. Und ich möchte euch dieses Script selbstverständlich nicht vorenthalten. Dabei gehe ich, anders als bei meinen ersten Beiträgen, jeden Schritt einzeln durch und versuche alles möglichst genau zu erklären.

Beschreibung

Der Kalender wird in einer Tabelle generiert. Dies ist natürlich keine Voraussetzung, aber für dieses Beispiel am besten geeignet. Dabei befinden sich zwei Links und die aktuelle Monats- und Jahresanzeige im Kopfbereich der Tabelle. In der nächsten Zeile werden die Wochentage aufgelistet und in den nachfolgenden die Tage.

Demo: Einfacher Kalender mit PHP

Dieser Artikel wurde im Januar 2013 komplett überarbeitet. Die Kommentare vor 2013 beziehen sich auf den alten Inhalt.

Vorbereitungen

Als erstes sollte man den Monat und das Jahr bestimmen, die standardmäßig angezeigt werden sollen, wenn keinen weiteren Parameter übergeben wurden. Sinnvoll wäre es hier den aktuellen Monat zu wählen.

2
3
4
5
6
// Wenn kein Monat übergeben wird, gehen wir von dem aktuellen aus
$month = isset($_GET['month']) ? intval($_GET['month']) : date('n');
 
// Wenn kein Jahr übergeben wird, gehen wir von dem aktuellen aus
$year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');

Somit heißt es nun: Ist eine GET-Variable „month“ und/oder „year“ übergeben, so werden deren Werte genommen, andernfalls wird der aktuelle Monat/das aktuelle Jahr genommen.

Wir möchten die Wochentage und Monate, unabhängig von den Servereinstellungen, am liebsten auf deutsch ausgeben. Aus diesem Grund müssen wir auch diese im Array definieren.

9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Wochentage (Bei den meisten Servern liefert die PHP Funktion englische Namen)
$weekdays = array('Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So');
 
// Monatsnamen (Bei den meisten Servern liefert die PHP Funktion englische Namen)
$months = array(
  '01' => 'Januar',
  '02' => 'Februar',
  '03' => 'März',
  '04' => 'April',
  '05' => 'Mai',
  '06' => 'Juni',
  '07' => 'Juli',
  '08' => 'August',
  '09' => 'September',
  '10' => 'Oktober',
  '11' => 'November',
  '12' => 'Dezember'
);

Jetzt sollte man die nötigen Informationen, zur Darstellung des Kalenders, berechnen. Dazu gehören die Anzahl der Tage in diesem Monat und welcher Tag der 1. des Monats ist. Diese Angaben werden nun in der Variablem „$total_days“ und „$day_offset“ festgehalten.

27
28
29
30
31
// Anzahl der Tage im Monat
$total_days = date('t', mktime(0, 0, 0, $month, 1, $year));
 
// Den ersten Tag des Monats auf den richtigen Wochentag ausrichten
$day_offset = date('w', mktime(0, 0, 0, $month, (1-1), $year));

Jetzt fehlen uns nur noch drei Sachen um die Ausgabe des Kalenders zu beginnen. Dazu gehören die beiden Links zu dem vorherigen/nachfolgenden Monaten und eine Möglichkeit um schnell zu prüfen, ob ein Tag in dem Monat auch dem jetzigen entspricht.

Also definieren wir drei neue Variablen „$n_month“, „$n_year „ und „$n_day“ und übergeben ihnen den aktuellen Monat, das aktuelle Jahr und den aktuellen Tag.

33
34
// Aktuellen Tag, Monat und Jahr bestimmmen
list($n_month, $n_year, $n_day) = explode(', ', strftime('%m, %Y, %d'));

Nun berechnen wir den Monat vor und den Monat nach dem jetzigen. Diese Angaben brauchen wir gleich, um die Navigation im Kalender abzubilden.

36
37
38
39
40
// Berechnen von dem vorherigen Monat
list($n_prev_month, $n_prev_year) = explode(', ', strftime('%m, %Y', mktime(0, 0, 0, $month - 1, 1, $year)));
 
// Berechnen von dem kommenden Monat
list($n_next_month, $n_next_year) = explode(', ', strftime('%m, %Y', mktime(0, 0, 0, $month + 1, 1, $year)));

Ausgabe

Nun kommen wir nun endlich zu der Ausgabe des Kalenders. Es wird zuerst der Kopf der Tabelle mit dem Titel, der Beschreibung, der Navigation und der Anzeige des Monats und Jahres ausgegeben.

Kalender
« »

Gleich nach dem Tabellenkopf folgt die Ausgabe der Wochentage im Tabellenkörker.

127
 

Da längst nicht immer der erste Tag des Monats ein Montag ist, müssen wir die zuvorkommenden Wochentage der Woche mit leeren Zellen füllen. Dazu haben wir bei den Vorbereitungen die Variable $day_offset angelegt, die den numerischer Tag einer Woche des 1. Tages im Monat gespeichert hat. Kleines Beispiel: Der 1. Januar 2013 war ein Dienstag, somit hat die Variable $day_offset den Wer 1.

Ist $day_offset größer als 0, so kann der Monat nicht an einem Montag beginnen und wir müssen den Montag mit einer leeren Zelle ausgeben. Das erledigt für uns folgende, simple, Abfrage.

129
130
131
132
133
<!--?php // Erste Woche mit leeren Zeilen ausfüllen, wenn der erste Tag kein Montag ist ?-->
<!--?php if($day_offset --> 0):?&gt;
  <!--?php for($i = 0; $i < $day_offset; $i++):?--> 
  <!--?php endfor;?-->
<!--?php endif;?-->

Sind wir bei dem ersten Tag im Monat angekommen, starten wir eine for-Schleife von 1 bis zur Anzahl der Tage im Monat und prüfen bei jedem Durchlauf, ob der Tag dem aktuellen Datum entspricht. Ist das der Fall, so fügen wir die HTML Klasse „today“ hinzu. Dabei müssen wir lediglich darauf achten, dass immer nach 7 Tagen eine neue Zeile beginnt.

Bei jedem Durchlauf der Schleife addieren wir der Variabel $day_offset 1 hinzu. Erreicht die Variable den Wert 7, so wird eine neue Zeile begonnen und die Variable wird wieder auf 0 gesetzt.

136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
<!--?php // Die Tage ausgeben ?-->
<!--?php for($day = 1; $day <= $total_days; $day++):?-->
 
  <!--?php $class = array();?-->
 
  <!--?php // Wenn das aktuelle Datum dem "Schleifeninhalt" entspricht ?-->
  <!--?php if(($n_month == $month) &#038;& ($n_year == $year) &#038;& ($day == $n_day)):?-->
    <!--?php $class[] = 'today';?-->
  <!--?php endif;?--> 
 
  <!--?php $day_offset++;?-->
 
  <!--?php // Für neue Woche eine neue Zeile beginnen ?-->
  <!--?php if($day_offset == 7):?-->
    <!--?php $day_offset = 0;?-->
    <!--?php if($day < $total_days):?-->

Jetzt fehlt und lediglich das Ende der Tabelle. Und zwar müssen nun die letzten Wochentage der letzten Zeile, die nicht mehr zu diesem Monat gehören, als leere Zellen ausgegeben werden. Dazu gucken wir wie viele Tage bis zum Ende der Woche uns noch fehlen.

172
173
174
<!--?php if($day_offset --> 0):?&gt;
  <!--?php $day_offset = 7 - $day_offset;?-->
<!--?php endif;?-->

Und lassen eine for-Schleife die Anzahl der fehlenden Tage durchlaufen und eine leere Zelle hinzufügen.

175
176
177
178
179
<!--?php // Letzte Woche mit leeren Zeilen ausfüllen ?-->
<!--?php if($day_offset --> 0):?&gt;
  <!--?php for($i = 0; $i < $day_offset; $i++):?--> 
  <!--?php endfor;?-->
<!--?php endif;?-->

Und zu guter Letzt wird die Tabelle geschlossen.

181
 

Somit wäre der einfache Kalender mit PHP fertig!

Demo: Einfacher Kalender mit PHP

Dieser Artikel wurde im Januar 2013 komplett überarbeitet. Die Kommentare vor 2013 beziehen sich auf den alten Inhalt.

Events ausgeben

Da ich regelmäßig gefragt werde, wie man in diesem Kalender Events ausgeben könnte, habe ich eine kleine Erweiterung für diesen Artikel geschrieben: Einfachen PHP Event-Kalender erstellen

ALL-INKL.COM

83 Kommentars zu dem Artikel “Einfacher Kalender mit PHP in 100 Zeilen”

  1. Avatar von Jan
    Jan

    Alex, Du bist ein Gott, genau so meinte ich das… mir fällt gerade auf, dass der Sonntag anfängt, kann man das auch noch auf Montag ändern? Haha, ich stress‘ Dich bestimmt voll xD

  2. Avatar von StarSt0rm
    StarSt0rm

    Klar kannst du das. Ändere einfach das Array „$weekdays“ so ab, dass der Montag an erster und der Sonntag an letzer Stelle steht.

    7
    
    $weekdays = array('Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So');

    Ziehe der Variable „$day_offset“, in Zeile 17, 1 ab. Die Zeile sollte dann so aussehen:
    Sieh Kommentar von Felix
    Das war’s auch schon. 😉

  3. Avatar von Jan
    Jan

    Aaaaahhh, hätt ich auch selbst drauf kommen können, is‘ ja voll simpel… aber naja, PHP war noch nie meine Logik ^^

  4. Avatar von Felix K.
    Felix K.

    hmm, ich hab das mal ausprobiert mit dem Kalender, der Montags beginnt, hab aber das Problem, dass er im November 2009 den Monat Montags und nicht Sonntags beginnen lässt.

    Demo: http://jsr.mogugge.de/termine.html
    Code: http://paste.funpic.de/175

  5. Avatar von Felix K.
    Felix K.

    I HAZ FIXED!

    $day_offset = date('w', $time)+6;
    while ($day_offset > 6) {
      $day_offset -= 7;
    }
  6. Avatar von StarSt0rm
    StarSt0rm

    Danke Felix, ist mit bis jetzt gar nicht aufgefallen.
    Wichtig wäre noch zu sagen, dass die Zeile 17 durch den Code ersetzt werden sollte.

  7. Avatar von schischi
    schischi

    Hallo Profi,

    in dieser Zeile ist ein Rechtschreibfehler:
    Danach sollten einige Eisstellungen

    machs gut
    schischi

  8. Avatar von StarSt0rm
    StarSt0rm

    Vielen Dank schischi.
    Habe gleich korrigiert. 🙂
    Liebe Grüße, Alex

  9. Avatar von schischi
    schischi

    Hallo Alex,

    hier noch einer 😉
    Das erledigt für und folgende…..

    hab noch was für den Hovereffekt bei den Wochentagen:
    $weekdays = array(‚Sonntag‘ => ‚So‘, ‚Montag‘ => ‚Mo‘, ‚Dienstag‘ => ‚Di‘, ‚Mittwoch‘ => ‚Mi‘, ‚Donnerstag‘ => ‚Do‘, ‚Freitag‘ => ‚Fr‘, ‚Samstag‘ => ‚Sa‘);

    und die Ausgabe:
    foreach ($weekdays as $title => $weekday)
    {
    echo „\t“;
    echo „“.$weekday.“\n“;
    echo „\n“;
    }

    bin dran, diesen Kalender mit mysql und einer Event-DB zu bestücken, das sollte so aussehen, wenn man mit der Maus über einen Link fährt, dieser als Hovereffekt die Events(z. b. 8 Events) für den Tag anzeigt!
    ich hoffe, du hast nichts dagegen, wenn ich mich diesem Script widme?
    vielleicht hast du ja einen Lösungsvorschlag parrat?

    danke im vorraus
    schischi

  10. Avatar von StarSt0rm
    StarSt0rm

    Danke :S Immer diese Fehler… 🙁
    Natürlich habe ich nichts dagegen. Habe den Kalender damals auch für so was gebraucht. Nur ist es aus „Zeitnot“ stillgelegt worden. Habe nach der Arbeit nicht sonderlich viel Lust auf eigene Projekte. Aber ich könnte ja bei Gelegenheit das, was ich schon hatte, raus kramen. Hat ja schon funktioniert, nur nicht flexibel wie ich es wollte. 🙁
    Freut mich, dass dir diese Anleitung wenigstens ein Bisschen helfen konnte. 😉

    Liebe Grüße, Alex

  11. Avatar von Felix K.
    Felix K.

    Ich verwend den Kalender immer noch 🙂

    http://jsr.mogugge.de/termine/uebersicht.html

  12. Avatar von schischi
    schischi

    gefällt mir gut, good job, ist dieser mit events aus der db oder array?

    wenn die einträge aus der DB kommen, dürft ich da mal einen Blick in das Script werfen?

    alles gute
    schischi

  13. Avatar von Felix K.
    Felix K.

    http://paste.pa.funpic.de/252

    Ich denke, die Struktur der Datenbank lässt sich erkennen (datum DATETIME, title VARCHAR 255)

  14. Avatar von schischi
    schischi

    genial und schönes script, muss ich schon sagen und vielen dank für deine schnellen bemühungen. 🙂

    lass es dir gut gehen
    schischi

  15. Avatar von StarSt0rm
    StarSt0rm

    Danke Felix. 🙂 Freut mich, dass du es doch weiterentwickelt hast.

  16. Avatar von DarkourX
    DarkourX

    Hi Star
    ich finde dein Toturial sehr gut und es hat mir sehr weitergeholfen, allerdings bin ich bei einem Problem hängengeblieben.
    Das Markieren der Tage wo ein Event stattfindet. Ich habe versucht die vorlage von Felix so umzuschreiben das ich Events über mehrere Tage hinweg markiert bekomme und das dann auch wenn ein Termin über den angezeigten Monat hinaus geht.
    Stellt sich bis jetzt als ziemlich Kompliziert dar; zumindest für mich. Vielleicht habt ihr ja eine Idee wie das zu realisieren wäre.

    MfG
    Dark

  17. Avatar von schischi
    schischi

    Hallo DarkourX,

    hab dieses Script bisschen erweitert und funktioniert gut!
    kannst ja hier http://schischi.biz/ulm/index.php unter dem link
    was-wann-wo ist der Kalender, wenn er dir zusagt, dann sag bescheid!

  18. Avatar von DarkourX
    DarkourX

    Naja das problem was ich habe ist das ich es nicht hinkriege einen Termin monatsübergreifend anzeigen zu lassen. die struktur an sich ist ja nich das ding.. aber es gibt leider auch keine allgemeine regel dafür wie man es am besten machen könnte
    aber trotzdem danke

  19. Avatar von DarkourX
    DarkourX

    aber kannst ja trotzdem ma deinen kalender schicken vielleicht hilft mir das die richtige lösung zu finden 🙂

    sry für doublepost

  20. Avatar von schischi
    schischi

    Hallo DarkourX,

    würde ich schon gerne machen, nur ich sehe keine E-mai Adresse?

    bitte
    schischi

    • Avatar von StarSt0rm
      StarSt0rm

      DarkourX, ich habe deine Adresse gelöscht und schischi per Mail zukommen lassen. Sorgt sonst für unnötigen Spam.

  21. Avatar von Headhunt3r
    Headhunt3r

    Hallo schischi, ich würde gern dein Angebot auch in Anspruch nehmen wollen und wäre erfreut, wenn du mir deinen Code für den Kalender mal schicken könntest.
    Dein Kalender gefällt mir sehr gut, respekt :).
    Auch an das Tutorial von hier :).
    Mfg Basti

    PS: StarSt0rm, kannst du ihm meine E-Mail-Adresse auch übermitteln, so dass er mir den Code zusenden kann?

  22. Avatar von Simon
    Simon

    Hi,
    hab da ein kleines Problem.
    Bei mir wird immer der heutige Tag angezeigt, egal in welchem Monat ich bin.

    MfG
    Simon

  23. Avatar von schischi
    schischi

    Hallo Simo,

    so ohne Script geht dies fasst nicht, dass man dir helfen kann!

    wie in manchen Foren auch schon gesagt wird, die Glaskugel ist defekt ;-).

  24. Avatar von Jonathan
    Jonathan

    Hallo:)
    Ich finde dass Script auch sehr schön. Leider bekomme ich nicht, es einzubauen:(
    Was ich haben möchte, ist ein Kalender, der einen Aufbau/eine ‚funktionsweise‘ hat, wie der, für den das Tutorial hier eigentlich geschrieben worden ist. Man sieht also immer den aktuellen Monat und kann per link vor/zurück wechseln(also die Monate). Außerdem ist der aktuelle Tag hervorgehoben(hat eine besonderse css-klasse, zB).
    Dafür muss man ja eigentlich nur die Code-Snippets oben zusammenpuzzlen.
    Jetzt würde ich aber gerne haben, dass die Woche mit Monday anfängt und mit Sunday aufhört. Wenn ich den ‚tipp/trick/..‘ aus den Kommentaren „benutze“, ist die Woche zwar richtig „geordnet“ aber der erste ist jeden Monat ein Donnerstag. Weiß wer Hilfe/Rat?

    Das größere Problem ist aber, dass ich diesen Kalender gerne mit meiner DB verknüpfen würde, d.h. Tage, deren Datum in der DB gespeichert sind, sollen verlinkt werden (zB mit xxx.de/?event=)

    Ich habe http://paste.pa.funpic.de/252 ausprobiert – das ist ja eine Funktion. Also habe ich dahinter ein „kalender($time();)“gebaut.

    Was ist daran falsch? Hat wer Interesse mir zu helfen/mich auf die richtige Spur zu bringen? (mir die „Lösung“ zu geben?:P)

    Freue mich auf eure Antwort.

  25. Avatar von schischi
    schischi

    Hallo Jonathan,

    möchtest du php lernen oder soll dies einfach per Copy and Paste passieren, obwohl ich das erstere vorziehe?

  26. Avatar von Jonathan
    Jonathan

    Hallo schischi,
    also ehrlich gesagt geht das Copy&Paste erst einmal vor:P

    aber wenn du dir die Zeit nehmen würdest, mir das zu erklären würd mich das auf jeden Fall freuen:)

  27. Avatar von schischi
    schischi

    mein Kalender Script siehst du in dem Link bei 17., wenn dir dass zusagt, dann frag doch Alexander mal ob er dir dies schickt, da es nicht so toll ist hier die e-mail Adresse im Kommentar zu hinterlassen.
    machs gut
    schischi

  28. Avatar von Jonathan
    Jonathan

    diese ganze „liste“ brauche ich gar nicht – sondern nur den eigentlichen Kalender – also http://2mad.piranho.de/kalender.jpg

    >> Alexander, würdest du mir das Script/den Code schicken? bzw schischi, du kannst ja über http://2mad.piranho.de/ mit mir kontakt aufnehmen – wär auf jeden Fall größtens nett:)

    • Avatar von StarSt0rm
      StarSt0rm

      Hallo Jonathan.
      Ich bin im Moment noch im Urlaub. Ich könnte den Code erst nächste Woche schicken.
      LG, Alex

  29. Avatar von Jonathan
    Jonathan

    scischi hat mich schon per mail angeschrieben – trotzdem danke;D n schönen urlaub noch und n guten rutsch!:>

  30. Avatar von Stefano
    Stefano

    Sehr schöne Funktion, wollte das nun noch etwas erweitern und hab ein ganz banales Problem, was ich irgendwie nicht lösen kann.

    An welcher Stelle muss ich die Formatierung angeben, damit die Tage und Monate mit führender Null ausgegeben werden?

    Ich glaube ich hab nen Brett vorm Kopf :>

    • Avatar von StarSt0rm
      StarSt0rm

      Das ist an sich recht einfach:

      echo sprintf ("%02d", $zahl);
  31. Avatar von Stefano
    Stefano

    Hmm und wo genau? Blick das immer noch nicht :/

    • Avatar von StarSt0rm
      StarSt0rm

      In Zeilen 7 und 12:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      
      for ($day=1; $day<=$total_days; $day++)
      {
        if ($day_highlight && ($day == $n_day))
        {
            echo "t";
            echo '</td>
             <td id="day_'.$day.'" style="'.$options['today_class'].'">'.sprintf ("%02d", $day).'';
             echo "n";
         }   else   {
           echo "t";
           echo '</td>
      <td id="day_'.$day.'">'.sprintf ("%02d", $day).'</td>';
           echo "n";
         }
         $day_offset++;
          if ($day_offset == 7)   {
           $day_offset = 0;
           if ($day < $total_days)
           {
             echo "</tr>n<tr>";
           }
         }
       }
  32. Avatar von Stefano
    Stefano

    Jetzt hab ich es geschnallt, vielen Dank 🙂
    Hab jetzt erst gesehen das letzte Kommentar vor über einen Jahr war, oops 😀

    • Avatar von StarSt0rm
      StarSt0rm

      Das macht doch nichts 😉 Schließlich hast du ja schnell eine Antwort bekommen.

  33. Avatar von Stefan
    Stefan

    Hi!

    Meine Frage ist, ob und wie man das mit Events koppeln kann? Möglichst mit mehreren Kategorien, aktivier- und deaktivierbar und einem Backend zum eintragen (Das is das kein Problem, mir entsagt sich im Moment noch der Zugriff vom Script auf die Daten im Bezug auf das jeweilige Datum).

    Danke schon im Vorhein!
    lg
    Stefan

    • Avatar von StarSt0rm
      StarSt0rm

      Moin Stefan,
      es gibt mehrere Möglichkeiten. Du kannst die Events aus der DB in ein Array speichern. Das Datum ist dann der Key und Value die Beschreibung. Dann kannst du in der for-Schleife mit array_key_exists prüfen, ob es einen Eintrag zu dem Tag gibt und falls ja ausgeben.
      Gruß
      Alex

  34. Avatar von Stefan
    Stefan

    Hi Alex!

    Danke für den Denkanstoß, werds mal probieren 🙂

    lg
    Stefan

  35. Avatar von schischi
    schischi

    hi stefan,

    wenn das probieren keinen erfolg bringt, dann kann ich dir gerne ein script zukommen lassen.

    machs gut
    schischi

    • Avatar von ChrisMoh
      ChrisMoh

      Hallo schischi,

      würde gerne dieses EventScript von dir haben / mir ansehen da ich sowas gerade benötige.
      Ich möchte Alexander bitte dir meine Mail zu senden 🙂

      Frohe Weihnachten euch alle

      Ach ja @Alexander: Super Script *-*

      • Avatar von Alexander Bogomolov
        Alexander Bogomolov

        Hi Chris,
        ich habe das Script von schischi per E-Mail erhalten und an dich geschickt.
        Vielen Dank schischi für die schnelle Reaktion!

        Ich wünsche euch einen guten Rutsch!

        Gruß
        Alex

  36. Avatar von Stefan
    Stefan

    Hi!

    Also ich hab mich durchgewurschtelt und es sieht gut aus, bedarf keiner weiteren Hilfe, dennoch danke fürs Angebot, schischi!

    lg
    Stefan

  37. Avatar von web2go
    web2go

    Erst einmal: WOW! 😉 2 Jahre altes Tutorial und trotzdem so schneller Support, bin wirklich begeistert 😉

    Ich werde mir diesen Code einmal zu Gemüte führen (wenn es Recht ist), da ich für mein Spiel sehr gut einen EventKalender gebrauchen kann 😉

  38. Avatar von web2go
    web2go

    Leider habe ich auch das Problem, das bei mir jeder Monat mit einem Donnerstag anfängt, was natürlich nicht der Fall ist 😉 Gibts dafür noch die Lösung? 🙂

    • Avatar von StarSt0rm
      StarSt0rm

      Danke für deinen Lob. Ich komme zwar immer seltener zum Schreiben, aber die Kommentare lese ich immer alle!
      Zu deinem Problem: Da wirst du irgendwo einen Fehler haben 😉 Ich denke ich stelle mein altes Script einfach mal hier online. Kannst dir das dann als Einheit angucken. Muss das Tutorial aber echt mal aktualisieren…

  39. Avatar von web2go
    web2go

    Gute Arbeit kann man ruhig mal loben 😉

    Mit dem Script als ganzes funktioniert es 😉 Vielen Dank! So kann ich damit arbeiten 🙂

  40. Avatar von Stefan
    Stefan

    StarSt0rm: Danke, aber du hast beim September beim Monats-Array den 9er vergessen (oder er hat gekündigt, weiß nicht *G*)

    • Avatar von StarSt0rm
      StarSt0rm

      Vielen Dank Stefan. Habe gleich korrigiert.

  41. Avatar von Stefan
    Stefan

    Gern geschehen 🙂

    Interessant wäre, links oder rechts die Wochennummern zu haben und entweder die als Link für die Wochenansicht zu haben oder halt einfach zwei Links, einen für die Wochen- und einen für Monatsansicht.

    Daran häng ich im Moment und auch wenn Google einiges an Antworten liefert, da steh ich noch an. Aber ich versuchs mal, so wie beim letzten Mal, wild schreien und hektisch fuchteln kann ich ja immer noch dann 🙂

    lg
    Stefan

  42. Avatar von Peter
    Peter

    Hallo,
    also, super Kalender, danke, aber beim Kalender mit Wochenanfang „Montag“ ist folgendes Problem: wenn der Sonntag auf den ersten im Monat fällt verschieben sich die Tage im Kalender.
    Beim Kalender mit Wochenanfang „Sonntag“ ist alles in Ordnung. Kann mit da jemand weiterhelfen?
    Danke und Gruss
    Peter

  43. Avatar von alex
    alex

    sehr hilfreich ! Danke!!

  44. Avatar von Peter
    Peter

    Hallo Leute,
    habe meinen Fehler gefunden,
    das habe ich falsch gemacht:
    $day_offset = date(‚w‘, mktime(0, 0, 0, $month, 1, $year))-1;
    und so ist es richtig:
    $day_offset = date(‚w‘, mktime(0, 0, 0, $month, 1, $year)-1);
    Jetzt funktioniert der Kalender wie gewünscht.
    Gruß
    Peter

  45. Avatar von Johannes
    Johannes

    Hallo Alexander,
    das ist wirklich ein klasse Script. Hat mir eine Menge Arbeit abgenommen. Herzlichen Dank.
    Ich hatte das gleiche Problem wie Peter. Schön, dass er auch gleich eine Lösung angeboten hat.
    Sollte im Originalscript aber noch korrigiert werden 🙂

    Viele Grüße
    Johannes

  46. Avatar von Andreas
    Andreas

    Hallo Alexander,
    muss sagen ein richtig gutes Tuturial, was du erstellt hast.
    Leider habe ich ein Problem.
    Ich habe mir dein Kalender erstellt und versuche jetzt schon seit mehreren Tage Events hinzufügen. Ich weiß einfach nicht wo und wie ich das machen soll (Ich seh vor Lauter Wald deie Bäume nicht mehr :P)
    Vielleicht kannst du mir helfen

    Viel Grüße Andreas

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Hallo Andreas,
      ich gehe ja leider nicht auf Events weiter ein.
      Im grunde müsstest du alle Events auslesen (z.B. in ein Array speichern (Timestamp als Key)) und in der for-Schleife prüfen, ob es an dem Tag ein Event gibt. Ist das der Fall so ändere die Zelle. (Siehe Zeile 9, 16)

      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
      
      $events = array(...); // Woher auch immer die Daten kommen
      for ($day=1; $day<=$total_days; $day++)
      {
        if ($day_highlight && ($day == $n_day))
        {
            echo "t";
            echo '</td>
             <td id="day_'.$day.'" style="'.$options['today_class'].'">'.$day.'';
             echo (in_array(mktime(0, 0, 0, $month, $day, $year))) ? 'Es gibt ein Event' : '';
             echo "n";
         }   else   {
           echo "t";
           echo '</td>
      <td id="day_'.$day.'">';
           echo $day;
           echo (in_array(mktime(0, 0, 0, $month, $day, $year))) ? 'Es gibt ein Event' : '';
           echo '</td>';
           echo "n";
         }
         $day_offset++;
          if ($day_offset == 7)   {
           $day_offset = 0;
           if ($day < $total_days)
           {
             echo "</tr>n<tr>";
           }
         }
       }

      Gruß
      Alex

  47. Avatar von Andreas
    Andreas

    Hay Alex habe es versucht ledier funktioniert es immer noch nicht

    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
    
    $sql="SELECT Event FROM Plan";
     $abf=mysqli_query($verbindung,$sql);
     $events = mysql_fetch_array($abf);
    for ($day=1; $day&lt;=$total_days; $day++)
    {
      if ($day_highlight &amp;&amp; ($day == $n_day))
      {
          echo &quot;t&quot;;
          echo &#039;
           '.$day.'';
           echo (
    	   if ($event[]==$day)
    	   {
    	   ($event(mktime(0, 0, 0, $month, $day, $year))) ? 'Es gibt ein Event' : '';
    	   }
           echo "n";
       }   else   {
         echo "t";
         echo '
    ';
         echo $day;
         echo (in_array(mktime(0, 0, 0, $month, $day, $year))) ? 'Es gibt ein Event' : '';
         echo '';
         echo "n";
       }

    Könntest du mir helfen. Ich muss gestehen das ich php newbie bin.

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Nun ja, hier sind gleich mehrere Fehler:
      – Zeile 1: Du selektierst ein „Event“ aus der Tabelle Plan, ohne jedoch ein Datum o.Ä. zu haben. (Die Tabelle Events müsste schon mehrere Attribute haben: id, datum, name)
      – Zeile 2-3: Du mischst mysql und mysqli
      – Zeile 12: Du vergleichst ein Array mit einer Zahl ($event[] == $day)
      – Zeile 14: Bei dem Array musst du die eckigen Klamern verwenden

  48. Avatar von Andreas
    Andreas

    Habe die Fehler behoben habe aber nur noch eine letzte frage und zwar

    $timestamp = time();
    if ($day_offset > 0) {
    for ($i=0; $i<$day_offset; $i++)
    {
    echo "\t";
    echo '‘;
    echo „\n“;
    }
    }
    $sql=“SELECT PK_Urlaubstage, von, FK_Art FROM Urlaubsplan“;
    $abf=mysqli_query($verbindung,$sql);
    $events = mysqli_fetch_array($abf);
    for ($day=1; $day<=$total_days; $day++)
    {
    if ($day_highlight && ($day == $n_day))
    {
    echo "\t";
    echo '
    ‚.$day.“;
    if($event[//Was muss ich hier rein machen]==$timestamp)
    {
    ($event[mktime(0, 0, 0, $month, $day, $year))] ? ‚Es gibt ein Event‘ : “;
    }
    echo „\n“;
    } else
    {
    echo „\t“;
    echo ‚
    ‚;
    echo $day;

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Na du musst jetzt irgendwie gucken, ob in $events (Ergebnis aus der DB) der z.Z. durchlaufender Tag mktime(0, 0, 0, $month, $day, $year) vorkommt.

  49. Avatar von Johannes
    Johannes

    Hi Alexander!
    Vielen Dank für das Tutorial. Ich bin gerade dabei, selbst einen solchen Kalender zu programmieren und wusste nicht, wie ich die Anzahl der Leerzellen ermittle. Die Erklärung von $days_offset hat’s mir dann verraten.. Großartig!

  50. Avatar von Frank
    Frank

    Hallo Alex,

    danke für den schönen Klaender. Ich finde ihn auch wegen seiner Schlichtheit so prima. Ich möchte ihn gern für ein Projekt mit Datenbankanbindung verwenden.

    Um ihn zu verstehen, habe ich Dein Originalscript in meinen Webspace hochgeladen:
    http://www.go-uckermark.de/kalender-orig.php?month=9&year=2013.

    Es gibt beim gewählten Monat (Sep 13), Juli 12 u.a. einen Darstellungsfehler. Ab dem 8. gibt es eine Verschiebung. Das ist in der Live-Demo nicht so.

    Woran kann das liegen ?

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Das Problem wurde irgendwo in den Kommentaren behandelt.
      Schau dir am besten einfach den Code der Demo an. Da scheint es ja zu klappen:
      Demo PHP-Code

      Gruß
      Alex

      • Avatar von Frank
        Frank

        Hallo Alex,

        die Kommentare konnte ich nicht so richtig zuordnen. Bin mir auch jetzt nicht sicher, ob da die Lösung steht. Ich habe diese aber schon gefunden.
        Die -1 in Zeile 17 ist ok, dabei wird die Sonntags-Null zur -1, was die Schleife zur Anzeige der Tage manchmal durcheinanderbrachte.
        Ich habe daraufhin in Zeile 18 dem Sonntag die 6 gegeben.
        Nun geht es.

        Viele Grüße
        Frank

  51. Avatar von Sascha
    Sascha

    Hallo Alexander,

    erst mal vielen dank für diesen tollen Kalender!

    Jetzt habe ich eine Frage an dich Frank,
    und zwar was genau willst du bei deinem Projekt, bei dem du den Kalender mit einer Datenbankverbindung verwenden möchtest?
    Denn ich hab auch ein ähnliches Projekt vor mir, bei dem ich den Kalender mit einer Datenbank zusammen nutzen muss.

    Gruß
    Sascha

  52. Avatar von schischi
    schischi

    Hallo,
    http://schischi.biz/ulm/index.php , gibt es nicht mehr, daher kann man den Kalender mit Mysql-Anbindung hier anschauen: http://www.falkoilling.de/designedby_schischi/kalender/index.php

    machts gut
    schischi

  53. Avatar von MelcomB56
    MelcomB56

    Hier nochmal das kleine Workarround für das problem mit dem „1ster Tag ist ein Sonntag“

    Ersetzte dieses:
    // Den ersten Tag des Monats auf den richtigen Wochentag ausrichten
    $day_offset = date(‚w‘, mktime(0, 0, 0, $month, 1, $year)) – 1;

    mit diesem:

    // Den ersten Tag des Monats auf den richtigen Wochentag ausrichten
    $day_offset = date(‚w‘, mktime(0, 0, 0, $month, 1, $year))+6;
    while ($day_offset > 6) {
    $day_offset -= 7;
    }

    LG

    Melcom

  54. Avatar von Jörg Fritsch
    Jörg Fritsch

    Hallo,

    Ich arbeite local mit xampp(neuste Version)
    Ich habe den Code genau übernommen aber ich bekomme immer eine Fehlermeldung die da heisst
    Parse error: syntax error, unexpected ‚–‘ (T_STRING) in Zeile 32

    Das wären bei mir die Zeilen 27 bis 32

    // Anzahl der Tage im Monat
    $total_days = date(‚t‘, mktime(0, 0, 0, $month, 1, $year));

    // Den ersten Tag des Monats auf den richtigen Wochentag ausrichten
    $day_offset = date(‚w‘, mktime(0, 0, 0, $month, 1, $year)) – 1;

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Hallo Jörg, da hast du wohl beim Kopieren ein Sonderzeichen o.Ä. kopiert. Prüfe das bitte mal.

  55. Avatar von Jörg Fritsch
    Jörg Fritsch

    Es kommt auch noch diese Meldung

    Function split() is deprecated

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Oh ja, danke. An Stelle von split() sollte explode() verwendet werden.
      Ich habe das gleich im Artikel korrigiert.

  56. Avatar von jack
    jack

    Der Kalender ist fehlerhaft.
    Der September beginnt an einem Montag und der 8. Tag spring aus der Reihe.
    Siehe hier: http://demos.starstormdesign.de/php/kalender_mit_php_mo_so.php?month=9&year=2013

  57. Avatar von Michael
    Michael

    Hallo,
    erstmal danke, für deine Mühe!
    Ich bin gerade dabei, das Tut nachzubauen und wenn ich alles bis zur Ausgabe schreibe, gibt er mir einen Fehler aus:
    „Parse error: syntax error, unexpected T_STRING in C:\xampplite\htdocs\kalender\index.php on line 31“

    Dort steht bei mir:
    $day_offset = date(‚w‘, mktime(0, 0, 0, $month, 1, $year)) – 1;

    Was ist denn daran falsch?

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Hallo Michael, der Fehler in i.d.R. in der Zeile darüber. Magst du einen größeren Ausschnitt angeben?

  58. Avatar von Michael
    Michael

    Ich hab den Code so übernommen

    // Wenn kein Monat übergeben wird, gehen wir von dem aktuellen aus
    $month = isset($_GET[‚month‘]) ? intval($_GET[‚month‘]) : date(’n‘);

    // Wenn kein Jahr übergeben wird, gehen wir von dem aktuellen aus
    $year = isset($_GET[‚year‘]) ? intval($_GET[‚year‘]) : date(‚Y‘);

    // Wochentage (Bei den meisten Servern liefert die PHP Funktion englische Namen)
    $weekdays = array(‚Mo‘, ‚Di‘, ‚Mi‘, ‚Do‘, ‚Fr‘, ‚Sa‘, ‚So‘);

    // Monatsnamen (Bei den meisten Servern liefert die PHP Funktion englische Namen)
    $months = array(
    ’01‘ => ‚Januar‘,
    ’02‘ => ‚Februar‘,
    ’03‘ => ‚März‘,
    ’04‘ => ‚April‘,
    ’05‘ => ‚Mai‘,
    ’06‘ => ‚Juni‘,
    ’07‘ => ‚Juli‘,
    ’08‘ => ‚August‘,
    ’09‘ => ‚September‘,
    ’10‘ => ‚Oktober‘,
    ’11‘ => ‚November‘,
    ’12‘ => ‚Dezember‘
    );

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Also ich vermute mal, dass die Anführungszeichen nicht alle richtig sind. Achte bitte mal darauf.

  59. Avatar von Jan
    Jan

    Hallo, Alexander, Hallo Jack,

    immer wenn der erste des Monats auf den Montag fällt, wird $day_offset negativ (-1) und die erste Zeile des Kalenders wird fälschlicherweise mit 8 Tabellenzellen befüllt.

    Falsch:
    $day_offset = date(‘w’, mktime(0, 0, 0, $month, 1, $year)) – 1;

    So wird es klappen:
    $day_offset = date(‘w’, mktime(0, 0, 0, $month, (1-1), $year)) ;

    Trotzdem ein super Tutorial! Vielen Dank dafür.

    Viele Grüße
    Jan

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Hallo Jan,

      du hast völlig Recht. Vielen Dank für den Hinweis! Ich habe den Fehler in dem Artikel und der Demo behoben.

      Viele Grüße
      Alex

  60. Avatar von Ramona
    Ramona

    Hallo,
    erstmal vielen Dank für das tolle Kalendertutorial! 🙂

    Ich habe aber eine Frage, wie bringe ich in dem Code ein, dass der aktuelle Tag farblich hervorgehoben wird?
    Ich finde es einfach nicht und komme dann auch nicht drauf, an welcher Stelle ich dies in den Code schreiben müsste.

    mfG
    Ramona

    • Avatar von Alexander Bogomolov
      Alexander Bogomolov

      Bei dem aktuellem Tag wir die Klasse today gesetzt. Siehe Zeile #143. Diese Klasse kannst du dann mit CSS selektieren und den Tag gestalten.