Pár tipů pro práci s formátem iCalendar

Dělám na PHP aplikaci, která kromě RSS generuje také iCalendar pro Lighting a iCal na Mac OS X. Někomu stačí asi RFC 2445 a hravě si s tím poradí, ale pro ty ostatní pár tipů, které mi pomohli a které mě trochu mátli. Ještě může bý napomocný iCalendar Specification Excerpts. Data mám v mysql kde je datum a čas odděleně a pokud událost nemá čas (je NULL) tak je to celodenní událost. Pokud má jen čas od tak končí za nějakou stanovenou dobu třeba 90 min jako ve škole. Pokud má jen datum od tak je to jednodenní akce. Pár zásad při tvorbě iCalendar exportu

  • jednotlivé tagy jsou velkými písmeny a na samostatných řádcích
  • tagy jsou volitelné a je jich mnoho vyberte si ty které opravdu potřebujete
  • datum se dá udávat několika způsoby:
    • DTSTART;VALUE=DATE:YYYYMMDD - jen datum asi nejednoduší forma
    • DTSTART:YYYYMMDDTHHMMSS - formát s časem v lokálním formátu
    • DTSTART:YYYYMMDDTHHMMSSZ - tady pozor Z na konci udává, že máte hodnoty v UTC (pokud ne vzniká čas posun)
    • DTEND je obdobně
    • RRULE:FREQ=DAILY;UNTIL=YYYYMMDDTHHMMSS - pro opakované události
  • URL - nesmí obsahovat entity (nepodporuje Google Calendar)
  • DESCRIPTION - dlouhý popis
  • SUMMARY - nadpis
  • LOCATION - místo konání akce

Formát si zkontrolujte validátorem, to nikdy neškodí. Já potom zkouším genrovaný iCalendar v Lightingu, Windows Calendar a Google Calendar. iCal pro Mac OS X nemám snad to v něm bude fungovat také. Pro správné zobrazení češtiny v Google calendar nezapomeňte hlavičku, ostatní si poradí i bez ní, nevím proč Google ne. header(“Content-Type: text/calendar; charset=utf-8”); header(“Content-Disposition: attachment; filename=calendar.ics”); Základní objekt iCalendar, který popisuje “Den oslav dobytí Bastily” jako událost konající se od 14. července 1997 17:00 (UTC) do 15. července 1997 03:59:59 (UTC)

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

Update

  • v SQL se hodí použít SELECT DATE_FORMAT(datum,'%Y%m%d') as datum, TIME_FORMAT(cas,'%H%i%s') as cas, ...
  • jako konce řádek je dobré napsat přímo chr(13).chr(10)
  • u DESCRIPTION nezapoměňte htmlspecialchars_decode(str_replace(chr(13).chr(10),"\\n"))