- Модуль: 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);
}