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

Unsere Berlin-Termine für Ende 2017 sind online!

Jetzt Tickets 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

6 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!

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.