Créer un fichier icalendar (ICS) en PHP

Si vous avez un site web qui gère des évenements bien réels, il peut être intéressant de proposer à vos utilisateurs de télécharger (ou de recevoir par mail) un fichier au format icalendar pour l’ajouter dans son calendrier (Google agenda, Outlook ou autre).

La base

En supposant que vous avez déjà toutes les données nécessaires dans votre base de données, il est très simple de générer le fichier qui va contenir notre événement. Il vous faut bien entendu :

  • une date et heure de début
  • une date et une heure de fin
  • un titre / objet / nom pour votre évenement
  • éventuellement un lieu et un petit texte détaillant l’évenement

Cela donnerait en PHP (pour faire simple).

//Variables
$date_debut = 1525456800;
$date_fin = 1525460400;
$objet = "Apprendre le PHP";
$lieu = "Maison";
$details = "Chapitre 2: connexion à une base de données";

En les intégrant basiquement dans le format icalendar, cela nous donnerait ce code :

//Evenèment au format ICS
$ics = "BEGIN:VCALENDAR\n";
$ics .= "VERSION:2.0\n";
$ics .= "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n";
$ics .= "BEGIN:VEVENT\n";
$ics .= "DTSTART:".date('Ymd',$date_debut)."T".date('His',$date_debut)."Z\n";
$ics .= "DTEND:".date('Ymd',$date_fin)."T".date('His',$date_fin)."Z\n";
$ics .= "SUMMARY:".$objet."\n";
$ics .= "LOCATION:".$lieu."\n";
$ics .= "DESCRIPTION:".$details."\n";
$ics .= "END:VEVENT\n";
$ics .= "END:VCALENDAR\n";

Pour l’exemple, j’ai pris des dates stockées sous la forme de timestamp. Si vous avez des dates stockées en datetime dans votre base, il vous suffirait de faire ainsi :

$ics .= "DTSTART:".date('Ymd',strtotime($date_debut))."T".date('His',strtotime($date_debut))."Z\n";
$ics .= "DTEND:".date('Ymd',strtotime($date_fin))."T".date('His',strtotime($date_fin))."Z\n";

Le problème du fuseau horaire

La problématique à laquelle je me suis heurté était le fuseau horaire. Le « Z » en fin de ligne des dates de début et de fin indique qu’on est au fuseau GMT. Si votre fuseau horaire est différent (Français pour moi dans mon exemple), l’événement est alors décalé d’une ou deux heure (heure d’été oblige).

Il faut donc ajouter la ligne suivante avant la ligne DSTART, et enlever le « Z » à la fin des lignes DTSTART et DTEND.

$ics .= "X-WR-TIMEZONE:Europe/Paris\n";

En ajoutant un petit bout de code pour enregistrer notre fichier, cela nous donne :

//Variables
$date_debut = 1525456800;
$date_fin = 1525460400;
$objet = "Apprendre le PHP";
$lieu = "Maison";
$details = "Chapitre 2: connexion à une base de données";

//Evenèment au format ICS
$ics = "BEGIN:VCALENDAR\n";
$ics .= "VERSION:2.0\n";
$ics .= "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n";
$ics .= "BEGIN:VEVENT\n";
$ics .= "X-WR-TIMEZONE:Europe/Paris\n";
$ics .= "DTSTART:".date('Ymd',$date_debut)."T".date('His',$date_debut)."\n";
$ics .= "DTEND:".date('Ymd',$date_fin)."T".date('His',$date_fin)."\n";
$ics .= "SUMMARY:".$objet."\n";
$ics .= "LOCATION:".$lieu."\n";
$ics .= "DESCRIPTION:".$details."\n";
$ics .= "END:VEVENT\n";
$ics .= "END:VCALENDAR\n";

//Création du fichier
$fichier = 'monfichier.ics';
$f = fopen($fichier, 'w+');
fputs($f, $ics);

C’est un code simplifié au maximum, on peut l’améliorer et le préciser encore. Le code est fonctionnel en l’état.

Amusez-vous bien !

Voir : https://fr.wikipedia.org/wiki/ICalendar

3 commentaires

Laisser un commentaire