Come posso utilizzare PHP per pubblicare dinamicamente un file iCal per essere letto da Google Calendar?

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

  •  13-09-2019
  •  | 
  •  

Domanda

Qualsiasi ricerca su Google su PHP iCal Solo porta in primo piano phpicalendar e come analizzare o leggere nei file iCal. Voglio solo scrivere un file PHP che tira gli eventi dalla mia base di dati e li scrive in formato iCal.

Il mio problema è che non riesco a trovare da nessuna parte che rispondere a due domande:

  1. Qual è la esattamente formato iCal, incluse le intestazioni, piè di pagina, formato di file, ecc? In altre parole, che cosa fa il file deve avere, esattamente, al fine di essere correttamente leggere da Google Calendar, ecc.?
  2. Se costruisco questo file usando l'estensione .php, come faccio a pubblicarla come iCal? Devo scrivere in un nuovo file ics? O sarà Google Calendar, ecc leggere un file .php come iCal fintanto che i contenuti sono nel formato corretto? (Molto simile a un file style.css.php sarà letto come un file CSS se il contenuto è in realtà CSS, ecc.)

Tutto l'aiuto che tutti possono dare o punto me sarà molto apprezzato !!!

È stato utile?

Soluzione

Questo dovrebbe essere molto semplice se Google Calendar non richiede l'*.ics-estensione (che richiederà un po 'di riscrittura degli URL nel server).

$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;

Questo è in sostanza tutto ciò che serve per fare un cliente pensare che si sta servendo un file iCalendar, anche se ci potrebbero essere alcuni problemi per quanto riguarda il caching, la codifica di testo e così via. Ma si può iniziare a sperimentare con questo semplice codice.

Altri suggerimenti

Una nota di esperienza personale in aggiunta a entrambi risposta e Dave Nessuno di risposta di Stefan Gehrig (e la risposta di mmmshuddup):

ho avuto problemi di convalida utilizzando sia \ n e PHP_EOL quando ho usato il validatore ICS a http://severinghaus.org/projects/ ICV /

Ho imparato che ho dovuto usare \ r \ n al fine di farlo convalida correttamente, quindi questa è stata la mia soluzione:

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;

che ha fermato i miei errori di analisi e ha reso i miei file ICS convalida correttamente.

C'è un ottimo eluceo / iCal pacchetto che permette di creare facilmente file ICS.

Ecco un esempio di utilizzo di documenti:

// 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();

Forse un po 'tardi, ma ecco un link alla specifica attuale. http://tools.ietf.org/html/rfc5545 1

http://www.kanzaki.com/docs/ical/ ha un po ' versione più leggibile delle specifiche più vecchio. Aiuta come punto di partenza -. Molte cose sono ancora gli stessi

Anche su mio sito , ho

  1. Alcune liste di risorse utili (vedi in basso a destra della barra laterale) su
    • iCal Spec RFC 5545
    • iCal Test Resources
  2. Alcune note registrati sul mio viaggio di lavoro con .ics nel corso degli ultimi anni. In particolare, si può trovare questo eventi ricorrenti 'bigino' per essere utile.

aree .ics che necessitano di una gestione attenta:

  • 'per tutto il giorno' eventi
  • tipi di date (fuso orario UTC, o locale 'fluttuante') - nb per capire distinzione
  • interoperabilità delle regole di ricorrenza
  1. formato iCal esatta: http://www.ietf.org/rfc/rfc2445.txt
  2. Secondo le specifiche, deve finire in .ics

Edit: in realtà io non sono sicuro - linea 6186 fornisce un esempio in ics denominazione formato, ma afferma anche è possibile utilizzare parametri URL. Non credo sia importante, a condizione che il tipo MIME è corretto.

Edit: Esempio da 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

tipo MIME è configurato sul server.

Assicurarsi di formattare la stringa come questo o non funzionerà

 $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";
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top