public function Put($id, $siteId, $account, $arPath) { $calendarId = $this->GetCalendarId($siteId, $account, $arPath); if ($calendarId == null) { return '404 Not Found'; } CDav::Report("CDavCalendarHandler::Put", "calendarId", $calendarId); $request = $this->groupdav->GetRequest(); $oldEvent = $this->GetEntry('PUT', $id, $calendarId); if (!is_null($oldEvent) && !is_array($oldEvent)) { return $oldEvent; } $charset = "utf-8"; $arContentParameters = $request->GetContentParameters(); //CDav::Report("CDavCalendarHandler::Put", "arContentParameters", $arContentParameters); if (!empty($arContentParameters['CONTENT_TYPE'])) { $arContentType = explode(';', $arContentParameters['CONTENT_TYPE']); if (count($arContentType) > 1) { array_shift($arContentType); foreach ($arContentType as $attribute) { $attribute = trim($attribute); list($key, $value) = explode('=', $attribute); if (strtolower($key) == 'charset') { $charset = strtolower($value); } } } } $content = $request->GetRequestBody(); $content = htmlspecialcharsback($content); //CDav::Report("CDavCalendarHandler::Put", "content", $content); if (is_array($oldEvent)) { $eventId = $oldEvent['ID']; } else { // Search the same event without ID $eventId = 0; } $cs = CDav::GetCharset($siteId); if (is_null($cs) || empty($cs)) { $cs = "utf-8"; } $content = $GLOBALS["APPLICATION"]->ConvertCharset($content, $charset, $cs); CDav::Report("CDavCalendarHandler::Put", "content (converted " . $charset . " -> " . $cs . ")", $content); $cal = new CDavICalendar($content, $siteId); $arEvents = $cal->GetComponents('VTIMEZONE', false); if (count($arEvents) <= 0) { return '404 Not Found'; } $arFields = $this->ConvertICalToArray($arEvents[0], $cal); if ($eventId > 0) { $arFields['ID'] = $eventId; } else { $arFields['CREATED_BY'] = $arFields['MODIFIED_BY']; } if (isset($arFields['DAV_XML_ID'])) { $arFields['XML_ID'] = $arFields['DAV_XML_ID']; } CDav::Report("CDavCalendarHandler::Put", "arFields", $arFields); $eventId = CCalendar::ModifyEvent($calendarId, $arFields); if (is_bool($eventId)) { return $eventId; } if (!is_numeric($eventId)) { return false; } //header('ETag: '.$this->GetETag($calendarId, $xmlId)); //$path = preg_replace('|(.*)/[^/]*|', '\1/', $request->GetPath()); //header('Location: '.$request->GetBaseUri().$path.$this->GetPath($xmlId)); return "201 Created"; }
private function GetICalContent(array $event, $siteId) { static $tzId = ''; if ($tzId === '') { $tzId = CDavICalendarTimeZone::getTimeZoneId(); } $arICalEvent = array("TYPE" => "VEVENT", "CREATED" => date("Ymd\\THis\\Z", MakeTimeStamp($event["DATE_CREATE"])), "LAST-MODIFIED" => date("Ymd\\THis\\Z", MakeTimeStamp($event["TIMESTAMP_X"])), "DTSTAMP" => date("Ymd\\THis\\Z", MakeTimeStamp($event["TIMESTAMP_X"])), "UID" => $event["DAV_XML_ID"], "SUMMARY" => $event["NAME"], "DTSTART" => array("VALUE" => date("Ymd\\THis", CDavICalendarTimeZone::convertDateToTimeZone($event["DT_FROM_TS"], $tzId)), "PARAMETERS" => array("TZID" => $tzId)), "DTEND" => array("VALUE" => date("Ymd\\THis", CDavICalendarTimeZone::convertDateToTimeZone($event["DT_TO_TS"], $tzId)), "PARAMETERS" => array("TZID" => $tzId))); if (isset($event["ACCESSIBILITY"]) && ($event["ACCESSIBILITY"] == 'free' || $event["ACCESSIBILITY"] == 'quest')) { $arICalEvent["TRANSP"] = 'TRANSPARENT'; } else { $arICalEvent["TRANSP"] = 'OPAQUE'; } if (isset($event["LOCATION"]) && is_array($event["LOCATION"]) && isset($event["LOCATION"]["NEW"]) && strlen($event["LOCATION"]["NEW"]) > 0) { $arICalEvent["LOCATION"] = $event["LOCATION"]["NEW"]; } if (isset($event["IMPORTANCE"])) { if ($event["IMPORTANCE"] == "low") { $arICalEvent["PRIORITY"] = 9; } elseif ($event["IMPORTANCE"] == "high") { $arICalEvent["PRIORITY"] = 1; } else { $arICalEvent["PRIORITY"] = 5; } } if (isset($event["DESCRIPTION"]) && strlen($event["DESCRIPTION"]) > 0) { $arICalEvent["DESCRIPTION"] = $event["DESCRIPTION"]; } if (isset($event["PROPERTY_REMIND_SETTINGS"]) && strlen($event["PROPERTY_REMIND_SETTINGS"]) > 0) { $arPeriodMapTmp = array("min" => "M", "hour" => "H", "day" => "D"); $ar = explode("_", $event["PROPERTY_REMIND_SETTINGS"]); $arICalEvent["@VALARM"] = array("TYPE" => "VALARM", "ACTION" => "DISPLAY", "TRIGGER" => array("PARAMETERS" => array("VALUE" => "DURATION"), "VALUE" => "-PT" . $ar[0] . $arPeriodMapTmp[$ar[1]])); } $oneDay = 86400; //24*60*60 if (isset($event["RRULE"]) && is_array($event["RRULE"])) { $val = "FREQ=" . $event["RRULE"]["FREQ"]; if (isset($event["RRULE"]["INTERVAL"]) && $event["RRULE"]["INTERVAL"] !== '') { $val .= ";INTERVAL=" . $event["RRULE"]["INTERVAL"]; } if (isset($event["RRULE"]["BYDAY"]) && $event["RRULE"]["BYDAY"] !== '') { $val .= ";BYDAY=" . $event["RRULE"]["BYDAY"]; } if (isset($event["RRULE"]["UNTIL"])) { if ($event["RRULE"]["UNTIL"] != '') { $val .= ";UNTIL=" . date("Ymd\\THis\\Z", $event["RRULE"]["UNTIL"]); } } else { $val .= ";UNTIL=" . date("Ymd\\THis\\Z", $event["DT_TO_TS"]); } if ($event["DT_SKIP_TIME"] == 'Y') { $arICalEvent["DTSTART"] = date("Ymd", $event["DT_FROM_TS"]); $arICalEvent["DTEND"] = array("VALUE" => date("Ymd", CDavICalendarTimeZone::convertDateToTimeZone($event["DT_FROM_TS"] + $event["PROPERTY_EVENT_LENGTH"], $tzId)), "PARAMETERS" => array("TZID" => $tzId)); } else { $arICalEvent["DTEND"] = array("VALUE" => date("Ymd\\THis", CDavICalendarTimeZone::convertDateToTimeZone($event["DT_FROM_TS"] + $event["PROPERTY_EVENT_LENGTH"], $tzId)), "PARAMETERS" => array("TZID" => $tzId)); } $arICalEvent["RRULE"] = $val; } elseif (isset($event["PROPERTY_PERIOD_TYPE"]) && strlen($event["PROPERTY_PERIOD_TYPE"]) > 0 && $event["PROPERTY_PERIOD_TYPE"] != "NONE") { $val = "FREQ=" . $event["PROPERTY_PERIOD_TYPE"]; if (isset($event["PROPERTY_PERIOD_COUNT"]) && strlen($event["PROPERTY_PERIOD_COUNT"]) > 0) { $val .= ";INTERVAL=" . $event["PROPERTY_PERIOD_COUNT"]; } if ($event["PROPERTY_PERIOD_TYPE"] == "WEEKLY" && strlen($event["PROPERTY_PERIOD_ADDITIONAL"]) > 0) { static $arWeekDayMap = array(6 => "SU", 0 => "MO", 1 => "TU", 2 => "WE", 3 => "TH", 4 => "FR", 5 => "SA"); $ar = explode(",", $event["PROPERTY_PERIOD_ADDITIONAL"]); $ar1 = array(); foreach ($ar as $v) { $ar1[] = $arWeekDayMap[$v]; } $val .= ";BYDAY=" . implode(",", $ar1); } $val .= ";UNTIL=" . date("Ymd\\THis\\Z", MakeTimeStamp($event["ACTIVE_TO"])); if (date("H:i:s", MakeTimeStamp($event["ACTIVE_FROM"])) == "00:00:00" && date("H:i:s", MakeTimeStamp($event["ACTIVE_FROM"]) + $event["PROPERTY_EVENT_LENGTH"]) == "00:00:00") { $arICalEvent["DTSTART"] = date("Ymd", MakeTimeStamp($event["ACTIVE_FROM"])); $arICalEvent["DTEND"] = array("VALUE" => date("Ymd", CDavICalendarTimeZone::convertDateToTimeZone(MakeTimeStamp($event["ACTIVE_FROM"]) + $event["PROPERTY_EVENT_LENGTH"], $tzId)), "PARAMETERS" => array("TZID" => $tzId)); } else { $arICalEvent["DTEND"] = array("VALUE" => date("Ymd\\THis", CDavICalendarTimeZone::convertDateToTimeZone(MakeTimeStamp($event["ACTIVE_FROM"]) + $event["PROPERTY_EVENT_LENGTH"], $tzId)), "PARAMETERS" => array("TZID" => $tzId)); } $arICalEvent["RRULE"] = $val; } else { if ($event['DT_SKIP_TIME'] == 'Y') { $arICalEvent["DTSTART"] = date("Ymd", $event["DT_FROM_TS"]); $arICalEvent["DTEND"] = date("Ymd", $event["DT_TO_TS"] + $oneDay); // $arICalEvent["DTSTART"] = date("Ymd", MakeTimeStamp($event["DT_FROM"])); // $arICalEvent["DTEND"] = date("Ymd", MakeTimeStamp($event["DT_TO"]) + $oneDay); } } // TODO: we have to update SEQUENCE corresponding to rfc5546 $arICalEvent["SEQUENCE"] = $event["VERSION"]; $cal = new CDavICalendar($arICalEvent, $siteId); return $cal->Render(); }
private function GetICalContent(array $event, $siteId) { $arICalEvent = array("TYPE" => "VEVENT", "CREATED" => date("Ymd\\THis\\Z", MakeTimeStamp($event["DATE_CREATE"])), "LAST-MODIFIED" => date("Ymd\\THis\\Z", MakeTimeStamp($event["TIMESTAMP_X"])), "DTSTAMP" => date("Ymd\\THis\\Z", MakeTimeStamp($event["TIMESTAMP_X"])), "UID" => $event["XML_ID"], "SUMMARY" => $event["NAME"], "DTSTART" => array("VALUE" => date("Ymd\\THis", MakeTimeStamp($event["ACTIVE_FROM"])), "PARAMETERS" => array("TZID" => CDav::GetTimezoneId($siteId))), "DTEND" => array("VALUE" => date("Ymd\\THis", MakeTimeStamp($event["ACTIVE_TO"])), "PARAMETERS" => array("TZID" => CDav::GetTimezoneId($siteId)))); if (isset($event["PROPERTY_ACCESSIBILITY"]) && ($event["PROPERTY_ACCESSIBILITY"] == 'free' || $event["PROPERTY_ACCESSIBILITY"] == 'quest')) { $arICalEvent["TRANSP"] = 'TRANSPARENT'; } else { $arICalEvent["TRANSP"] = 'OPAQUE'; } if (isset($event["PROPERTY_LOCATION"]) && strlen($event["PROPERTY_LOCATION"]) > 0) { $arICalEvent["LOCATION"] = $event["PROPERTY_LOCATION"]; } if (isset($event["PROPERTY_IMPORTANCE"])) { if ($event["PROPERTY_IMPORTANCE"] == "low") { $arICalEvent["PRIORITY"] = 9; } elseif ($event["PROPERTY_IMPORTANCE"] == "high") { $arICalEvent["PRIORITY"] = 1; } else { $arICalEvent["PRIORITY"] = 5; } } if (isset($event["DETAIL_TEXT"]) && strlen($event["DETAIL_TEXT"]) > 0) { $arICalEvent["DESCRIPTION"] = strip_tags($event["DETAIL_TEXT"]); } if (isset($event["PROPERTY_REMIND_SETTINGS"]) && strlen($event["PROPERTY_REMIND_SETTINGS"]) > 0) { $arPeriodMapTmp = array("min" => "M", "hour" => "H", "day" => "D"); $ar = explode("_", $event["PROPERTY_REMIND_SETTINGS"]); $arICalEvent["@VALARM"] = array("TYPE" => "VALARM", "ACTION" => "DISPLAY", "TRIGGER" => array("PARAMETERS" => array("VALUE" => "DURATION"), "VALUE" => "-PT" . $ar[0] . $arPeriodMapTmp[$ar[1]])); } if (isset($event["PROPERTY_PERIOD_TYPE"]) && strlen($event["PROPERTY_PERIOD_TYPE"]) > 0 && $event["PROPERTY_PERIOD_TYPE"] != "NONE") { $val = "FREQ=" . $event["PROPERTY_PERIOD_TYPE"]; if (isset($event["PROPERTY_PERIOD_COUNT"]) && strlen($event["PROPERTY_PERIOD_COUNT"]) > 0) { $val .= ";INTERVAL=" . $event["PROPERTY_PERIOD_COUNT"]; } if ($event["PROPERTY_PERIOD_TYPE"] == "WEEKLY" && strlen($event["PROPERTY_PERIOD_ADDITIONAL"]) > 0) { static $arWeekDayMap = array(6 => "SU", 0 => "MO", 1 => "TU", 2 => "WE", 3 => "TH", 4 => "FR", 5 => "SA"); $ar = explode(",", $event["PROPERTY_PERIOD_ADDITIONAL"]); $ar1 = array(); foreach ($ar as $v) { $ar1[] = $arWeekDayMap[$v]; } $val .= ";BYDAY=" . implode(",", $ar1); } $val .= ";UNTIL=" . date("Ymd\\THis\\Z", MakeTimeStamp($event["ACTIVE_TO"])); if (date("H:i:s", MakeTimeStamp($event["ACTIVE_FROM"])) == "00:00:00" && date("H:i:s", MakeTimeStamp($event["ACTIVE_FROM"]) + $event["PROPERTY_EVENT_LENGTH"]) == "00:00:00") { $arICalEvent["DTSTART"] = date("Ymd", MakeTimeStamp($event["ACTIVE_FROM"])); $arICalEvent["DTEND"] = array("VALUE" => date("Ymd", MakeTimeStamp($event["ACTIVE_FROM"]) + $event["PROPERTY_EVENT_LENGTH"]), "PARAMETERS" => array("TZID" => CDav::GetTimezoneId($siteId))); } else { $arICalEvent["DTEND"] = array("VALUE" => date("Ymd\\THis", MakeTimeStamp($event["ACTIVE_FROM"]) + $event["PROPERTY_EVENT_LENGTH"]), "PARAMETERS" => array("TZID" => CDav::GetTimezoneId($siteId))); } $arICalEvent["RRULE"] = $val; } else { if (date("H:i:s", MakeTimeStamp($event["ACTIVE_FROM"])) == "00:00:00" && date("H:i:s", MakeTimeStamp($event["ACTIVE_TO"])) == "00:00:00") { $arICalEvent["DTSTART"] = date("Ymd", MakeTimeStamp($event["ACTIVE_FROM"])); $arICalEvent["DTEND"] = date("Ymd", MakeTimeStamp($event["ACTIVE_TO"]) + 24 * 60 * 60); } } $cal = new CDavICalendar($arICalEvent, $siteId); return $cal->Render(); }
private function GetICalContent(array $event, $siteId) { $oneDay = 86400; //24*60*60 $dateFrom = date("Ymd\\THis", MakeTimeStamp($event["DATE_FROM"])); $dateTo = date("Ymd\\THis", MakeTimeStamp($event["DATE_TO"])); $tzFrom = $event["TZ_FROM"]; $tzTo = $event["TZ_TO"]; $arICalEvent = array("TYPE" => "VEVENT", "CREATED" => date("Ymd\\THis\\Z", MakeTimeStamp($event["DATE_CREATE"])), "LAST-MODIFIED" => date("Ymd\\THis\\Z", MakeTimeStamp($event["TIMESTAMP_X"])), "DTSTAMP" => date("Ymd\\THis\\Z", MakeTimeStamp($event["TIMESTAMP_X"])), "UID" => $event["DAV_XML_ID"], "SUMMARY" => $event["NAME"]); if ($event["DT_SKIP_TIME"] == 'Y') { $arICalEvent["DTSTART"] = date("Ymd", MakeTimeStamp($event["DATE_FROM"])); $arICalEvent["DTEND"] = date("Ymd", MakeTimeStamp($event["DATE_TO"]) + $oneDay); } else { $arICalEvent["DTSTART"] = array("VALUE" => $dateFrom, "PARAMETERS" => array("TZID" => $tzFrom)); $arICalEvent["DTEND"] = array("VALUE" => $dateTo, "PARAMETERS" => array("TZID" => $tzTo)); } if (isset($event["ACCESSIBILITY"]) && ($event["ACCESSIBILITY"] == 'free' || $event["ACCESSIBILITY"] == 'quest')) { $arICalEvent["TRANSP"] = 'TRANSPARENT'; } else { $arICalEvent["TRANSP"] = 'OPAQUE'; } if (isset($event["LOCATION"]) && is_array($event["LOCATION"]) && isset($event["LOCATION"]["NEW"]) && strlen($event["LOCATION"]["NEW"]) > 0) { $arICalEvent["LOCATION"] = $event["LOCATION"]["NEW"]; } if (isset($event["IMPORTANCE"])) { if ($event["IMPORTANCE"] == "low") { $arICalEvent["PRIORITY"] = 9; } elseif ($event["IMPORTANCE"] == "high") { $arICalEvent["PRIORITY"] = 1; } else { $arICalEvent["PRIORITY"] = 5; } } if (isset($event["DESCRIPTION"]) && strlen($event["DESCRIPTION"]) > 0) { $arICalEvent["DESCRIPTION"] = $event["DESCRIPTION"]; } if (isset($event["PROPERTY_REMIND_SETTINGS"]) && strlen($event["PROPERTY_REMIND_SETTINGS"]) > 0) { $arPeriodMapTmp = array("min" => "M", "hour" => "H", "day" => "D"); $ar = explode("_", $event["PROPERTY_REMIND_SETTINGS"]); $arICalEvent["@VALARM"] = array("TYPE" => "VALARM", "ACTION" => "DISPLAY", "TRIGGER" => array("PARAMETERS" => array("VALUE" => "DURATION"), "VALUE" => "-PT" . $ar[0] . $arPeriodMapTmp[$ar[1]])); } if (isset($event["RRULE"]) && is_array($event["RRULE"])) { $val = "FREQ=" . $event["RRULE"]["FREQ"]; if (isset($event["RRULE"]["INTERVAL"]) && $event["RRULE"]["INTERVAL"] !== '') { $val .= ";INTERVAL=" . $event["RRULE"]["INTERVAL"]; } if (isset($event["RRULE"]["BYDAY"]) && $event["RRULE"]["BYDAY"] !== '') { $val .= ";BYDAY=" . $event["RRULE"]["BYDAY"]; } if (isset($event["RRULE"]["UNTIL"])) { if ($event["RRULE"]["UNTIL"] != '' && intval($event["RRULE"]["UNTIL"]) == $event["RRULE"]["UNTIL"]) { $val .= ";UNTIL=" . date("Ymd\\THis\\Z", $event["RRULE"]["UNTIL"]); } else { if ($event["RRULE"]["UNTIL"] != '') { $val .= ";UNTIL=" . date("Ymd\\THis\\Z", MakeTimeStamp($event["RRULE"]["UNTIL"])); } } } else { $val .= ";UNTIL=" . date("Ymd\\THis\\Z", $event['DATE_TO_TS_UTC'] + intVal(date("Z"))); } $arICalEvent["RRULE"] = $val; } // TODO: we have to update SEQUENCE corresponding to rfc5546 $arICalEvent["SEQUENCE"] = $event["VERSION"]; $cal = new CDavICalendar($arICalEvent, $siteId); return $cal->Render(); }