kulturbanause Blog

Responsive Design, WordPress, Konzeption, HTML, CSS, JS & UX/UI …

Erstellen und Exportieren von iCal-Dateien (.ics) mit Hilfe von PHP

Termin- oder Veranstaltungskalender sind schon lange keine Seltenheit mehr im Internet. Mit Hilfe von PHP können diese Termindaten auch als iCal-Datei (*.ics) auf Websites zum Download angeboten werden, ohne dass man von Hand eine solche Datei erstellen muss. Die Benutzer der Website können sich somit komfortabel diese Termine in ihren eigenen elektronischen Kalender importieren. In diesem Beitrag findet ihr das passende PHP-Snippet, um auch euren Benutzern ein iCal-Export zur Verfügung zu stellen.

Workshops und Seminare von kulturbanause

Adobe XD, Performance, Responsive Design, Sketch, Visual Prototyping, Corporate Design …

Jetzt Frühbucher-Rabatte sichern!

Daten auslesen und in Variablen speichern

Um eure iCal-Datei mit den richtigen Daten zu füllen, erstellt ihr als erstes einige Variablen mit euren Daten. Diese werden später an das Skript übergeben. In diesem Beispiel handelt es sich um folgende Angaben:

  • Start des Termins (Datum und Zeitpunkt)
  • Ende des Termins (Datum und Zeitpunkt)
  • Erstellung des Termins (Datum und Zeitpunkt)
  • Titel der Veranstaltung
  • Veranstaltungsort
  • Beschreibung der Veranstaltung
  • Link zur Veranstaltung
  • Dateiname der iCal-Datei

Hierbei ist es wichtig, dass die Datums- und Zeitangaben im Format »YYYYMMDDTHHMMSS« vorliegt. Angaben wie der Titel, die Beschreibung und der Veranstaltungsort werden mit Hilfe von PHP so formatiert, dass sie später auch korrekt angezeigt werden. Der Dateiname sollte webfreundlich, d. h. ohne Sonderzeichen oder Leerzeichen angegeben werden.

$kb_start = '20161028T130000';
$kb_end = '20161028T143000';
$kb_current_time = '20161026T130000';
$kb_title = html_entity_decode('Titel des Termins', ENT_COMPAT, 'UTF-8');
$kb_location = preg_replace('/([\,;])/','\\\$1','Location'); 
$kb_description = html_entity_decode('Beschreibung zum Termin', ENT_COMPAT, 'UTF-8');
$kb_url = 'https://kulturbanause.de';
$kb_file_name = 'name-der-datei';

iCal-Datei erstellen

Das Erstellen der iCal-Datei funktioniert in drei Schritten. Als erstes wird die Datei mitels fopen() geöffnet, anschließend mittels fwrite() der Inhalt eingefügt und zuletzt die Datei mittels fclose() geschlossen. Das alles passiert, sobald jemand die Seite aufruft, auf der das folgende Code-Snippet eingebunden ist. Sobald ein zweiter Seitenaufruf stattfindet, wird diese Datei aktualisiert. Der Pfad eures Verzeichnisses muss im Code an die Stelle des Wortes »VERZEICHNIS« geschrieben werden. Sollte aus irgendeinem Grund (z. B. falsche Schreibrechte eures Verzeichnisses) die Datei nicht geöffnet werden können, bricht das Script ab und es erscheint der Satz »Datei kann nicht gespeichert werden!«.

<?php $kb_ical = fopen('VERZEICHNIS/'.$kb_file_name.'.ics', 'w') or die('Datei kann nicht gespeichert werden!'); 

$eol = "\r\n";
$kb_ics_content =
'BEGIN:VCALENDAR'.$eol.
'VERSION:2.0'.$eol.
'PRODID:-//kulturbanause//kulturbanause.de//DE'.$eol.
'CALSCALE:GREGORIAN'.$eol.
'BEGIN:VEVENT'.$eol.
'DTSTART:'.$kb_start.$eol.
'DTEND:'.$kb_end.$eol.
'LOCATION:'.$kb_location.$eol.
'DTSTAMP:'.$kb_current_time.$eol.
'SUMMARY:'.$kb_title.$eol.
'URL;VALUE=URI:'.$kb_url.$eol.
'DESCRIPTION:'.$kb_description.$eol.
'UID:'.$kb_current_time.'-'.$kb_start.'-'.$kb_end.$eol.
'END:VEVENT'.$eol.
'END:VCALENDAR';
fwrite($kb_ical, $kb_ics_content);

