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:
Toute aide que vous pouvez tous me donner ou me montrer sera grandement appréciée !!!
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.
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).
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();
Peut-être un peu tard, mais voici un lien vers la spécification actuelle. http://tools.ietf.org/html/rfc55451
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
.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:
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";
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.