104 votes

Comment puis-je utiliser PHP pour publier dynamiquement un fichier ical qui sera lu par Google Agenda ?

Toute recherche Google sur PHP ical fait apparaître phpicalendar et la façon d'analyser ou de lire les fichiers IN ical. Je veux juste écrire un fichier PHP qui extrait les événements de ma base de données et les écrit au format ical.

Mon problème est que je ne trouve aucun endroit qui réponde à deux questions :

  1. Quel est le exacto ique, y compris les en-têtes, le format du fichier, les pieds de page, etc. En d'autres termes, que doit contenir exactement le fichier pour pouvoir être lu correctement par Google Calendar, etc.
  2. Si je crée ce fichier à l'aide d'une extension .php, comment puis-je le publier sous forme de fichier ics ? Dois-je écrire dans un nouveau fichier .ics ? Ou est-ce que Google Calendar, etc., peut lire un fichier .php en tant que fichier ical, à condition que le contenu soit au bon format ? (De la même manière qu'un fichier style.css.php sera lu comme un fichier CSS si le contenu est réellement CSS, etc.)

Toute aide que vous pouvez m'apporter ou m'indiquer sera grandement appréciée !

125voto

Stefan Gehrig Points 47227

Cela devrait être très simple si Google Agenda n'a pas besoin de l'option *.ics -(ce qui nécessitera une réécriture de l'URL dans le serveur).

$ical = "BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:" . md5(uniqid(mt_rand(), true)) . "@yourhost.test
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR";

//set correct content-type-header
header('Content-type: text/calendar; charset=utf-8');
header('Content-Disposition: inline; filename=calendar.ics');
echo $ical;
exit;

C'est essentiellement tout ce dont vous avez besoin pour faire croire à un client que vous servez un fichier iCalendar, même s'il peut y avoir quelques problèmes concernant la mise en cache, l'encodage du texte, etc. Mais vous pouvez commencer à expérimenter avec ce code simple.

17voto

versteckt Points 87

Une note d'expérience personnelle en complément de la réponse de Stefan Gehrig et de celle de Dave None (et de la réponse de mmmshuddup) :

J'avais des problèmes de validation en utilisant les deux \n et PHP_EOL lorsque j'ai utilisé le validateur ICS à l'adresse suivante http://severinghaus.org/projects/icv/

J'ai appris que je devais utiliser \r\n pour qu'il soit validé correctement, c'était donc ma solution :

function dateToCal($timestamp) {
  return date('Ymd\Tgis\Z', $timestamp);
}

function escapeString($string) {
  return preg_replace('/([\,;])/','\\\$1', $string);
}    

    $eol = "\r\n";
    $load = "BEGIN:VCALENDAR" . $eol .
    "VERSION:2.0" . $eol .
    "PRODID:-//project/author//NONSGML v1.0//EN" . $eol .
    "CALSCALE:GREGORIAN" . $eol .
    "BEGIN:VEVENT" . $eol .
    "DTEND:" . dateToCal($end) . $eol .
    "UID:" . $id . $eol .
    "DTSTAMP:" . dateToCal(time()) . $eol .
    "DESCRIPTION:" . htmlspecialchars($title) . $eol .
    "URL;VALUE=URI:" . htmlspecialchars($url) . $eol .
    "SUMMARY:" . htmlspecialchars($description) . $eol .
    "DTSTART:" . dateToCal($start) . $eol .
    "END:VEVENT" . $eol .
    "END:VCALENDAR";

    $filename="Event-".$id;

    // Set the headers
    header('Content-type: text/calendar; charset=utf-8');
    header('Content-Disposition: attachment; filename=' . $filename);

    // Dump load
    echo $load;

Cela a mis fin à mes erreurs d'analyse et a permis à mes fichiers ICS de se valider correctement.

4voto

anmari Points 729

http://www.kanzaki.com/docs/ical/ a une version légèrement plus lisible de l'ancienne spécification. Il s'agit d'un point de départ utile - beaucoup de choses sont encore les mêmes.

Également sur mon site J'ai

  1. Quelques listes de ressources utiles (voir la barre latérale en bas à droite) sur
    • ical Spec RFC 5545
    • Ressources en matière d'essais cliniques
  2. Quelques notes enregistré lors de mon voyage de travail avec .ics au cours des dernières années. En particulier, vous pouvez trouver ceci feuille de route des événements répétitifs pour être utile.

.ics des zones qui doivent être manipulées avec soin :

  • événements "toute la journée
  • types de dates (fuseau horaire, UTC, ou local 'flottant') - nb pour comprendre la distinction
  • l'interopérabilité des règles de récurrence

4voto

Seirddriezel Points 65

Peut-être un peu tard, mais voici un lien vers les spécifications actuelles. https://www.rfc-editor.org/rfc/rfc5545 [1]

2voto

lod3n Points 2475
  1. Format exact : http://www.ietf.org/rfc/rfc2445.txt
  2. Selon les spécifications, il doit se terminer par .ics.

Edit : en fait, je n'en suis pas sûr - la ligne 6186 donne un exemple dans le format de nom .ics, mais elle indique également que vous pouvez utiliser des paramètres url. Je ne pense pas que cela soit important, tant que le type MIME est correct.

Edit : Exemple tiré de wikipedia : http://en.wikipedia.org/wiki/ICalendar

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
END:VCALENDAR

Le type MIME est configuré sur le serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X