Динамический .ics от php не обновляется в календаре Google - PullRequest
5 голосов
/ 01 сентября 2011

Я пытался создать страницу .ics в php, которую нужно добавить в Календарь Google через "Добавить по URL", чтобы я мог извлечь события из базы данных и представить их в календаре.

Я какое-то время искал в SO и нашел еще один пост, который очень помог с самого начала, но теперь я наткнулся на загвоздку, которая, похоже, не затрагивает людей с похожим кодом. Сообщение можно найти здесь .

Итак, моя проблема в том, что я не могу заставить Календарь Google обновить мою страницу, как если бы она кэшировала страницу в календаре. Поэтому, когда я добавляю другой VEVENT на страницу, он не обновляет календарь.

При создании файла генерируется правильный формат для файла * .ics. Формат показан ниже.

Если я перехожу прямо на страницу, мне выдается запрос на загрузку файла, который работает для импорта в GC, и если я добавляю тот же код на другую страницу, например, изменяя имя страницы с cal. php до cal2.php , заставит GC прочитать все события, в то время как я просто добавлю тот же URL-адрес, что и раньше, и не обнаружит никаких изменений, внесенных в файл.

Кто-нибудь знает, почему это не обновляется?

Другие, у которых были подобные проблемы, решили эту проблему, добавив UID к своему VEVENT, что ничего не решило для меня ...

Сгенерированный формат

BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//hacksw/handcal//NONSGML v1.0//EN
BEGIN:VEVENT
UID:17d88c861131ec62f18835cdd4eb7d0c@yourhost.test
DTSTAMP:20110901T092002Z
DTSTART:20110925T170000Z
DTEND:20110928T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
BEGIN:VEVENT
UID:00813115d1a2d21447eb11ded3ba9020@yourhost.test
DTSTAMP:20110901T092002Z
DTSTART:20110929T170000Z
DTEND:20110930T035959Z
SUMMARY:Camping Trip
END:VEVENT
BEGIN:VEVENT
UID:1f18d85fe516d684536129ed066e7d4f@yourhost.test
DTSTAMP:20110901T092002Z
DTSTART:20110914T170000Z
DTEND:20110915T035959Z
SUMMARY:Testing new Event
END:VEVENT
END:VCALENDAR

Используемый код

<?php
header("Content-Type: text/Calendar");
header("Content-Disposition: inline; filename=\"calendar.ics\"");
echo "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:20110925T170000Z
DTEND:20110928T035959Z
SUMMARY:Bastille Day Party
END:VEVENT
BEGIN:VEVENT
UID:" . md5(uniqid(mt_rand(), true)) . "@yourhost.test
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:20110929T170000Z
DTEND:20110930T035959Z
SUMMARY:Camping Trip
END:VEVENT
BEGIN:VEVENT
UID:" . md5(uniqid(mt_rand(), true)) . "@yourhost.test
DTSTAMP:" . gmdate('Ymd').'T'. gmdate('His') . "Z
DTSTART:20110914T170000Z
DTEND:20110915T035959Z
SUMMARY:Testing new Event
END:VEVENT
END:VCALENDAR";
?>

Ответы [ 3 ]

2 голосов
/ 24 августа 2014

csanyigabor правильно.Также вы должны убедиться, что идентификаторы UID совпадают, чтобы приложение соответствовало событиям.Этот вопрос и ответ здесь касаются отмены, но принцип тот же Как отменить событие календаря, используя файлы ics?

2 голосов
/ 05 декабря 2013

Я думаю, вы должны использовать атрибут SEQUENCE в VEVENT , и он должен увеличиваться после каждого изменения.

0 голосов
/ 09 мая 2017

@ csanyigabor прав, как и @anmari, но несколько других советов я подобрал.Когда вы создаете свой ICS-файл, как сказал anmari, убедитесь, что ваш UID согласован каждый раз, когда ваш канал синхронизируется.Я заставил его создать хеш на основе некоторого текста, предоставленного пользователем (плохая, плохая идея. Позор мне 5 лет назад, когда я его создал).

Если вы идете сюда -> https://tools.ietf.org/html/rfc5545 (и несколько обновленных пунктов здесь -> https://tools.ietf.org/html/rfc7986), это дает некоторые отличные описания полезных вещей.В частности, 3.8.7.4. Sequence Number и в нем изложены критерии для новой последовательности.

  Description: When a calendar component is created, its sequence
  number is 0.  It is monotonically incremented by the "Organizer's"
  CUA each time the "Organizer" makes a significant revision to the
  calendar component.

Также полезно то, что говорится об UID в 3.8.4.7. Unique Identifier

  Description:  The "UID" itself MUST be a globally unique identifier.
  The generator of the identifier MUST guarantee that the identifier
  is unique.  There are several algorithms that can be used to
  accomplish this.  A good method to assure uniqueness is to put the
  domain name or a domain literal IP address of the host on which
  the identifier was created on the right-hand side of an "@", and
  on the left-hand side, put a combination of the current calendar
  date and time of day (i.e., formatted in as a DATE-TIME value)
  along with some other currently unique (perhaps sequential)
  identifier available on the system (for example, a process id
  number).  Using a DATE-TIME value on the left-hand side and a
  domain name or domain literal on the right-hand side makes it
  possible to guarantee uniqueness since no two hosts should be
  using the same domain name or IP address at the same time.  Though
  other algorithms will work, it is RECOMMENDED that the right-hand
  side contain some domain identifier (either of the host itself or
  otherwise) such that the generator of the message identifier can
  guarantee the uniqueness of the left-hand side within the scope of
  that domain.

Example: The following is an example of this property:

 UID:19960401T080045Z-4000F192713-0052@host1.com
...