Voor een bepaald project ben ik bezig met iets waarvoor ik onze agenda’s moet uitlezen. We houden beide onze agenda’s bij in Exchange en helaas kun je hier niet een kant-en-klaar ICal-bestand uit halen. Gelukkig kun je wel communiceren met WebDAV, echter is dat best een heibel werkje.
Het script hieronder haalt van ons beide de agenda op en retourneert een JSON-array met onze afspraken. Ook zet hij er bij van wie welke afspraak is, of of hij van ons allebei is.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<?php function getAppointments($username, $password, $url) { $request = '<?xml version="1.0"?>'; $request.= '<d:searchrequest xmlns:d="DAV:" xmlns:cal="urn:schemas:calendar:">'; $request.= '<d:sql> SELECT "DAV:href", "urn:schemas:calendar:dtstart", "urn:schemas:calendar:dtend", "urn:schemas:httpmail:subject" FROM Scope(\'SHALLOW TRAVERSAL OF "'.$url.'" \') WHERE "DAV:contentclass" = \'urn:content-classes:appointment\' AND "urn:schemas:calendar:dtstart" >= CAST("'.date("c").'" AS "dateTime.tz") ORDER BY "urn:schemas:calendar:dtstart" ASC</d:sql>'; $request.= '</d:searchrequest>'; $context = stream_context_create(array( 'http' => array( 'method' => 'SEARCH', 'header' => array("Content-type: text/xml", "Depth: 1,noroot", "Authorization: Basic " . base64_encode($username . ":" . $password)), 'content' => $request, ) )); $data = str_replace(":", "_", file_get_contents($url, false, $context)); return $data; } $appointments = array(); for ($i = 0 ; $i < 2 ; $i++) { switch ($i) { case 0: $url = 'https://server/exchange/erik/Calender/'; $username = "erik"; $password = ""; break; case 1: $url = 'https://server/exchange/marloes/Calender/'; $username = "marloes"; $password = ""; break; } $xml = simplexml_load_string(getAppointments($username, $password, $url)); foreach ($xml->a_response as $waarde) { $dt = str_replace("_", ":", $waarde->a_propstat->a_prop->d_dtstart); $dt = strtotime($dt); if (array_key_exists($dt, $appointments)) { if ($appointments[$dt]["title"] == (string)$waarde->a_propstat->a_prop->e_subject) { $appointments[$dt]["both"] = true; } else { $dt++; } } $appointments[$dt]["title"] = (string)$waarde->a_propstat->a_prop->e_subject; $appointments[$dt]["username"] = $username; } } ksort($appointments, SORT_NUMERIC); foreach ($appointments as $time => $value) { $appt_json[] = array("date" => date('c', $time), "title" => $value["title"], "username" => ($value["both"] ? "both" : $value["username"])); } echo json_encode($appt_json); ?> |