skok na hlavní menu | menu sekce Aktuality
V našem firemním informačním systému používáme kalendář, který je potřeba synchronizovat s kalendářem našich pracovníků v Outlooku. V tomto článku vás seznámíme s jednoduchou a efektivní metodou, která tuto synchronizaci provádí.
Informační systém obsahuje kalendář s naplánovanou prací továrníkům, ten je potřeba pravidelně synchronizovat s kalendářem v Outlooku. Synchronizace je jednosměrná, v Outlooku není možné tento kalendář nijak měnit. Synchronizovat by se mělo ideálně vždy po změně kalendáře, což se děje alespoň jednou za hodinu.
Možností je několik, jejich společným jmenovatelem je formát iCalendar (přípona .ics), což je standard formátu souborů pro synchronizaci kalendářů.
Po změně kalendáře v ISu se odběratelům rozešlou emaily s přílohou ve které budou aktualizace kalendáře. Původně jsme implementovali tuto variantu, setkali jsme se ale se třemi problémy:
Pošleme celý kalendář vyexportovaný jako .ics soubor v příloze mailu.
Outlooku předáme odkaz na .ics soubor s kalendářem, který si jej pak periodicky stahuje. Na serveru tedy stačí vytvářet na určité adrese iCalendar soubor, nikam jej nemusíme posílat. Stahování, resp. kontrola změny souboru, probíhá společně s kontrolou poštovní schránky, RSS kanálů atp., tedy např. při stisknutí klávesy F9.
Nevýhodou tohoto řešení je fakt, že podpora WebCal formátu je přítomna v Outlooku až od verze 2007.
Další potenciální problém je v tom, že kalendář je volně přístupný na webu nebo síti – Outlook jej musí být schopen stáhnout bez jakékoli autentizace. V našem ISu toto řešíme tak, že adresa kalendářů je tajná a neuhodnutelná.
Z názvu článku je asi patrné, že jsme se rozhodli pro tuto variantu.
Formát souboru je standardní iCalendar. Přestože se jedná o zavedený a veřejný standard, jeho použití je často problematické. Při ladění jsme se mnohokrát setkali se situací, kdy ostatní programy soubor akceptovaly, Outlook ale ne a jeho chybové hlášky moc nápomocné nebyly. Je proto dobré se držet otestovaných řešení, jako je např. toto.
Obsah souboru se skládá ze dvou částí – hlavičky týkající se celého kalendáře a výpisu úkolů. Toto je samozřejmě zjednodušení, které si můžeme dovolit pouze pro naši aplikaci.
Soubor se skládá ze dvojic JMÉNO:HODNOTA. Pokud hodnota obsahuje delší text, je nutné jej rozdělit na řádky po 75 znacích, každý nový řádek musí začínat mezerou (tím dáváme najevo, že hodnota pokračuje).
V následujících ukázkách počítejte s tím, že text od výskytu znaku # až po konec řádku je komentář, který v souboru neexistuje.
Hlavička i patička jsou v souboru přirozeně pouze jednou.
BEGIN:VCALENDAR
PRODID:-//Tovarna//IS//EN # Aplikace generující kalendář
VERSION:2.0 # Odlišuje od předchozího standardu vCalendar
CALSCALE:GREGORIAN # Nastavuje Gregoriánský kalendář. Nic jiného asi ani není podporováno.
METHOD:PUBLISH
X-WR-CALNAME:IS # Jméno kalendáře - tak, jak se zobrazuje v Outlooku
X-WR-TIMEZONE:Europe/Belgrade # Časová zóna
Úkolů může být v souboru libovolné množství. Formát času je v iCalendar souborech trochu netypický: 20100103T163815Z znamená 3. leden 2010 16:38:15 UTC (znak Z na konci). Specifikace sice někde umožňuje použití i lokálního času, my ale pracujeme pouze s poli, které musí obsahovat data v UTC.
BEGIN:VEVENT
ATTENDEE;CN=t@tovarna.cz;RSVP=TRUE:mailto:t@tovarna.cz
ORGANIZER;CN="IS":mailto:is@tovarna.cz
CLASS:PUBLIC
CREATED:20100103T163815Z # Datum vytvoření události
DTSTAMP:20100103T163815Z # Pro naše potřeby řekněme, že to samé jako CREATED
DTEND:20100104T110048Z # Datum konce události
DTSTART:20100104T080048Z # Započetí události
LAST-MODIFIED:20100103T163815Z # Datum poslední modifikace
SEQUENCE:0 # Pro nás nezajímavé
SUMMARY;LANGUAGE=cs:Krátký popis # Krátký popis
DESCRIPTION:Odkaz: http://localhost/ng/public/id/60
Delší popis události na více řádků.
Je nutné na začátek přidat mezeru.
TRANSP:OPAQUE # Říká, že událost spotřebovává čas/prostředky
UID:01IBEH1BT3OK7I3I2SJXEKP5LVT3ODM13 # Unikátní ID pro identifikaci Outlookem
X-MICROSOFT-CDO-BUSYSTATUS:BUSY # Jedná se o práci nebo volno?
END:VEVENT
END:VCALENDAR
// Formátuje timestamp na iCalendar formát
function icalDatetime($timestamp)
{
return strftime("%Y%m%dT%H%M%S", $timestamp);
}
// Rozseká text na řádky po 75 znacích
function prepareText($text)
{
return chunk_split($text, 75, "
");
}
define("TIMEZONE_OFFSET", 3600); // ČR je +1 od UTC
$content = "BEGIN:VCALENDAR
PRODID:-//Tovarna//IS//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:IS
X-WR-TIMEZONE:Europe/Belgrade";
foreach($events as $ev)
$content .= "
BEGIN:VEVENT
ATTENDEE;CN=".$user["email"].";RSVP=TRUE:mailto:".$user["email"]."
ORGANIZER;CN="IS":mailto:is@tovarna.cz
CLASS:PUBLIC
CREATED:".icalDatetime(time() - TIMEZONE_OFFSET)."Z
DTEND:".icalDatetime($ev["end"] - TIMEZONE_OFFSET)."Z
DTSTAMP:".icalDatetime(time() - TIMEZONE_OFFSET)."Z
DTSTART:".icalDatetime($ev["begin"] - TIMEZONE_OFFSET)."Z
LAST-MODIFIED:".icalDatetime(time() - TIMEZONE_OFFSET)."Z
SEQUENCE:0
SUMMARY;LANGUAGE=cs:".prepareText($summary)."
DESCRIPTION:".prepareText($description)."
TRANSP:OPAQUE
UID:".generateUID()."
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
END:VEVENT";
$content .= "
END:VCALENDAR";
/*
* Jako jméno je použit SHA1 hash kvůli bezpečnosti. Soubor musí být k dispozici
* ke stáhnutí, ale jen se znalostí správné adresy.
*/
file_put_contents(ICALENDAR_DIR . "/" . sha1($user) . ".ics", $content);
Předpokládejme, že máme kalendář vygenerovaný ve formátu iCalendar na URL: http://example.org/kalendar.ics
Máme dvě možnosti, jak na něj odkazovat:
webcal:// je neoficiální URI schéma, které prohlížeči říká, že soubor nemá stahovat, ale radši poslat asociované aplikaci odkaz.
| E-mail: info@tovarna.cz |
| Telefon: +420 274 776 344 |
| Mobil: +420 739 654 469 |
| Doubravčická 1474/21 |
| 100 00 Praha 10 |
| Telefon: +420 274 776 344 |
Podmínky užití | O aplikaci | Prohlášení o přístupnosti | Mapa stránek | FAQ | Slovník pojmů
Pečlivě vyrobila TOVARNA.CZ, s.r.o. | Tato prezentace využívá systém pro správu obsahu WebRedie.