fclose($kb_ical);
?>

Datei zum Download bereitstellen

Um die Datei nun zum Download anzubieten, könnt ihr einen ganz gewöhnlichen Link erstellen. Gebt hier ebenfalls den von euch gewählten Verzeichnispfad und den von euch gewählten Dateinamen an.

<a href="./VERZEICHNIS/<?php echo $kb_file_name; ?>.ics" title="»<?php echo $kb_title; ?>« exportieren">Termin in Kalender speichern</a>

Anpassung der .htaccess-Datei

Sollte euer Browser die Datei anzeigen anstatt den Download zu starten, müsst ihr gegebenenfalls eure .htaccess-Datei anpassen. Um sicher zu stellen, dass die von euch erstellte Datei als Download-Datei erkannt wird und nicht direkt im Browser geöffnet wird, schreibt folgende Zeile in eure .htaccess-Datei. Erstellt allerdings vorher unbedingt ein Backup der alten .htaccess, da Fehler in dieser Datei die Website beschädigen können.

AddType text/calendar .ics

Live-Beispiel

Das folgende Live-Beispiel zeigt die o.g. Funktionalität. Per Klick ladet ihr eine *.ics-Datei herunter, die ein Event des heutigen Tages beinhaltet.

Beispiel anschauen

Jetzt bist du gefragt!

Hast du Anregungen, Ergänzungen, einen Fehler gefunden oder ist dieser Beitrag nicht mehr aktuell? Dann freuen wir uns auf deinen Kommentar.

Du kannst diesen Beitrag natürlich auch weiterempfehlen. Wir sind dir für jede Unterstützung dankbar!

Das könnte dich auch interessieren

