fichier ics calendrier événement

Parser un calendrier .ics en php

Il est parfois utile de récupérer un calendrier d’évènements gracieusement fourni par un site pour afficher certaines informations sur votre propre site.
Voyons à quoi correspondent les fichiers .ics que l’on trouve sur le net, les moyens proposés pour afficher ces fichiers ainsi qu’une façon simple de s’en servir partiellement en dehors de toute application ou plug-in.

Le calendrier électronique

Fichier .ics

Un fichier doté d’une extension .ics est un fichier au format iCalendar.
Ce format permet la publication et l’échange de données de type calendrier sur le Web et via messagerie.
Il peut décrire :
– un événement ponctuel ou récurrent (balise VEVENT),
– une tâche (VTODO),
– une entrée de journal (VJOURNAL),
– une information sur le fuseau horaire (VTIMEZONE),
– une plage de temps libre ou occupé (VFREEBUSY),
– une alarme (VALARM).

A chaque composant sont associées des propriétés qui le caractérisent.
Par exemple, les propriétés d’un composant VEVENT peuvent être :
– DTSTART & DTEND : les dates de début et de fin de l’événement,
– SUMMARY: sa description courte,
– LOCATION: sa localisation,
– CATEGORIES: sa catégorie,
– STATUS: son statut (TENTATIVE, CONFIRMED, CANCELLED),
– DESCRIPTION: sa description,
– TRANSP: la disponibilité de la ressource affectée à l’évènement (OPAQUE, TRANSPARENT).

Exemple de fichier .ics

BEGIN:VCALENDAR
METHOD:PUBLISH
VERSION:2.0
PRODID:-//LFP//iCal 3.0//FR
BEGIN:VEVENT
DTSTART:20110806T190000Z
SUMMARY:AC Ajaccio – Toulouse FC
LOCATION:Stade François Coty
DESCRIPTION:Ligue 1 – 1ère journée – En direct sur Foot +
DTEND:20110806T210000Z
URL:http://www.lfp.fr/ligue1/feuille_match/74369
TRANSP:TRANSPARENT
END:VEVENT
BEGIN:VEVENT
DTSTART:20110817T210000Z
SUMMARY:Toulouse FC – AS Saint-Etienne
LOCATION:Stadium de Toulouse
DESCRIPTION:Ligue 1 – 1ère journée – En direct sur Canal +
DTEND:20110807T210000Z
URL:http://www.lfp.fr/ligue1/feuille_match/74370
TRANSP:TRANSPARENT
END:VEVENT

Utilisation

Couramment utilisé pour envoyer des demandes de réunions à d’autres utilisateurs, ceux-ci peuvent importés les événements décrits dans le fichier dans leur propre calendrier.

Ce format est utilisable via des applications tel que Outlook ou Google Calendar.

Il est possible de produire un .ics depuis votre site web ou de simplement en afficher un via une des nombreuses extensions disponibles sur la plupart des CMS.

Applications

Les applications suivantes permettent d’ouvrir ces fichiers:

Mac OS : Apple iCal, Mozilla Sunbird, …

Windows : Microsoft Outlook 2010, Mozilla Sunbird, Microsoft Works, …

Web : Google Calendar, …

Extensions WordPress

Le catalogue d’extensions WordPress propose une multitude de plug-ins de gestion d’iCalendar avec lesquels vous pouvez importez ou diffusez un .ics.

Quelques exemples parmi les plus utilisés :

All-in-One Event Calendar Plugin
Un calendrier avec affichage mensuel ou journalier et import/export de fichiers .ics.
Nécessite WordPress en version : 3.1.3 ou plus
Compatible jusqu’à la version : 3.2.1

amr events calendar or lists with ical files
Affichage hautement customisable.
Nécessite WordPress en version : 2.8 ou plus
Compatible jusqu’à la version : 3.2.1

Et si on le faisait soi-même?

Pour afficher les événements d’un fichier .ics proposé sur la toile de la façon la plus personnelle qui soit, il suffit d’un petit peu de code et de beaucoup de css.

La méthode proposée est simplement d’exploser le fichier pour récupérer uniquement les données qui nous intéressent.

Imaginons que l’on récupère un calendrier d’évènements sportifs (exemple ci-dessus) et que l’on veuille afficher une partie des informations fournies.

Première chose, bien sûr, la récupération du fichier à l’adresse du fournisseur.

$calendrier = file_get_contents(‘http://adresse/../fichier.ics’);

Ensuite, on définit les expressions régulières qui vont nous permettre de récupérer les informations. On se base sur les balises du format iCal.

// Expressions régulières
$regExpMatch = ‘SUMMARY:(.*)’;
$regExpDate = ‘DTSTART:(.*)’;
$regExpDesc = ‘DESCRIPTION:(.*)’;

Ces expressions régulières vont servir de marqueurs de découpage de chaîne à la fonction preg_match_all.
On récupère en passant le nombre d’occurrences trouvées dans le calendrier (variable $n).
La fonction alimente en sortie un tableau contenant toutes les occurrences trouvées.

$n = preg_match_all($regExpMatch, $calendrier, $matchTableau, PREG_PATTERN_ORDER);
preg_match_all($regExpDate, $calendrier, $dateTableau, PREG_PATTERN_ORDER);
preg_match_all($regExpDesc, $calendrier, $descTableau, PREG_PATTERN_ORDER);

Enfin, une petite boucle permet de lire le ou les tableaux généré(s), de récupérer les informations intéressantes (par exemple, aucun besoin des termes SUMMARY ou DTSTART, si?), de les mettre en forme puis de les afficher à notre convenance.

for ($j=0 ; $j < $n ; ++$j)
{
// Récupération des données
$annee = substr($dateTableau[0][$j], 8, 4);
$mois = substr($dateTableau[0][$j], 12, 2);
$jour = substr($dateTableau[0][$j], 14, 2);
$heure = substr($dateTableau[0][$j], 17, 2);
$min = substr($dateTableau[0][$j], 19, 2);
$match = substr($matchTableau[0][$j], 8);
$desc = substr($descTableau[0][$j], 12);// Mise en forme
$date = $jour.’/’.$mois.’/’.$annee;
$horaire = $heure.’h’.$min;
list($compet, $rang, $tv) = explode(‘ – ‘, $desc);

// Affichage

echo $rang.$compet.$date.$horaire.$match.$tv;
}

Cela affichera au final :
1ère journée Ligue 1 06/08/2011 19h00 AC Ajaccio – Toulouse FC En direct sur Foot +
2eme journée Ligue 1 17/08/2011 21h00 Toulouse FC – AS Saint-Etienne En direct sur Canal +
….

Voilà, il ne reste plus qu’à agrémenter tout cela avec du bon CSS de grand-mère et le tour est joué !

1 réflexion sur “Parser un calendrier .ics en php”

  1. Bonjour, ça fonctionne très bien, si vous faites un copier/coller du code ci-dessus n’oubliez pas de remplacer les Guillemets simples et doubles dans votre source PHP.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *