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ší formaDTSTART:YYYYMMDDTHHMMSS- formát s časem v lokálním formátuDTSTART:YYYYMMDDTHHMMSSZ- tady pozor Z na konci udává, že máte hodnoty v UTC (pokud ne vzniká čas posun)DTENDje obdobněRRULE:FREQ=DAILY;UNTIL=YYYYMMDDTHHMMSS- pro opakované události
URL- nesmí obsahovat entity (nepodporuje Google Calendar)DESCRIPTION- dlouhý popisSUMMARY- nadpisLOCATION- 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
DESCRIPTIONnezapoměňtehtmlspecialchars_decode(str_replace(chr(13).chr(10),"\\n"))
