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