• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/ws_calendar.php
  • Класс: CIntranetCalendarWS
  • Вызов: CIntranetCalendarWS::GetListItemChangesSinceToken
function GetListItemChangesSinceToken($listName, $viewFields = '', $query = '', $rowLimit = 0, $changeToken = '')
{
	global $APPLICATION, $USER;

	if (!$listName_original = CIntranetUtils::checkGUID($listName))
	{
		return new CSoapFault('Data error', 'Wrong GUID - '.$listName);
	}

	$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');
	}

	$arMethodParams = array(
		'ownerType' => 'USER',
		//'ownerId' => (is_object($USER) && $USER->GetID()) ? $USER->GetID() : false,
		'ownerId' => $arSection['CREATED_BY'],
		'bOwner' => true,
		'iblockId' => $arSection['IBLOCK_ID'],
		'sectionId' => $arSection['ID'],
		'arCalendarIds' => array($arSection['ID']),
		'forExport' => true
	);

	if ($changeToken)
	{
		$arMethodParams['bLoadAll'] = false;
		$arMethodParams['timestampFrom'] = ConvertTimeStamp($changeToken, 'FULL');
		if (!$arMethodParams['timestampFrom'])
		{
			return new CSoapFault(
				'Params error',
				'Wrong changeToken: '.$changeToken
			);
		}
	}
	else
	{
		$arMethodParams['bLoadAll'] = true;
	}

	$obCalendar = new CEventCalendar();
	$obCalendar->Init(array(
		'ownerType' => $arMethodParams['ownerType'],
		'ownerId' => $arMethodParams['ownerId'],
		'bOwner' => true,
		'iblockId' => $arMethodParams['iblockId'],
		'bCache' => false,
		'userIblockId' => $arMethodParams['iblockId'],
	));

	// dirty hack
	$arPermissions = $obCalendar->GetPermissions(
		array(
			'setProperties' => true, 'ownerId' => $arSection['CREATED_BY']
		)
	);

	$obCalendar->arCalenderIndex[$arSection['ID']]['PRIVATE_STATUS'] = CECCalendar::GetPrivateStatus($arSection['IBLOCK_ID'], $arSection['ID'], 'USER');

	$arCalendarEntries = $obCalendar->GetEvents($arMethodParams);

	$last_change = 0;
	$data = new CXMLCreator('listitems');
	$data->setAttribute('MinTimeBetweenSyncs', 0);
	$data->setAttribute('RecommendedTimeBetweenSyncs', 180);
	$data->setAttribute('TimeStamp', $this->__makeDateTime());
	$data->setAttribute('EffectivePermMask', 'FullMask');

	$data->addChild($obChanges = new CXMLCreator('Changes'));

	if (!$changeToken && !defined('OLD_OUTLOOK_VERSION'))
	{
		$obChanges->addChild($this->__getFieldsDefinition());
	}

	//TODO: the next thing is to do something like this for all deleted events.
	//$obChanges->addChild($obId = new CXMLCreator('Id'));
	//$obId->setAttribute('ChangeType', 'Delete');
	//$obId->setData('702');
	//14

	$data->addChild($obData = new CXMLCreator('rs:data'));

	foreach ($arCalendarEntries as $key => $arRes)
	{
		if ($arRes['STATUS'] == 'Q')
			continue;

		$obData->addChild($this->__getRow($arRes, $listName, $last_change));
	}

	//$last_change = time();
	$obData->setAttribute('ItemCount', count($arCalendarEntries));

	$data->setAttribute('xmlns:rs', 'urn:schemas-microsoft-com:rowset');
	$data->setAttribute('xmlns:z', '#RowsetSchema');

	if ($last_change > 0)
		$obChanges->setAttribute('LastChangeToken', $last_change);


	return array('GetListItemChangesSinceTokenResult' => $data);
}