- Модуль: intranet
- Путь к файлу: ~/bitrix/modules/intranet/classes/general/ws_contacts.php
- Класс: CIntranetContactsWS
- Вызов: CIntranetContactsWS::GetListItemChangesSinceToken
function GetListItemChangesSinceToken($listName, $viewFields = '', $query = '', $rowLimit = 0, $changeToken = '')
{
global $USER;
if (!$listName_original = CIntranetUtils::checkGUID($listName))
{
return new CSoapFault('Data error', 'Wrong GUID - '.$listName);
}
if (
!$USER->IsAdmin()
&& (
!defined("IS_EXTRANET")
|| IS_EXTRANET != "Y"
)
) // intranet
{
$rsUsers = CUser::GetList(
"id", "asc",
array(
"ID" => $USER->GetID()
),
array("SELECT" => array("UF_DEPARTMENT"))
);
$bUserIntranet = false;
if ($arUser = $rsUsers->Fetch())
{
if (
!empty($arUser["UF_DEPARTMENT"])
&& !empty($arUser["UF_DEPARTMENT"][0])
&& intval($arUser["UF_DEPARTMENT"][0]) > 0
)
{
$bUserIntranet = true;
}
}
if (!$bUserIntranet)
{
return new CSoapFault('Data error', 'User has no permissions to read intranet contacts');
}
}
$listName = ToUpper(CIntranetUtils::makeGUID($listName_original));
$arFilter = array('ACTIVE' => 'Y');
$page = 1;
$bUpdateFields = false;
$tsLastFieldsChange = COption::GetOptionString('intranet', 'ws_contacts_last_fields_change', false);
$this->bGetImages = COption::GetOptionString('intranet', 'ws_contacts_get_images', 'Y') == 'Y';
if ($changeToken <> '')
{
if ($pos = mb_strpos($changeToken, ';'))
{
list($newChangeToken, $page, $last_change) = explode(';', $changeToken);
$page++;
$changeToken = $newChangeToken;
}
$arFilter['TIMESTAMP_X_1'] = ConvertTimeStamp($changeToken, 'FULL');
if (!$arFilter['TIMESTAMP_X_1'])
{
return new CSoapFault(
'Params error',
'Wrong changeToken: '.$changeToken
);
}
if ($tsLastFieldsChange !== false && $tsLastFieldsChange > $changeToken)
{
$bUpdateFields = true;
}
}
if (
!CModule::IncludeModule('extranet')
|| (
defined("IS_EXTRANET")
&& IS_EXTRANET == "Y"
&& defined("IS_EMPLOYEES")
&& IS_EMPLOYEES == "Y"
)
|| (
!defined("IS_EXTRANET")
|| IS_EXTRANET != "Y"
)
)
{
$arFilter["!UF_DEPARTMENT"] = false;
}
else
{
$arFilter["UF_DEPARTMENT"] = false;
}
if (
defined("IS_EXTRANET")
&& IS_EXTRANET == "Y"
&& CModule::IncludeModule('extranet')
&& !CExtranet::IsExtranetAdmin()
)
{
$currentUserId = $USER->getId();
$arIDs = array_merge(CExtranet::GetMyGroupsUsers(CExtranet::GetExtranetSiteID()), CExtranet::GetPublicUsers());
$arIDs = array_filter($arIDs, function ($var) use ($currentUserId) { return($var != $currentUserId); });
$arFilter['ID'] = implode('|', array_unique($arIDs));
}
// it's needed to check is current user an intranet user if he requested intranet script
$arListParams = array(
"SELECT" => array("UF_DEPARTMENT")
);
if ($rowLimit > 0)
$arListParams["NAV_PARAMS"] = array(
"nPageSize" => $rowLimit,
"bShowAll" => false,
"iNumPage" => $page
);
$obUsers = CUser::GetList(
'id', 'asc',
$arFilter,
$arListParams
);
if (!isset($last_change))
$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 || $bUpdateFields) && $page <= 1)
{
$arGetListResult = $this->GetList($listName);
$obChanges->addChild($arGetListResult['GetListResult']);
}
//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'));
$counter = 0;
if (
CModule::IncludeModule('extranet')
&& defined("IS_EXTRANET")
&& IS_EXTRANET == "Y"
)
{
$arUsersInMyGroupsID = CExtranet::GetMyGroupsUsers(CExtranet::GetExtranetSiteID());
$arPublicUsersID = CExtranet::GetPublicUsers();
}
while ($arUser = $obUsers->Fetch())
{
if (
is_array($arUser['UF_DEPARTMENT'])
&& count($arUser['UF_DEPARTMENT']) > 0
)
{
if ($this->arDepartmentsCache[$arUser['UF_DEPARTMENT'][0]])
{
$arUser['WORK_COMPANY'] = $this->arDepartmentsTopCache[$arUser['UF_DEPARTMENT'][0]];
$arUser['UF_DEPARTMENT'] = $this->arDepartmentsCache[$arUser['UF_DEPARTMENT'][0]];
}
else
{
$dbRes = CIBlockSection::GetByID($arUser['UF_DEPARTMENT'][0]);
if ($arRes = $dbRes->Fetch())
{
if ((!defined("IS_EXTRANET") || IS_EXTRANET != "Y") || (defined("IS_EMPLOYEES") && IS_EMPLOYEES == "Y"))
{
$arUser['DEPARTMENT'] = $this->arDepartmentsCache[$arUser['UF_DEPARTMENT'][0]] = $arRes['NAME'];
}
if ($top_section = CIntranetUtils::GetIBlockTopSection($arUser['UF_DEPARTMENT']))
{
$dbRes = CIBlockSection::GetByID($top_section);
if ($arRes = $dbRes->Fetch())
{
$arUser['WORK_COMPANY'] = $this->arDepartmentsTopCache[$arUser['UF_DEPARTMENT'][0]] = $arRes['NAME'];
}
}
if ((!defined("IS_EXTRANET") || IS_EXTRANET != "Y") || (defined("IS_EMPLOYEES") && IS_EMPLOYEES == "Y"))
$arUser['UF_DEPARTMENT'] = $arUser['DEPARTMENT'];
}
}
}
$counter++;
$obData->addChild($this->__getRow($arUser, $listName, $last_change));
}
//$last_change = time();
$obData->setAttribute('ItemCount', $counter);
$data->setAttribute('xmlns:rs', 'urn:schemas-microsoft-com:rowset');
$data->setAttribute('xmlns:z', '#RowsetSchema');
if ($bUpdateFields && $tsLastFieldsChange)
{
$last_change = $tsLastFieldsChange;
}
if ($last_change > 0)
{
if ($rowLimit && $obUsers->NavPageCount > 1 && $obUsers->NavPageCount > $page)
{
$last_change = intval($changeToken).';'.$page.';'.$last_change;
$obChanges->setAttribute('MoreChanges', 'TRUE');
}
else
{
$last_change += 1;
}
$obChanges->setAttribute('LastChangeToken', $last_change);
}
return array('GetListItemChangesSinceTokenResult' => $data);
}