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"; }
public function GetCalendarItemsList($path = '/', $arHrefs = null, $calendarData = false, $arFilter = array()) { $this->ClearErrors(); $this->Connect(); if (!is_array($arHrefs)) { $arHrefs = array($arHrefs); } $arHrefsNew = array(); foreach ($arHrefs as $value) { if (!empty($value)) { $arHrefsNew[] = $value; } } $arProperties = array("getcontenttype", "resourcetype", "getetag"); if ($calendarData && count($arHrefsNew) > 0) { $arProperties[] = array("calendar-data", "urn:ietf:params:xml:ns:caldav"); } $arFilterNew = array(); if (array_key_exists("start", $arFilter)) { $arFilterNew = array("time-range" => array("start" => ConvertDateTime($arFilter["start"], "YYYYMMDD\\THHMISS\\Z"))); } if (count($arHrefsNew) > 0) { $xmlDoc = $this->Report($path, $arProperties, $arFilterNew, $arHrefsNew, 1); } else { $xmlDoc = $this->Propfind($path, $arProperties, $arFilterNew, 1); } $this->Disconnect(); if (is_null($xmlDoc)) { return null; } $arItems = array(); $arResponse = $xmlDoc->GetPath("/*/response"); foreach ($arResponse as $response) { $arHref = $response->GetPath("/response/href"); if (count($arHref) > 0) { $arItem = array("href" => urldecode($arHref[0]->GetContent())); $arProps = $response->GetPath("/response/propstat/prop/*"); foreach ($arProps as $prop) { $s = $prop->GetContent(); if (is_string($s) || is_numeric($s)) { $arItem[$prop->GetTag()] = $this->Encode($s); } } if ($calendarData) { $arCalendarData = $response->GetPath("/response/propstat/prop/calendar-data"); if (count($arCalendarData) > 0) { $cal = new CDavICalendar($this->Encode($arCalendarData[0]->GetContent())); $arEvents = $cal->GetComponents('VTIMEZONE', false); if (count($arEvents) > 0) { $arItem["calendar-data"] = $this->ConvertICalToArray($arEvents[0], $cal); } } } $arItems[] = $arItem; } } return $arItems; }