Beispiel #1
0
 function UpdateListItems($listName, $updates)
 {
     global $USER;
     $arStatusValues = array_flip($this->arStatusValues);
     $arPriorityValues = array_flip($this->arPriorityValues);
     if (!($listName_original = CIntranetUtils::checkGUID($listName))) {
         return new CSoapFault('Data error', 'Wrong GUID - ' . $listName);
     }
     $obResponse = new CXMLCreator('Results');
     $listName = ToUpper(CIntranetUtils::makeGUID($listName_original));
     $arSections = CCalendarSect::GetList(array('arFilter' => array('XML_ID' => $listName_original)));
     if (!$arSections || !is_array($arSections[0])) {
         return new CSoapFault('List not found', 'List with ' . $listName . ' GUID not found');
     }
     $arSection = $arSections[0];
     $bGroup = $arSection['CAL_TYPE'] == 'group';
     $calType = $arSection['CAL_TYPE'];
     $ownerId = $arSection['OWNER_ID'];
     if ($bGroup) {
         CModule::IncludeModule('socialnetwork');
         $arGroupTmp = CSocNetGroup::GetByID($arSection['SOCNET_GROUP_ID']);
         if ($arGroupTmp["CLOSED"] == "Y") {
             if (COption::GetOptionString("socialnetwork", "work_with_closed_groups", "N") != "Y") {
                 return new CSoapFault('Cannot modify archive group calendar', 'Cannot modify archive group calendar');
             }
         }
     }
     $obBatch = $updates->children[0];
     $atrONERROR = $obBatch->getAttribute('OnError');
     $atrDATEINUTC = $obBatch->getAttribute('DateInUtc');
     $atrPROPERTIES = $obBatch->getAttribute('Properties');
     $arChanges = $obBatch->children;
     $arResultIDs = array();
     $dateStart = ConvertTimeStamp(strtotime('-1 hour'), 'FULL');
     $arResponseRows = array();
     $arReplicationIDs = array();
     $userId = is_object($USER) && $USER->GetID() ? $USER->GetID() : 1;
     foreach ($arChanges as $obMethod) {
         $arData = array('_command' => $obMethod->getAttribute('Cmd'));
         foreach ($obMethod->children as $obField) {
             $name = $obField->getAttribute('Name');
             if ($name == 'MetaInfo') {
                 $name .= '_' . $obField->getAttribute('Property');
             }
             $arData[$name] = $obField->content;
         }
         if ($arData['_command'] == 'Delete') {
             $obRes = new CXMLCreator('Result');
             $obRes->setAttribute('ID', $obMethod->getAttribute('ID') . ',' . $arData['_command']);
             $obRes->setAttribute('List', $listName);
             $obRes->addChild($obNode = new CXMLCreator('ErrorCode'));
             $res = CCalendar::DeleteEvent($arData['ID']);
             if ($res === true) {
                 $obNode->setData('0x00000000');
             } else {
                 $obNode->setData('0x81020014');
             }
             /*
             	0x00000000 - ok
             	0x81020015 - data conflict
             	0x81020014 - generic error such as invalid value for Field
             	0x81020016 - item does not exist
             */
             $obResponse->addChild($obRes);
         } elseif ($arData['_command'] == 'New' || $arData['_command'] == 'Update') {
             $q = ToLower($arData['Description']);
             if (($pos = strrpos($q, '</body>')) !== false) {
                 $arData['Description'] = substr($arData['Description'], 0, $pos);
             }
             if (($pos = strpos($q, '<body>')) !== false) {
                 $arData['Description'] = substr($arData['Description'], $pos + 6);
             }
             $arData['Description'] = str_replace('</DIV>', "\r\n</DIV>", $arData['Description']);
             $arData['Description'] = str_replace(array("&#10;", "&#13;"), "", $arData['Description']);
             $arData['Description'] = preg_replace("/<![^>]*>/", '', $arData['Description']);
             //$arData['Description'] = strip_tags($arData['Description']);
             $arData['Description'] = trim($arData['Description']);
             $arData['Location'] = trim($arData['Location']);
             if (isset($arData['EventDate'])) {
                 $fromTsUTC = $this->__makeTS($arData['EventDate']);
                 $toTsUTC = $this->__makeTS($arData['EndDate']) + ($arData['fAllDayEvent'] ? -86340 : 0);
                 $TZBias = intval(date('Z', $fromTsUTC));
             }
             $arData['EventType'] = intval($arData['EventType']);
             if ($arData['EventType'] == 2) {
                 $arData['EventType'] = 0;
             }
             if ($arData['EventType'] > 2) {
                 return new CSoapFault('Unsupported event type', 'Event type unsupported');
             }
             $arData['fRecurrence'] = intval($arData['fRecurrence']);
             $arData['RRULE'] = '';
             $id = $arData['_command'] == 'New' ? 0 : intVal($arData['ID']);
             if ($arData['RecurrenceData']) {
                 //$xmlstr = $arData['XMLTZone'];
                 //$arData['XMLTZone'] = new CDataXML();
                 //$arData['XMLTZone']->LoadString($xmlstr);
                 $xmlstr = $arData['RecurrenceData'];
                 $obRecurData = new CDataXML();
                 $obRecurData->LoadString($xmlstr);
                 /*
                 <recurrence>
                 		<rule>
                 			<firstDayOfWeek>mo</firstDayOfWeek>
                 			<repeat>
                 				<weekly mo='TRUE' tu='TRUE' th='TRUE' sa='TRUE' weekFrequency='1' />
                 			</repeat>
                 			<repeatForever>FALSE</repeatForever>
                 		</rule>
                 </recurrence>
                 <deleteExceptions>true</deleteExceptions>
                 */
                 $obRecurRule = $obRecurData->tree->children[0]->children[0];
                 $obRecurRepeat = $obRecurRule->children[1];
                 $obNode = $obRecurRepeat->children[0];
                 $arData['RRULE'] = array();
                 switch ($obNode->name) {
                     case 'daily':
                         // hack. we have no "work days" daily recurence
                         if ($obNode->getAttribute('weekday') == 'TRUE') {
                             $arData['RRULE']['FREQ'] = 'WEEKLY';
                             $arData['RRULE']['BYDAY'] = 'MO,TU,WE,TH,FR';
                             $arData['RRULE']['INTERVAL'] = 1;
                         } else {
                             $arData['RRULE']['FREQ'] = 'DAILY';
                             $arData['RRULE']['INTERVAL'] = $obNode->getAttribute('dayFrequency');
                         }
                         $time_end = strtotime(date(date('Y-m-d', $fromTsUTC) . ' H:i:s', $toTsUTC));
                         $arData['DT_LENGTH'] = $time_end - $fromTsUTC;
                         break;
                     case 'weekly':
                         $arData['RRULE']['FREQ'] = 'WEEKLY';
                         $arData['RRULE']['BYDAY'] = '';
                         $arWeekDays = array('mo', 'tu', 'we', 'th', 'fr', 'sa', 'su');
                         foreach ($arWeekDays as $day => $value) {
                             if ($obNode->getAttribute($value)) {
                                 $arData['RRULE']['BYDAY'][] = strtoupper($value);
                             }
                         }
                         $arData['RRULE']['BYDAY'] = implode(',', $arData['RRULE']['BYDAY']);
                         $arData['RRULE']['INTERVAL'] = $obNode->getAttribute('weekFrequency');
                         $time_end = strtotime(date(date('Y-m-d', $fromTsUTC) . ' H:i:s', $toTsUTC));
                         $arData['DT_LENGTH'] = $time_end - $fromTsUTC;
                         break;
                     case 'monthly':
                         $arData['RRULE']['FREQ'] = 'MONTHLY';
                         $arData['RRULE']['INTERVAL'] = $obNode->getAttribute('monthFrequency');
                         $time_end = strtotime(date(date('Y-m', $fromTsUTC) . '-d H:i:s', $toTsUTC));
                         $arData['DT_LENGTH'] = $time_end - $fromTsUTC;
                         break;
                     case 'yearly':
                         $arData['RRULE']['FREQ'] = 'YEARLY';
                         $arData['RRULE']['INTERVAL'] = $obNode->getAttribute('yearFrequency');
                         $time_end = strtotime(date(date('Y', $fromTsUTC) . '-m-d H:i:s', $toTsUTC));
                         $arData['DT_LENGTH'] = $time_end - $fromTsUTC;
                         break;
                 }
                 if ($arData['DT_LENGTH'] == 0 && isset($arData['RRULE']['FREQ'])) {
                     $arData['DT_LENGTH'] = 86400;
                 }
                 $obWhile = $obRecurRule->children[2];
                 if ($obWhile->name == 'repeatForever') {
                     $arData['RRULE']['UNTIL'] = MakeTimeStamp('');
                 } elseif ($obWhile->name == 'windowEnd') {
                     $toTsUTC = $this->__makeTS($obWhile->textContent());
                     $arData['RRULE']['UNTIL'] = ConvertTimeStamp($toTsUTC, 'FULL');
                 }
             } elseif ($arData['fRecurrence'] == -1 && $id > 0) {
                 $arData['RRULE'] = -1;
             }
             $skipTime = $arData['fAllDayEvent'] ? 'Y' : 'N';
             $fromTs = $fromTsUTC;
             $toTs = $toTsUTC;
             if (!$arData['fAllDayEvent']) {
                 $fromTs += CCalendar::GetCurrentOffsetUTC($userId);
                 $toTs += CCalendar::GetCurrentOffsetUTC($userId);
             }
             // fields
             $arFields = array("ID" => $id, 'CAL_TYPE' => $calType, 'OWNER_ID' => $ownerId, 'CREATED_BY' => $userId, 'DATE_FROM' => CCalendar::Date($fromTs, $skipTime == 'N'), 'DATE_TO' => CCalendar::Date($toTs, $skipTime == 'N'), 'DT_SKIP_TIME' => $skipTime, 'NAME' => $arData['Title'], 'DESCRIPTION' => CCalendar::ParseHTMLToBB($arData['Description']), 'SECTIONS' => array($arSection['ID']), 'ACCESSIBILITY' => $arStatusValues[$arData['MetaInfo_BusyStatus']], 'IMPORTANCE' => $arPriorityValues[$arData['MetaInfo_Priority']], 'RRULE' => $arData['RRULE'], 'LOCATION' => CCalendar::UnParseTextLocation($arData['Location']));
             if (isset($arData['DT_LENGTH']) && $arData['DT_LENGTH'] > 0) {
                 $arFields['DT_LENGTH'] = $arData['DT_LENGTH'];
             }
             $EventID = CCalendar::SaveEvent(array('arFields' => $arFields, 'fromWebservice' => true));
             if ($EventID) {
                 // dirty hack
                 $arReplicationIDs[$EventID] = $arData['MetaInfo_ReplicationID'];
                 $arResponseRows[$EventID] = new CXMLCreator('Result');
                 $arResponseRows[$EventID]->setAttribute('ID', $obMethod->getAttribute('ID') . ',' . $arData['_command']);
                 $arResponseRows[$EventID]->setAttribute('List', $listName);
                 $arResponseRows[$EventID]->addChild($obNode = new CXMLCreator('ErrorCode'));
                 $obNode->setData('0x00000000');
                 //$arResponseRows[$EventID]->setAttribute('Version', 3);
             }
         }
     }
     $userId = is_object($USER) && $USER->GetID() ? $USER->GetID() : 1;
     $fetchMeetings = CCalendar::GetMeetingSection($userId) == $arSection['ID'];
     $arEvents = CCalendarEvent::GetList(array('arFilter' => array('CAL_TYPE' => $calType, 'OWNER_ID' => $ownerId, 'SECTION' => $arSection['ID']), 'getUserfields' => false, 'parseRecursion' => false, 'fetchAttendees' => false, 'fetchMeetings' => $fetchMeetings, 'userId' => $userId));
     foreach ($arEvents as $key => $event) {
         if ($arResponseRows[$event['ID']]) {
             $obRow = $this->__getRow($event, $listName, $last_change = 0);
             $obRow->setAttribute('xmlns:z', "#RowsetSchema");
             if ($arReplicationIDs[$event['ID']]) {
                 $obRow->setAttribute('MetaInfo_ReplicationID', $arReplicationIDs[$event['ID']]);
             }
             $arResponseRows[$event['ID']]->addChild($obRow);
         }
         $obResponse->addChild($arResponseRows[$event['ID']]);
     }
     return array('UpdateListItemsResult' => $obResponse);
 }
