web-dev-qa-db-fra.com

Comment utiliser PHP pour publier de manière dynamique un fichier ical à lire par Google Agenda?

N'importe quelle recherche Google sur PHP ical ne fait qu'amener phpicalendar et comment analyser ou lire des 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 format exact ical, y compris les en-têtes, le format de fichier, les pieds de page, etc.? En d'autres termes, qu'est-ce que le fichier doit avoir exactement pour être lu correctement par Google Agenda, etc.?
  2. Si je construis ce fichier en utilisant une extension .php, comment puis-je le publier comme ical? Dois-je écrire dans un nouveau fichier .ics? Ou Google Agenda, etc., lira-t-il un fichier .php aussi longtemps que le contenu est au bon format? (Un peu comme un fichier style.css.php sera lu comme un fichier CSS si le contenu est réellement CSS, etc.)

Toute aide que vous pouvez tous me donner ou me montrer sera grandement appréciée !!!

102
rhodesjason

Cela devrait être très simple si Google Agenda ne nécessite pas le *.ics _ extension (qui nécessitera une réécriture d'URL sur 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 tout ce dont vous avez besoin pour faire croire à un client que vous utilisez un fichier iCalendar, même s'il peut y avoir des problèmes de mise en cache, de codage de texte, etc. Mais vous pouvez commencer à expérimenter avec ce code simple.

123
Stefan Gehrig

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

J'avais des problèmes de validation avec\n et PHP_EOL lorsque j’utilisais le validateur ICS à http://severinghaus.org/projects/icv/

J'ai appris que je devais utiliser\r\n afin de le valider correctement. Voici 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 arrêté mes erreurs d’analyse et fait que mes fichiers ICS soient correctement validés).

16
Kane Ford

Il existe un excellent paquetage eluceo/ical qui vous permet de créer facilement des fichiers ics.

Voici un exemple d'utilisation de docs:

// 1. Create new calendar
$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');

// 2. Create an event
$vEvent = new \Eluceo\iCal\Component\Event();
$vEvent->setDtStart(new \DateTime('2012-12-24'));
$vEvent->setDtEnd(new \DateTime('2012-12-24'));
$vEvent->setNoTime(true);
$vEvent->setSummary('Christmas');

// Adding Timezone (optional)
$vEvent->setUseTimezone(true);

// 3. Add event to calendar
$vCalendar->addComponent($vEvent);

// 4. Set headers
header('Content-Type: text/calendar; charset=utf-8');
header('Content-Disposition: attachment; filename="cal.ics"');

// 5. Output
echo $vCalendar->render();
5
Ivan Yarych

Peut-être un peu tard, mais voici un lien vers la spécification actuelle. http://tools.ietf.org/html/rfc55451

4
Seirddriezel

http://www.kanzaki.com/docs/ical/ a une version légèrement plus lisible de l'ancienne spécification. Cela aide comme point de départ - beaucoup de choses restent les mêmes.

Aussi sur mon site , j'ai

  1. Quelques listes de ressources utiles (voir l'encadré en bas à droite) sur
    • spécifique RFC 5545
    • ressources de test médical
  2. Quelques notes enregistré lors de mon voyage avec .ics au cours des dernières années. En particulier, vous trouverez peut-être utile ce récapitulatif 'aide-mémoire' .

.ics domaines nécessitant une manipulation minutieuse:

  • événements 'all day'
  • types de dates (fuseau horaire, UTC ou "flottant" local) - nb pour comprendre la distinction
  • interopérabilité des règles de récurrence
4
anmari

Assurez-vous de formater la chaîne comme ceci ou cela ne fonctionnera pas

 $content = "BEGIN:VCALENDAR\n".
            "VERSION:2.0\n".
            "PRODID:-//hacksw/handcal//NONSGML v1.0//EN\n".
            "BEGIN:VEVENT\n".
            "UID:".uniqid()."\n".
            "DTSTAMP:".$time."\n".
            "DTSTART:".$time."\n".
            "DTEND:".$time."\n".
            "SUMMARY:".$summary."\n".
            "END:VEVENT\n".
            "END:VCALENDAR";
2
Dave None
  1. Format exact: http://www.ietf.org/rfc/rfc2445.txt
  2. Selon les spécifications, cela doit se terminer en .ics

Edit: en fait, je ne suis pas sûr - la ligne 6186 donne un exemple au format de nommage .ics, mais indique également que vous pouvez utiliser des paramètres d’URL. Je ne pense pas que cela compte, 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.

2
lod3n