Comment puis-je utiliser PHP pour publier dynamiquement un fichier ical être lu par Google Calendar?

StackOverflow https://stackoverflow.com/questions/1463480

  •  13-09-2019
  •  | 
  •  

Question

Toute recherche Google sur ical PHP apporte juste au phpicalendar et comment analyser ou lire dans les fichiers iques. Je veux juste écrire un fichier PHP qui tire les événements de ma base de données et les écrit dans le format ical.

Mon problème est que je ne trouve nulle part qui répondra à deux questions:

  1. Quel est le exactement Format ical, y compris les en-têtes, format de fichier, pieds de page, etc.? En d'autres termes, qu'est-ce que le fichier doit avoir, exactement, pour être lu correctement dans Google Agenda, etc.
  2. Si je construis ce fichier en utilisant une extension .php, comment puis-je publier comme ical? Est-ce que je dois écrire un nouveau fichier .ics? Ou Google Agenda, etc. lire un fichier .php ical que tant que le contenu est dans le bon format? (Tout 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 tout donner ou me indiquer sera grandement appréciée !!!

Était-ce utile?

La solution

Cela devrait être très simple si Google Agenda ne nécessite pas l'extension *.ics (ce qui nécessitera une réécriture d'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 que vous devez faire un client pense que vous servez un fichier iCalendar, même si il pourrait y avoir des problèmes en ce qui concerne la mise en cache, l'encodage de texte et ainsi de suite. Mais vous pouvez commencer à expérimenter avec ce code simple.

Autres conseils

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

J'avais des problèmes de validation utilisant à la fois \ n et PHP_EOL quand je l'ICS validateur http://severinghaus.org/projects/ icv /

J'ai appris que je devais utiliser \ r \ n afin de l'obtenir pour valider correctement, cela a donc été 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;

qui a arrêté mes erreurs d'analyse et fait mes fichiers ICS valident correctement.

Il y a un excellent package ELUCEO / ical qui vous permet de créer facilement des fichiers ics.

Voici un exemple d'utilisation de documents:

// 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 en retard, mais voici un lien vers la spécification réelle. http://tools.ietf.org/html/rfc5545 1

http://www.kanzaki.com/docs/ical/ a légèrement version plus lisible de la spécification plus. Il aide comme point de départ -. Beaucoup de choses sont toujours les mêmes

mon site , j'ai

  1. Certaines listes de ressources utiles (voir encadré en bas à droite) sur
    • ical Spec RFC 5545
    • iques Ressources d'essai
  2. Quelques notes enregistrées sur mon voyage de travail avec .ics au cours des dernières années. En particulier, vous trouverez peut-être cette répétition des événements de l'antisèche ' pour être utile.

zones .ics qui nécessitent une manipulation minutieuse:

  • événements 'toute la journée'
  • types de dates (fuseau horaire, UTC ou locale 'flottante') - nb de comprendre la distinction
  • interopérabilité des règles de récurrence
  1. Exact Format ical: http://www.ietf.org/rfc/rfc2445.txt
  2. Selon les spécifications, il doit .ics

Edit: en fait je ne suis pas sûr - ligne 6186 donne un exemple dans ics format de nommage, mais il indique également que vous pouvez utiliser des paramètres d'URL. Je ne pense pas qu'il importe, tant que le type MIME est correct.

Edit: Exemple 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

type MIME est configuré sur le serveur.

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";
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top