• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/sharepoint.php
  • Класс: CAllIntranetSharepoint
  • Вызов: CAllIntranetSharepoint::UpdateItems
static function UpdateItems($arRows)
{
	$row = current($arRows);

	$IBLOCK_ID = $row['IBLOCK_ID'];
	$PRIORITY = $row['PRIORITY'];

	$dbRes = CIntranetSharepoint::GetByID($IBLOCK_ID, true);
	if ($arService = $dbRes->Fetch())
	{
		if (!self::CheckService($arService, 'UpdateListItems'))
			return false;

		$arIDs = array();
		$arSelect = array('ID', 'XML_ID');
		foreach ($arRows as $row) $arIDs[] = $row['ELEMENT_ID'];
		foreach ($arService['FIELDS'] as $fld) $arSelect[] = $fld['FIELD_ID'];

		$dbRes = CIBlockElement::GetList(array(), array(
			'IBLOCK_ID' => $IBLOCK_ID,
			'ID' => $arIDs,
		), false, false, $arSelect);

		$arChanges = array();
		$arChangesIDs = array();
		while ($obItem = $dbRes->GetNextElement())
		{
			$arItem = $obItem->GetFields();
			$arProp = $obItem->GetProperties();

			$arChange = array();

			foreach ($arService['FIELDS'] as $fld)
			{
				if (mb_substr($fld['FIELD_ID'], 0, 9) === 'PROPERTY_')
					$fld['FIELD_ID'].= '_VALUE';

				if ($val = self::_UpdateGetValueByType($arItem[$fld['FIELD_ID']], $fld['SP_FIELD_TYPE']))
				{
					$arChange[$fld['SP_FIELD']] = $val;
				}
			}

			if ($arItem['XML_ID'] && ($arItem['XML_ID'] != $arItem['ID']))
			{
				$arChangesIDs[] = $arItem['XML_ID'];

				$arChange['UniqueId'] = $arItem['XML_ID'];
				$arChange['ID'] = intval($arItem['XML_ID']);
			}

			foreach ($arProp as $prop)
			{
				if ($prop['CODE'] == 'OWSHIDDENVERSION')
				{
					$arChange['owshiddenversion'] = $prop['VALUE'];
					$arChange['Metainfo_vti_versionhistory'] = md5($prop['VALUE'].'|'.$arItem['XML_ID']).':'.$prop['VALUE'];
				}
			}

			$arItemsMap = array();
			if (!$arChange['UniqueId'])
			{
				$arChange['ReplicationID'] = CIntranetUtils::makeGUID(md5($arItem['ID']));
				$arChanges[$arChange['ReplicationID']] = $arChange;

				$arItemsMap[$arChange['ReplicationID']] = $arItem['ID'];
			}
			else
			{
				$arChanges[$arChange['ID']] = $arChange;
				$arItemsMap[$arChange['ID']] = $arItem['ID'];
			}
		}

		$handler = new $arService['HANDLER_CLASS']($arService['SP_URL']);
		$RESULT = $handler->GetByID(CIntranetUtils::makeGUID($arService['SP_LIST_ID']), $arChangesIDs);

		if (count($RESULT) > 0)
		{
			foreach ($RESULT as $sp_row)
			{
				foreach ($sp_row  as $fld=>$val)
				{
					if (!isset($arChanges[$sp_row['ID']][$fld]))
					{
						$arChanges[$sp_row['ID']][$fld] = $val;
					}
				}
			}
		}

		$arSecondQuery = array();
		$arQueue = array();

		CIntranetSharepoint::$bUpdateInProgress = true;
		if ($RESULT = $handler->UpdateListItems(CIntranetUtils::makeGUID($arService['SP_LIST_ID']), $arChanges))
		{
			foreach ($RESULT as $res)
			{
				$ID = 0;
				$arUpdateFields = array();
				$arUpdateProps = array();

				// version conflict
				if ($res['ErrorCode'] == '0x81020015')
				{
					if ($PRIORITY == 'B') // 'B'itrix - our row is preferrable
					{
						$new_version = $res['Row']['owshiddenversion'];
						$arChange = $arChanges[$res['Row']['ID']];
						$arChange['owshiddenversion'] = $new_version;
						$arSecondQuery[] = $arChange;

						$arUpdateProps['OWSHIDDENVERSION'] = $new_version;
						$ID = $arItemsMap[$res['Row']['ID']];
					}
					else // 'S'harepoint - remote row is preferrable
					{
						self::_Sync($arService, $res['Row'], $arQueue);
					}
				}

				if ($res['Row']['MetaInfo_ReplicationID'])
				{
					$arUpdateFields['XML_ID'] = $res['Row']['UniqueId'];
					$arUpdateProps['OWSHIDDENVERSION'] = $res['Row']['owshiddenversion'];

					$ID = $arItemsMap[$res['Row']['MetaInfo_ReplicationID']];
				}

				if ($ID > 0)
				{
					if (count($arUpdateFields) > 0)
					{
						$ob = new CIBlockElement();
						$ob->Update($ID, $arUpdateFields);
					}
					if (count($arUpdateProps) > 0)
					{
						CIBlockElement::SetPropertyValuesEx($ID, false, $arUpdateProps);
					}
				}
			}

			if (count($arSecondQuery))
			{
				$handler->UpdateListItems(CIntranetUtils::makeGUID($arService['SP_LIST_ID']), $arSecondQuery);
			}
		}
		CIntranetSharepoint::$bUpdateInProgress = false;

		return true;
	}

	return false;
}