Einfachen PHP Event-Kalender erstellen

Einfacher Kalender mit PHP in 100 Zeilen

Im Juni 2009 habe ich ein Tutorial geschrieben, wie man einen einfachen Kalender mit PHP erstellt. Dieses Tutorial ist immer noch sehr beliebt und gehört zu den erfolgreichsten in diesem Blog. Jedoch bekomme ich immer wieder E-Mail und Kommentare mit der Frage, wie man Events in diesem Kalender anzeigen könnte. Darauf möchte ich heute kurz eingehen.

Vorbereitung

Als Ersten benötigen wir eine Datenbanktabelle, in der die Events eingetragen werden. In diesem Beispiel besteht ein Event nur aus einem Datum und einem Titel. Für die Demonstration sollte das auch genügen.

1
2
3
4
5
6
CREATE TABLE IF NOT EXISTS `events` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `date` DATE NOT NULL,
  `title` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Ausgabe

Um die Events für den Kalender aus der Datenbank auszulesen, muss zuerst eine Verbindung zu der Datenbank hergestellt werden.

45
$db = new mysqli('localhost', 'test', 'passwort', 'test');

Die Zeilennummern beziehen sich auf das original Kalender Tutorial, dass am Anfang des Artikels verlinkt ist!

Ist das erfolgt, werden die Event des ausgewählten Monats aus der Datenbank auslesen.

46
$result = $db->query("SELECT * FROM `events` WHERE DATE_FORMAT(`date`, '%Y-%m') = '".strftime('%Y-%m', mktime(0, 0, 0, $month, 1, $year))."'");

Jetzt gehen wir die Ergebnisse durch und schreiben die Events in ein zweidimensionales Array. Als Schlüssel nehmen wir das Datum des Events.

48
49
50
51
52
$events = array();
while($event = $result->fetch_object())
{
  $events[$event->date][] = $event->title;
}

Als letzten Schritt müssen wir nur noch in der for-Schleife gucken, ob an dem Tag ein Event eingetragen ist und wenn ja, diesen irgendwie ausgeben. Zusätzlich bekommt die Zelle der Tabelle eine Klasse. Das erreichen wir, indem wir gucken, ob das aktuelle Datum als Schlüssel im Array definiert ist.

Bei der Ausgabe habe ich nur ein i-Element mit einem „T“ in Klammern ausgegeben. Das title-Attribut beinhaltet die Event-Titel Komma getrennt. (Diese werden dann als Tooltip angezeigt.)

137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
<?php for($day = 1; $day <= $total_days; $day++):?>
 
  <?php $class = array();?>
 
  <?php // Wenn das aktuelle Datum dem "Schleifeninhalt" entspricht ?>
  <?php if(($n_month == $month) && ($n_year == $year) && ($day == $n_day)):?>
    <?php $class[] = 'today';?>
  <?php endif;?>
 
  <?php // Wenn an dem Tag Events eingetragen sind ?>
  <?php $has_events = false;?>
  <?php if(array_key_exists(strftime('%Y-%m-%d', mktime(0, 0, 0, $month, $day, $year)), $events)):?>
    <?php $has_events = true;?>
  <?php endif;?>
 
  <td id="day-<?php echo $day;?>" class="<?php echo implode(' ', $class);?>">
    <?php echo $day;?>
    <?php if($has_events === true):?>
      <i class="icon-info" title="<?php echo implode(', ', $events[strftime('%Y-%m-%d', mktime(0, 0, 0, $month, $day, $year))]);?>">(T)</i>
    <?php endif;?>
  </td>
 
  <?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):?>
    </tr>
    <tr>
    <?php endif;?>
  <?php endif;?>
<?php endfor;?>

Dies ist eine Erweiterung des Kalenders aus dem Artikel: Einfacher Kalender mit PHP in 100 Zeilen

Das war’s! Ihr habt nun einen voll funktionsfähigen Event-Kalender.
Wenn ihr die Ausgabe anders haben möchtet, dann müsst ihr nur den Bereich der for-Schleife anpassen.

ALL-INKL.COM

4 Kommentars zu dem Artikel “Einfachen PHP Event-Kalender erstellen”

  1. Avatar von Andreas Schlief
    Andreas Schlief

    Hi,

    super Sache, gibt es ggf. irgendwo den kompletten Quellcode?

    Danke.

    Gruß
    Andreas

  2. Avatar von Tim
    Tim

    Hey Alexander
    Super tutorial, aber könntest du eventuell den Quellcode vom Kalender samt events posten?
    Ich komm mit der zeilennummerierung bei dem tutorial zu den events nicht ganz zurecht :/