Como posso usar o PHP para publicar dinamicamente um arquivo iCal para ser lido por Google Agenda?

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

  •  13-09-2019
  •  | 
  •  

Pergunta

Qualquer pesquisa no Google sobre PHP iCal apenas trás phpicalendar e como analisar ou ler em arquivos iCal. Eu só quero escrever um arquivo PHP que puxa os eventos do meu banco de dados e escreve-los em formato iCal.

O meu problema é que não consigo encontrar em qualquer lugar que vai responder a duas perguntas:

  1. O que é a exata formato iCal, incluindo cabeçalhos, formato de arquivo, rodapés, etc.? Em outras palavras, o que o arquivo tem que ter, exatamente, a fim de ser devidamente lido em pelo Google Calendar, etc.?
  2. Se eu construir este arquivo usando uma extensão .php, como faço para publicá-lo como ical? Eu tenho que escrever para um novo arquivo ICS? Ou será que o Google Agenda etc. ler um arquivo .php como ical contanto que o conteúdo está no formato correto? (Assim como um arquivo style.css.php será lido como um arquivo CSS se o conteúdo for realmente CSS, etc.)

Qualquer ajuda que todos podem dar ou apontar-me a será muito apreciada !!!

Foi útil?

Solução

Isto deve ser muito simples se o Google Calendar não exige que o *.ics-extensão (que vai exigir alguma URL reescrevendo no servidor).

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

Isso é essencialmente tudo o que você precisa para fazer um cliente pensar que você está servindo um arquivo iCalendar, embora possa haver alguns problemas relacionados a armazenamento em cache, codificação de texto e assim por diante. Mas você pode começar a experimentar com este código simples.

Outras dicas

Uma nota de experiência pessoal, além de resposta resposta e Dave Nenhum de de ambos Stefan Gehrig (ea resposta de mmmshuddup):

Eu estava tendo problemas de validação usando tanto \ n e PHP_EOL quando eu usei o validador ICS em http://severinghaus.org/projects/ ICV /

Eu aprendi que eu tinha que usar \ r \ n, a fim de obtê-lo para validar corretamente, então esta foi a minha solução:

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;

Isso parou meus erros de análise e fez meus arquivos ICS validar corretamente.

Há um excelente eluceo / iCal pacote que permite que você crie facilmente arquivos ics.

Aqui está um exemplo de uso de documentos:

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

Talvez um pouco tarde, mas aqui está um link para a especificação real. http://tools.ietf.org/html/rfc5545 1

http://www.kanzaki.com/docs/ical/ tem um pouco versão mais legível da especificação mais velho. Ele ajuda como um ponto de partida -. Muitas coisas ainda são os mesmos

Também na meu site , eu tenho

  1. Algumas listas de recursos úteis (ver barra lateral inferior direita) em
    • ical Spec RFC 5545
    • iCal recursos de teste
  2. Algumas notas gravado em minha jornada de trabalho com .ics ao longo dos últimos anos. Em particular, você pode encontrar este eventos repetidos 'cheatsheet' para ser útil.

áreas .ics que necessitam de um tratamento cuidadoso:

  • 'todos os dias' eventos
  • tipos de datas (fuso horário, UTC ou local 'flutuante') - nb entender distinção
  • interoperabilidade das regras de recorrência
  1. formato iCal exata: http://www.ietf.org/rfc/rfc2445.txt
  2. De acordo com a especificação, tem que terminar em .ics

Edit: na verdade, eu não tenho certeza - linha 6186 dá um exemplo em .ics formato de nomenclatura, mas também afirma que você pode usar parâmetros de URL. Eu não penso que importa, contanto que o tipo MIME está correto.

Editar: Exemplo 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
Tipo

MIME é configurado no servidor.

Certifique-se de formatar a cadeia de caracteres como este ou ele não vai funcionar

 $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";
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top