Я использую сайт PHP с пользовательской базой данных и управляемой базой данных общего календаря (событий).
Я хочу опубликовать эти события в iCal / CalDAV, чтобы участники могли:
- Синхронизация всех событий календаря с аутентификацией (частный URL ...)
- Присоединяйтесь к мероприятию
- (Но не создавать и не изменять событие)
Приложение должно использовать существующую на сайте базу данных пользователей и календарей.
Я просмотрел реализации CalDav в PHP и Python, все они кажутся слишком сложными для этого простого использования:
- saber / dav имеет экспериментальную поддержку общего календаря, и использование существующей базы данных пользователей кажется сложной задачей.
- DAViCal, похоже, имеет собственную базу данных пользователей, сложные схемы ACL и т. д.
- И Т. Д.
Как это сделать?
- Используйте адаптированную библиотеку CalDAV / iCal? Есть идеи библиотеки, которая справилась бы с этой работой?
- Напишите свой собственный сервер CalDAV / iCal с риском плохой поддержки клиентов.
РЕДАКТИРОВАТЬ: полезные ссылки для использования saber / dav с существующей базой данных веб-сайта:
РЕДАКТИРОВАТЬ: Улучшения:
Несмотря на то, что он работает должным образом, saber / DAV оказывается слишком медленно при создании серверного события с приглашениями для ~ 100 местных жителей («принципалов»). И он генерирует 99 бесполезных копий события для каждого приглашенного. На обработку приглашений ушло около 8 секунд (30+ секунд при включенном профилировании xdebug, и это привело к сбою!).
Что касается использования общего календаря, в стандарте есть только две возможности: либо предоставить приглашенному доступ для чтения и записи, чтобы он мог присоединиться к мероприятию (но также изменить / удалить его!), Либо предоставить ему доступ для чтения и записи. только доступ ... но он не может к нему присоединиться. Итак, я играл с
Sabre\CalDAV\Backend\PDO::updateCalendarObject()
, чтобы ограничить редактирование событий участникомPARTSTAT
.
Но каким бы ни было решение, есть проблема с конфликтами:
Когда участник A изменяет запись календаря, говоря, что он участвует (
PARTSTAT ACCEPTED
), Sabre / DAV обрабатывает эту информацию, обновляя все объекты календаря во всех календарях пользователей. При этом SabreDAV увеличивает токен SYNC всех этих календарей.Поэтому, когда участник B пытается присоединиться к мероприятию, но не синхронизировал информацию о том, что участник A присоединился к мероприятию, возникает конфликт, и информация о присоединении участника B становится УТЕРЯНОЙ.
Решение конфликта:
RFC 6638 определяет способ избежать таких конфликтов с помощью a
schedule-tag
. Это только в дорожной карте Sabre / DAV для v3.3. Я разработал экспериментальную поддержку для saber / dav здесь, но все же все Клиенты Android, которые я тестировал, не поддерживают этот RFC, только iOS поддерживает! В любом случае, даже сschedule-tag
, если организатор изменит данные мероприятия или при использовании общих календарей, часть информации о присоединении участников будет потеряна.Поэтому я сделал свою собственную реализацию saber / dav, чтобы в большинстве случаев никогда не терять информацию о присоединении к участникам (кроме случаев, когда событие переносится): saber / dav partstat-only-calendar. По сути, он работает, учитывая конфликтующее СОБЫТИЕ, отправленное пользователем, и записывает только информацию PARSTAT участника в событии сервера, вместо того, чтобы обычно выдвигать исключение PreconditionFailed. Мне все еще нужно опубликовать пример сценария запуска сервера, который использует все функции.