18 Kommentare

  1. Michael

    Verfasst am 21. November 2016 um 10:04 Uhr.

    Ich nutze immer das ICS package von jsvrcek

    https://packagist.org/packages/jsvrcek/ics

    Grüße

  2. mb7

    Verfasst am 23. Januar 2017 um 15:42 Uhr.

    Super Beitrag. Werde ich direkt mal ausprobieren. Woher kommt die Syntax für den $kb_ics_content und gibt es da noch andere Optionen?

    VG
    mb7

  3. Torsten

    Verfasst am 28. März 2017 um 15:27 Uhr.

    Das ergibt aber kein valides iCal und wird so auch von Google-Calendar abgelehnt:

    https://icalendar.org/validator.html?url=http://media.kulturbanause.de/2016/10/beispiel-ical-export.ics

    • Jonas Hellwig

      Verfasst am 12. April 2017 um 13:31 Uhr.

      Danke für den Hinweis. Wir haben die Fehler behoben und Google importiert nun auch fehlerfrei. Der Validator meckert noch bei den Zeilenumbrüchen. Hier weiß ich gerade nicht wie ich den Fehler beheben kann – vielleicht hast du einen Tipp. Aber in der Praxis läuft alles.

      • Jan

        Verfasst am 11. Juni 2017 um 12:28 Uhr.

        kein Meckern bei den Zeilenumbrüchen mit:

        $clf = „\r\n“;
        $kb_ics_content = ‚BEGIN:VCALENDAR‘.$clf;
        $kb_ics_content .= ‚VERSION:2.0‘.$clf;
        etc..

      • Jonas Hellwig

        Verfasst am 17. August 2017 um 17:13 Uhr.

        Das Validierungsproblem ist behoben. Besten Dank!

      • Günther Kendl

        Verfasst am 16. Februar 2018 um 17:07 Uhr.

        Hallo,
        Toller Beitrag – läuft super !
        Es gab den Hinweis :
        Fehler behoben und Google importiert nun auch fehlerfrei.
        wie sieht das Script nun aus ?

        Es werden zb. in title und Location keine Umlaute angezeigt.
        Wie kann man das beheben.

        Vielen Dank
        Günther Kendl

      • Jonas Hellwig

        Verfasst am 17. Februar 2018 um 21:14 Uhr.

        Hallo Günther, wir haben die Fehler direkt oben im Skript behoben. Mit falschen Sonderzeichen haben wir bisher keine Probleme.

  4. andreas

    Verfasst am 21. Februar 2018 um 16:51 Uhr.

    Hi und einfach erklärt,
    kann man diese iCal dann auch abonnieren wenn man dies in seinem Script berücksichtigt? So das man dann auf allen Geräten die selbe Information hat?

    Oder geht damit nur ein einfacher Import?

    • Robert Menzel

      Verfasst am 14. November 2018 um 13:01 Uhr.

      Hallo Andreas,
      mit dem hier beschriebenen Code wird nur eine einzelne Datei heruntergeladen, die anschließend in den Kalender importiert werden muss. Wenn du deine Geräte miteinander synchronisiert hast, erscheint dieser Termin dann natürlich in all deinen Kalendern.

  5. McCormick

    Verfasst am 13. November 2018 um 15:23 Uhr.

    Hallo,
    prima Anleitung – danke dafür.
    Besteht auch die Möglichkeit, statt eines festen Datums eine dynamische Datum (bspw. immer von jetzt an in 24 Stunden) einzuspielen?
    VG
    McCormick

    • Robert Menzel

      Verfasst am 14. November 2018 um 13:08 Uhr.

      Hallo,
      wenn du im oben beschriebenen Code die Variable $kb_start bzw. $kb_end mit dem aktuellen Zeitstempel (+ 24h) befüllst, ist das Datum je nach Download der Datei verschieden.

      MfG Robert

  6. Wolfgang

    Verfasst am 6. Februar 2019 um 11:17 Uhr.

    Super script, vielen Dank!
    Kann das auch für mehrere Termine in 1 File verwendet werden oder muss die ics syntax dafür angepasst werden?
    LG Wolfgang

  7. Heiko

    Verfasst am 24. März 2019 um 10:55 Uhr.

    Hallo,
    besten Dank!

    Gut und leicht verständlich beschrieben.

    Ich verschicke die Termine per Messenger.
    So hat die dann jeder im Verein auch gleich auf seinem Smartphone pder Endgerät seiner Wahl.

  8. Reinhold

    Verfasst am 27. Mai 2019 um 10:07 Uhr.

    Danke für dieses tolle Script. Mit einigen Abänderungen konnte ich sogar einen Belegungskalender zum Download anbieten der gar nicht als icalendar konzipiert ist!

    Meine Frage:
    Wie kann ich einen Importlink anbieten, der automatisch den erzeugten Kalender z.B. mit einem Cronjob täglich abruft? Den erzeugten Kalender als ics-Datei in ein Verzeichnis zu stellen und abrufen zu lassen funktioniert nicht. Danke!

    • Jonas Hellwig

      Verfasst am 27. Mai 2019 um 10:15 Uhr.

      Hallo Reinhold, du müsstest die ical-Datei eigtl. nur öffentlich unter einer URL verfügbar machen und dort bei Änderungen aktualisieren. In den Kalendern kann man dann diese URL abonnieren und als Nutzer festlegen wie oft Updates geladen werden sollen.

      • Reinhold

        Verfasst am 27. Mai 2019 um 10:33 Uhr.

        Danke für die Antwort. Aber noch wie bereits geschrieben: „Den erzeugten Kalender als ics-Datei in ein Verzeichnis zu stellen und abrufen zu lassen funktioniert nicht!“ Die Fehlermeldungen lauten dann etwa „Kein gültiger ics-Importlink“.
        Im ical-validator wird die gleiche Datei anstandslos akzeptiert, auch in den Google Kalender kann ich sie ohne Probleme einfügen.

  9. Reinhold

    Verfasst am 27. Mai 2019 um 11:00 Uhr.

    Ich habe folgendes herausgefunden:
    Wenn ich den Link: http://media.kulturbanause.de/2016/10/beispiel-ical-export.ics angebe wird dieser sofort akzeptiert und importiert. Ich gehe lt. Quelltext davon aus, dass die Datei lediglich als Datei im Verzeichnis steht und nicht dynamisch erzeugt wird. Also muss ich jetzt noch herausfinden, warum meine Datei nicht funktioniert.

Kommentar verfassen

Dieser Blog lebt vom Feedback der Besucher! Also los, mach mit!
Bitte habe Verständnis dafür, dass Kommentare die mit dem Inhalt dieses Beitrags nichts zu tun haben, gelöscht werden.