function Delete($arParams) { global $DB, $USER; $iblockId = $arParams['iblockId']; $ownerType = $arParams['ownerType']; $ownerId = $arParams['ownerId']; $ID = $arParams['id']; $userId = $arParams['userId']; if ($USER) { $ownerName = $USER->GetFullName(); } else { $rs = CUser::GetByID($userId); if ($arUser = $rs->Fetch()) { $name = trim($arUser['NAME'] . ' ' . $arUser['LAST_NAME']); } } $pathToUserCalendar = $arParams['pathToUserCalendar']; $arFilter = array("ID" => $ID, "IBLOCK_ID" => $iblockId); if ($arParams['bCheckPermissions'] !== false) { $arFilter[$ownerType == 'USER' ? "CREATED_BY" : "SOCNET_GROUP_ID"] = $ownerId; } $rsElement = CIBlockElement::GetList(array(), $arFilter, false, false, array("ID", "XML_ID", "IBLOCK_ID", "PROPERTY_PRIVATE", "PROPERTY_ACCESSIBILITY", "PROPERTY_IMPORTANCE", "PROPERTY_PARENT", "PROPERTY_LOCATION", "NAME", "DETAIL_TEXT", "IBLOCK_SECTION_ID", "ACTIVE_FROM", "ACTIVE_TO", "CREATED_BY", "PROPERTY_BXDAVEX_LABEL", "PROPERTY_BXDAVCD_LABEL")); if ($arElement = $rsElement->Fetch()) { $DB->StartTransaction(); // PROPERTY_PARENT_VALUE - id of parent iblock element in meeting if (strlen($arElement["PROPERTY_PARENT_VALUE"]) > 0 && $arParams['bJustDel'] !== true) { if ($ownerType == 'USER') { $rsHost = CIBlockElement::GetList(array(), array("=ID" => $arElement["PROPERTY_PARENT_VALUE"], "CREATED_BY" => $arElement['CREATED_BY']), false, false, array("ID", "IBLOCK_ID")); // Owner delete mirror of the original event in the personal calendar if ($arHost = $rsHost->Fetch()) { CECEvent::Delete(array('bCheckPermissions' => false, 'id' => intVal($arHost['ID']), 'iblockId' => intVal($arHost['IBLOCK_ID']), 'ownerType' => '', 'ownerId' => 0, 'userId' => $userId, 'pathToUserCalendar' => $arParams['pathToUserCalendar'], 'pathToGroupCalendar' => $arParams['pathToGroupCalendar'], 'userIblockId' => $arParams['userIblockId'], 'RMiblockId' => $arParams['RMiblockId'], 'allowResMeeting' => $arParams['allowResMeeting'], 'VMiblockId' => $arParams['VMiblockId'], 'allowVideoMeeting' => $arParams['allowVideoMeeting'])); $this->ClearCache($this->cachePath . 'events/' . $arHost['IBLOCK_ID'] . '/'); return true; } } // If no exchange CIBlockElement::SetPropertyValues($arElement["ID"], $arElement["IBLOCK_ID"], CEventCalendar::GetConfirmedID($iblockId, "N"), "CONFIRMED"); } else { if ($arParams['bSyncDAV'] !== false) { // Exchange if (CEventCalendar::IsExchangeEnabled() && $ownerType == 'USER' && strlen($arElement['PROPERTY_BXDAVEX_LABEL_VALUE']) > 0) { $eventXmlId = $arElement['XML_ID']; $exchRes = CDavExchangeCalendar::DoDeleteItem($ownerId, $eventXmlId); if ($exchRes !== true) { return CEventCalendar::CollectExchangeErros($exchRes); } } if (CEventCalendar::IsCalDAVEnabled() && $ownerType == 'USER' && strlen($arElement['PROPERTY_BXDAVCD_LABEL_VALUE']) > 0) { $connectionId = CECCalendar::GetCalDAVConnectionId($iblockId, $arElement['IBLOCK_SECTION_ID']); $calendarCalDAVXmlId = CECCalendar::GetCalDAVXmlId($iblockId, $arElement['IBLOCK_SECTION_ID']); $DAVRes = CDavGroupdavClientCalendar::DoDeleteItem($connectionId, $calendarCalDAVXmlId, $arElement['XML_ID']); if ($DAVRes !== true) { return CEventCalendar::CollectCalDAVErros($DAVRes); } } } if (strlen($arElement["PROPERTY_LOCATION_VALUE"]) > 0) { $loc = CEventCalendar::ParseLocation($arElement["PROPERTY_LOCATION_VALUE"]); if ($loc['mrid'] == $arParams['VMiblockId'] && $loc['mrevid'] > 0) { CEventCalendar::ReleaseVR(array('mrevid' => $loc['mrevid'], 'mrid' => $loc['mrid'], 'VMiblockId' => $arParams['VMiblockId'], 'allowVideoMeeting' => $arParams['allowVideoMeeting'])); } elseif ($loc['mrid'] > 0 && $loc['mrevid'] > 0) { CEventCalendar::ReleaseMR(array('mrevid' => $loc['mrevid'], 'mrid' => $loc['mrid'], 'RMiblockId' => $arParams['RMiblockId'], 'allowResMeeting' => $arParams['allowResMeeting'])); } } $arGuests = CECEvent::GetGuests($arParams['userIblockId'], $ID); $obElement = new CIBlockElement(); foreach ($arGuests as $guest_id => $arCalendarEvent) { $res = CECEvent::Delete(array('id' => $arCalendarEvent["ID"], 'iblockId' => $arParams['userIblockId'], 'ownerType' => "USER", 'ownerId' => $guest_id, 'userId' => $userId, 'bJustDel' => true)); if ($userId == $guest_id) { continue; } if ($arCalendarEvent["PROPERTY_VALUES"]["CONFIRMED"] != "N") { // Send message CEventCalendar::SendInvitationMessage(array('type' => "cancel", 'email' => $arCalendarEvent["CREATED_BY"]["EMAIL"], 'name' => $arCalendarEvent['NAME'], "from" => $arCalendarEvent["ACTIVE_FROM"], "to" => $arCalendarEvent["ACTIVE_TO"], "desc" => $arCalendarEvent['DETAIL_TEXT'], "pathToUserCalendar" => $pathToUserCalendar, "guestId" => $guest_id, "guestName" => $arCalendarEvent["CREATED_BY"]["FULL_NAME"], "userId" => $userId, "ownerName" => $ownerName)); } } if ($ownerType != 'USER') { CEventCalendar::ClearCache('event_calendar/events/' . $arParams['userIblockId'] . '/'); } // Deleting if (!CIBlockElement::Delete($ID)) { $DB->Rollback(); return '[ECD1]' . GetMessage('EC_EVENT_ERROR_DEL'); } } // log changes for socnet /* if($this->bSocNetLog && $ownerType && !$arElement["PROPERTY_PRIVATE_VALUE"] && !$arParams['dontLogEvent']) { CEventCalendar::SocNetLog( array( 'target' => 'delete_event', 'id' => $ID, 'name' => $arElement['NAME'], 'desc' => $arElement['DETAIL_TEXT'], 'from' => $arElement['ACTIVE_FROM'], 'to' => $arElement['ACTIVE_TO'], 'calendarId' => $arElement['IBLOCK_SECTION_ID'], 'accessibility' => $arElement["PROPERTY_ACCESSIBILITY_VALUE"], 'importance' => $arElement["PROPERTY_IMPORTANCE_VALUE"], 'pathToGroupCalendar' => $arParams["pathToGroupCalendar"], 'pathToUserCalendar' => $arParams["pathToUserCalendar"], 'iblockId' => $iblockId, 'ownerType' => $ownerType, 'ownerId' => $ownerId ) ); }*/ $DB->Commit(); } else { return '[ECD2]' . GetMessage('EC_EVENT_NOT_FOUND'); } return true; }
function UpdateListItems($listName, $updates) { global $USER; $arStatusValues = array_flip($this->arStatusValues); $arPriorityValues = array_flip($this->arPriorityValues); $arWeekDays = array_flip($this->arWeekDays); if (!($listName_original = CIntranetUtils::checkGUID($listName))) { return new CSoapFault('Data error', 'Wrong GUID - ' . $listName); } $obResponse = new CXMLCreator('Results'); $listName = ToUpper(CIntranetUtils::makeGUID($listName_original)); $obRes = CIBlockSection::GetList(array('SORT' => 'ASC'), array('XML_ID' => $listName_original)); if (!($arSection = $obRes->Fetch())) { return new CSoapFault('List not found', 'List with ' . $listName . ' GUID is not found'); } $bGroup = $arSection['SOCNET_GROUP_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'); } } } $obCalendar = new CEventCalendar(); $obCalendar->Init(array('ownerType' => $bGroup ? 'GROUP' : 'USER', 'ownerId' => $bGroup ? $arSection['SOCNET_GROUP_ID'] : (is_object($USER) && $USER->GetID() ? $USER->GetID() : false), 'bOwner' => true, 'iblockId' => $arSection['IBLOCK_ID'], 'bCache' => false)); // dirty hack $arPermissions = $obCalendar->GetPermissions(array('setProperties' => true)); $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(); 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')); if (CECEvent::Delete(array('id' => $arData['ID'], 'ownerType' => $bGroup ? 'GROUP' : 'USER', 'ownerId' => $bGroup ? $arSection['SOCNET_GROUP_ID'] : (is_object($USER) && $USER->GetID() ? $USER->GetID() : false), 'bOwner' => true, 'iblockId' => $arSection['IBLOCK_ID'], 'RMiblockId' => $this->__getRMIblockID(), 'allowResMeeting' => true))) { CEventCalendar::ClearCache('/event_calendar/events/' . $arSection['IBLOCK_ID'] . '/'); $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(" ", " "), "", $arData['Description']); $arData['Description'] = preg_replace("/<![^>]*>/", '', $arData['Description']); //$arData['Description'] = strip_tags($arData['Description']); $arData['Description'] = trim($arData['Description']); $arData['Location'] = trim($arData['Location']); $arData['EventDate'] = $this->__makeTS($arData['EventDate']); $arData['EndDate'] = $this->__makeTS($arData['EndDate']) + ($arData['fAllDayEvent'] ? -86340 : 0); $TZBias = intval(date('Z', $arData['EventDate'])); $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']); 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['RecurrenceData'] = array(); switch ($obNode->name) { case 'daily': // hack. we have no "work days" daily recurence if ($obNode->getAttribute('weekday') == 'TRUE') { $arData['RecurrenceData']['PERIOD_TYPE'] = 'WEEKLY'; $arData['RecurrenceData']['PERIOD_ADDITIONAL'] = '0,1,2,3,4'; $arData['RecurrenceData']['PERIOD_COUNT'] = 1; } else { $arData['RecurrenceData']['PERIOD_TYPE'] = 'DAILY'; $arData['RecurrenceData']['PERIOD_COUNT'] = $obNode->getAttribute('dayFrequency'); } $time_end = strtotime(date(date('Y-m-d', $arData['EventDate']) . ' H:i:s', $arData['EndDate'])); $arData['RecurrenceData']['EVENT_LENGTH'] = $time_end - $arData['EventDate']; break; case 'weekly': $arData['RecurrenceData']['PERIOD_TYPE'] = 'WEEKLY'; $arData['RecurrenceData']['PERIOD_ADDITIONAL'] = ''; foreach ($arWeekDays as $day => $value) { if ($obNode->getAttribute($day)) { $arData['RecurrenceData']['PERIOD_ADDITIONAL'] .= ($arData['RecurrenceData']['PERIOD_ADDITIONAL'] == '' ? '' : ',') . $value; } } $arData['RecurrenceData']['PERIOD_COUNT'] = $obNode->getAttribute('weekFrequency'); $time_end = strtotime(date(date('Y-m-d', $arData['EventDate']) . ' H:i:s', $arData['EndDate'])); $arData['RecurrenceData']['EVENT_LENGTH'] = $time_end - $arData['EventDate']; break; case 'monthly': $arData['RecurrenceData']['PERIOD_TYPE'] = 'MONTHLY'; $arData['RecurrenceData']['PERIOD_COUNT'] = $obNode->getAttribute('monthFrequency'); $time_end = strtotime(date(date('Y-m', $arData['EventDate']) . '-d H:i:s', $arData['EndDate'])); $arData['RecurrenceData']['EVENT_LENGTH'] = $time_end - $arData['EventDate']; break; case 'yearly': $arData['RecurrenceData']['PERIOD_TYPE'] = 'YEARLY'; $arData['RecurrenceData']['PERIOD_COUNT'] = $obNode->getAttribute('yearFrequency'); $time_end = strtotime(date(date('Y', $arData['EventDate']) . '-m-d H:i:s', $arData['EndDate'])); $arData['RecurrenceData']['EVENT_LENGTH'] = $time_end - $arData['EventDate']; break; } $obWhile = $obRule->children[2]; if ($obWhile->name == 'repeatForever') { $arData['EndDate'] = MakeTimeStamp(''); } elseif ($obWhile->name == 'windowEnd') { $arData['EndDate'] = $this->__makeTS($obWhile->textContent()); } } $TZBias = $arData['fAllDayEvent'] ? 0 : $TZBias; $arData['EventDate'] += $TZBias; $arData['EndDate'] += $TZBias; $arRes = array('iblockId' => $obCalendar->iblockId, 'ownerType' => $obCalendar->ownerType, 'ownerId' => $obCalendar->ownerId, 'RMiblockId' => $this->__getRMIblockID(), 'allowResMeeting' => true, 'bNew' => $arData['_command'] == 'New', 'fullUrl' => $obCalendar->fullUrl, 'userId' => $obCalendar->userId, 'pathToUserCalendar' => $obCalendar->pathToUserCalendar, 'pathToGroupCalendar' => $obCalendar->pathToGroupCalendar, 'userIblockId' => $obCalendar->userIblockId, 'calendarId' => $arSection['ID'], 'sectionId' => $arSection['IBLOCK_SECTION_ID'], 'dateFrom' => ConvertTimeStamp($arData['EventDate'], 'FULL'), 'dateTo' => ConvertTimeStamp($arData['EndDate'], 'FULL'), 'name' => $arData['Title'], 'desc' => $arData['Description'], 'prop' => array('ACCESSIBILITY' => $arStatusValues[$arData['MetaInfo_BusyStatus']], 'IMPORTANCE' => $arPriorityValues[$arData['MetaInfo_Priority']]), 'notDisplayCalendar' => true, 'location' => array('new' => CEventCalendar::ParseLocation($arData['Location']))); if ($arData['fRecurrence']) { $arRes['prop']['PERIOD_TYPE'] = $arData['RecurrenceData']['PERIOD_TYPE']; $arRes['prop']['PERIOD_COUNT'] = $arData['RecurrenceData']['PERIOD_COUNT']; $arRes['prop']['EVENT_LENGTH'] = $arData['RecurrenceData']['EVENT_LENGTH']; $arRes['prop']['PERIOD_ADDITIONAL'] = $arData['RecurrenceData']['PERIOD_ADDITIONAL']; } if ($arData['_command'] == 'New') { $arRes['bNew'] = true; } else { $arRes['id'] = $arData['ID']; } if (!$arRes['bNew']) { if ($arOldEvent = $obCalendar->GetEvents(array('ownerType' => 'USER', 'ownerId' => $arSection['CREATED_BY'], 'bOwner' => true, 'iblockId' => $arSection['IBLOCK_ID'], 'sectionId' => $arSection['ID'], 'eventId' => $arRes['id'], 'arCalendarIds' => array($arSection['ID']), 'forExport' => true))) { $arOldEvent = $arOldEvent[0]; $arRes['prop']['VERSION'] = $arOldEvent['VERSION']; if ($arOldEvent['LOCATION']) { } $arRes['location']['old'] = CEventCalendar::ParseLocation($arOldEvent['LOCATION']); if ($arRes['location']['old']['mrid']) { $arRes['location']['new'] = 'ECMR_' . $arRes['location']['old']['mrid']; $arRes['prop']['VERSION']++; } $bMaster = true; if (is_array($arOldEvent['GUESTS']) && count($arOldEvent['GUESTS']) > 0) { $arRes['GUESTS'] = array(); foreach ($arOldEvent['GUESTS'] as $arGuest) { $arRes['GUESTS'][] = $arGuest['id']; } } if (is_array($arOldEvent['HOST'])) { $bMaster = false; $arRes['prop']['PARENT'] = $arOldEvent['HOST']['parentId']; } if (!$bMaster) { $arRes['name'] = $arOldEvent['NAME']; $arRes['desc'] = $arOldEvent['DETAIL_TEXT']; $arRes['dateFrom'] = $arOldEvent['DATE_FROM']; $arRes['dateTo'] = $arOldEvent['DATE_TO']; if (is_array($arOldEvent['PERIOD'])) { $arRes['prop']['PERIOD_TYPE'] = $arOldEvent['PERIOD']['TYPE']; $arRes['prop']['PERIOD_COUNT'] = $arOldEvent['PERIOD']['COUNT']; $arRes['prop']['EVENT_LENGTH'] = $arOldEvent['PERIOD']['LENGTH']; $arRes['prop']['PERIOD_ADDITIONAL'] = $arOldEvent['PERIOD']['DAYS']; } else { unset($arRes['prop']['PERIOD_TYPE']); unset($arRes['prop']['PERIOD_COUNT']); unset($arRes['prop']['EVENT_LENGTH']); unset($arRes['prop']['PERIOD_ADDITIONAL']); } } else { if (is_array($arOldEvent['PERIOD']) && !$arData['RecurrenceData'] && $arData['EventType'] == 1) { $arRes['dateFrom'] = $arOldEvent['DATE_FROM']; $arRes['dateTo'] = $arOldEvent['DATE_TO']; $arRes['prop']['PERIOD_TYPE'] = $arOldEvent['PERIOD']['TYPE']; $arRes['prop']['PERIOD_COUNT'] = $arOldEvent['PERIOD']['COUNT']; $arRes['prop']['EVENT_LENGTH'] = $arOldEvent['PERIOD']['LENGTH']; $arRes['prop']['PERIOD_ADDITIONAL'] = $arOldEvent['PERIOD']['DAYS']; } } } else { return new CSoapFault('Event not found', 'Event ' . $arRes['id'] . ' not found on server'); } } if (is_array($arRes['location']['old'])) { $arRes['location']['old'] = $arRes['location']['old']['str']; } if (is_array($arRes['location']['new'])) { $arRes['location']['new'] = $arRes['location']['new']['str']; } if ($EventID = $obCalendar->SaveEvent($arRes)) { CEventCalendar::ClearCache('/event_calendar/events/' . $arRes['iblockId'] . '/'); // 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); } } } $arMethodParams = array('ownerType' => 'USER', 'ownerId' => is_object($USER) && $USER->GetID() ? $USER->GetID() : false, 'iblockId' => $arSection['IBLOCK_ID'], 'sectionId' => $arSection['ID'], 'arCalendarIds' => array($arSection['ID']), 'forExport' => true, 'bLoadAll' => false, 'timestampFrom' => $dateStart); $arCalendarEntries = $obCalendar->GetEvents($arMethodParams); foreach ($arCalendarEntries as $arEntry) { if ($arResponseRows[$arEntry['ID']]) { $obRow = $this->__getRow($arEntry, $listName, $last_change = 0); $obRow->setAttribute('xmlns:z', "#RowsetSchema"); if ($arReplicationIDs[$arEntry['ID']]) { $obRow->setAttribute('MetaInfo_ReplicationID', $arReplicationIDs[$arEntry['ID']]); } $arResponseRows[$arEntry['ID']]->addChild($obRow); } $obResponse->addChild($arResponseRows[$arEntry['ID']]); } return array('UpdateListItemsResult' => $obResponse); }