Beispiel #2
0
 public static function GetEventFromToForUser($params, $userId)
 {
     $skipTime = $params['DT_SKIP_TIME'] !== 'N';
     $fromTs = CCalendar::Timestamp($params['DATE_FROM'], false, !$skipTime);
     $toTs = CCalendar::Timestamp($params['DATE_TO'], false, !$skipTime);
     if (!$skipTime) {
         $fromTs = $fromTs - (CCalendar::GetTimezoneOffset($params['TZ_FROM']) - CCalendar::GetCurrentOffsetUTC($userId));
         $toTs = $toTs - (CCalendar::GetTimezoneOffset($params['TZ_TO']) - CCalendar::GetCurrentOffsetUTC($userId));
     }
     $dateFrom = CCalendar::Date($fromTs, !$skipTime);
     $dateTo = CCalendar::Date($toTs, !$skipTime);
     return array("DATE_FROM" => $dateFrom, "DATE_TO" => $dateTo, "TS_FROM" => $fromTs, "TS_TO" => $toTs);
 }
Beispiel #3
0
}
$arParams['EVENT'] = CCalendarEvent::GetById($arParams['EVENT_ID']);
$arParams["DESTINATION"] = is_array($arParams["DESTINATION"]) && IsModuleInstalled("socialnetwork") ? $arParams["DESTINATION"] : array();
$arParams["DESTINATION"] = array_key_exists("VALUE", $arParams["DESTINATION"]) ? $arParams["DESTINATION"]["VALUE"] : $arParams["DESTINATION"];
if (is_array($arParams["DESTINATION"]['USERS'])) {
    $users = array();
    foreach ($arParams["DESTINATION"]['USERS'] as $key => $entry) {
        if ($entry['isExtranet'] == 'N') {
            $users[$key] = $entry;
        }
    }
    $arParams["DESTINATION"]['USERS'] = $users;
}
// Empty destination for new events
if (!$arParams['EVENT_ID']) {
    $arParams["DESTINATION"]["SELECTED"] = array();
}
$arResult['TIMEZONE_LIST'] = CCalendar::GetTimezoneList();
$userTimezoneOffsetUTC = CCalendar::GetCurrentOffsetUTC($arParams['CUR_USER']);
$arParams["USER_TIMEZONE_NAME"] = CCalendar::GetUserTimezoneName($arParams['CUR_USER']);
$arParams["USER_TIMEZONE_DEFAULT"] = '';
// We don't have default timezone for this offset for this user
// We will ask him but we should suggest some suitable for his offset
if (!$arParams["USER_TIMEZONE_NAME"]) {
    $arParams["USER_TIMEZONE_DEFAULT"] = CCalendar::GetGoodTimezoneForOffset($userTimezoneOffsetUTC);
}
$arParams["MEETING_ROOMS"] = CCalendar::GetMeetingRoomList();
if (count($arParams["MEETING_ROOMS"]) == 0) {
    $arParams["MEETING_ROOMS"] = false;
}
$this->IncludeComponentTemplate();