示例#1
0
 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;
 }