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