- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_product.php
- Класс: \CCrmProduct
- Вызов: CCrmProduct::Update
static function Update($ID, $arFields)
{
global $USER;
if (!Loader::includeModule('catalog'))
{
return false;
}
if (!self::CheckFields('UPDATE', $arFields, $ID))
{
return false;
}
$iblockElementUpdated = false;
$needUpdateIblockElement = false;
if(isset($arFields['NAME'])
|| isset($arFields['CODE'])
|| isset($arFields['SECTION_ID'])
|| isset($arFields['SORT'])
|| isset($arFields['ACTIVE'])
|| isset($arFields['DETAIL_PICTURE'])
|| isset($arFields['DESCRIPTION'])
|| isset($arFields['DESCRIPTION_TYPE'])
|| isset($arFields['PREVIEW_PICTURE'])
|| isset($arFields['PREVIEW_TEXT'])
|| isset($arFields['PREVIEW_TEXT_TYPE'])
|| isset($arFields['ORIGINATOR_ID'])
|| isset($arFields['ORIGIN_ID'])
|| isset($arFields['XML_ID'])
|| isset($arFields['PROPERTY_VALUES'])
|| isset($arFields['DATE_CREATE'])
|| array_key_exists('TIMESTAMP_X', $arFields) // May be false or null
|| isset($arFields['CREATED_BY'])
|| isset($arFields['MODIFIED_BY']))
{
$element = new CIBlockElement();
$obResult = $element->GetById($ID);
if($arElement = $obResult->Fetch())
{
unset($arElement['DATE_CREATE']);
unset($arElement['CREATED_BY']);
unset($arElement['MODIFIED_BY']);
unset($arElement['TIMESTAMP_X']);
if(isset($arFields['NAME']))
{
$arElement['NAME'] = $arFields['NAME'];
}
if(isset($arFields['CODE']))
{
$arElement['CODE'] = $arFields['CODE'];
}
if (isset($arElement['IN_SECTIONS']) && $arElement['IN_SECTIONS'] !== 'N')
{
$sections = [];
$res = CIBlockElement::GetElementGroups($ID, true, ['ID']);
while($row = $res->Fetch())
{
$sections[] = (int)$row['ID'];
}
if (count($sections) > 0)
{
$arElement['IBLOCK_SECTION'] = $sections;
}
unset($sections, $res, $row);
}
if(isset($arFields['SECTION_ID']))
{
$newSectionId = (int)$arFields['SECTION_ID'];
if (is_array($arElement['IBLOCK_SECTION']) && isset($arElement['IBLOCK_SECTION_ID']))
{
$oldSectionId = (int)$arElement['IBLOCK_SECTION_ID'];
$key = array_search($oldSectionId, $arElement['IBLOCK_SECTION'], true);
if ($key !== false)
{
$arElement['IBLOCK_SECTION'][$key] = $newSectionId;
}
unset($oldSectionId, $key);
}
$arElement['IBLOCK_SECTION_ID'] = $newSectionId;
unset($newSectionId);
}
if(isset($arFields['SORT']))
{
$arElement['SORT'] = $arFields['SORT'];
}
if(isset($arFields['ACTIVE']))
{
$arElement['ACTIVE'] = $arFields['ACTIVE'];
}
if(isset($arFields['DETAIL_PICTURE']))
{
$arElement['DETAIL_PICTURE'] = $arFields['DETAIL_PICTURE'];
}
else
{
unset($arElement["DETAIL_PICTURE"]);
}
if(isset($arFields['DESCRIPTION']))
{
$arElement['DETAIL_TEXT'] = $arFields['DESCRIPTION'];
}
if(isset($arFields['DESCRIPTION_TYPE']))
{
$arElement['DETAIL_TEXT_TYPE'] = $arFields['DESCRIPTION_TYPE'];
}
if(isset($arFields['PREVIEW_PICTURE']))
{
$arElement['PREVIEW_PICTURE'] = $arFields['PREVIEW_PICTURE'];
}
else
{
unset($arElement["PREVIEW_PICTURE"]);
}
if(isset($arFields['PREVIEW_TEXT']))
{
$arElement['PREVIEW_TEXT'] = $arFields['PREVIEW_TEXT'];
$arElement['PREVIEW_TEXT_TYPE'] = 'text';
}
if(isset($arFields['PREVIEW_TEXT_TYPE']))
{
$arElement['PREVIEW_TEXT_TYPE'] = $arFields['PREVIEW_TEXT_TYPE'];
}
if(isset($arFields['XML_ID']))
{
$arElement['XML_ID'] = $arElement['EXTERNAL_ID'] = $arFields['XML_ID'];
}
else
{
if (isset($arFields['ORIGINATOR_ID']) || isset($arFields['ORIGIN_ID']))
{
if ($arFields['ORIGINATOR_ID'] <> '' && $arFields['ORIGIN_ID'] <> '')
{
$arElement['XML_ID'] = $arFields['ORIGINATOR_ID'].'#'.$arFields['ORIGIN_ID'];
}
else
{
$delimiterPos = mb_strpos($arElement['XML_ID'], '#');
if ($arFields['ORIGINATOR_ID'] <> '')
{
if ($delimiterPos !== false)
{
$arElement['XML_ID'] = $arFields['ORIGINATOR_ID'].mb_substr($arElement['XML_ID'], $delimiterPos);
}
else $arElement['XML_ID'] = $arFields['ORIGINATOR_ID'];
}
else
{
if ($delimiterPos !== false)
{
$arElement['XML_ID'] = mb_substr($arElement['XML_ID'], 0, $delimiterPos).$arFields['ORIGIN_ID'];
}
else $arElement['XML_ID'] = '#'.$arFields['ORIGINATOR_ID'];
}
}
}
}
if(isset($arFields['DATE_CREATE']))
{
$arElement['DATE_CREATE'] = $arFields['DATE_CREATE'];
}
// May be false or null
if(array_key_exists('TIMESTAMP_X', $arFields))
{
$arElement['TIMESTAMP_X'] = $arFields['TIMESTAMP_X'];
}
if(isset($arFields['CREATED_BY']))
{
$arElement['CREATED_BY'] = $arFields['CREATED_BY'];
}
if(isset($arFields['MODIFIED_BY']))
{
$arElement['MODIFIED_BY'] = $arFields['MODIFIED_BY'];
}
else
{
if (isset($USER) && $USER instanceof \CUser)
{
$arElement['MODIFIED_BY'] = $USER->GetID();
}
}
if(isset($arFields['PROPERTY_VALUES']) && is_array($arFields['PROPERTY_VALUES']))
{
$arElement['PROPERTY_VALUES'] = $arFields['PROPERTY_VALUES'];
}
if(!$element->Update($ID, $arElement))
{
self::$LAST_ERROR = $element->LAST_ERROR;
return false;
}
$iblockElementUpdated = true;
}
}
// update VAT
$arCatalogProductFields = array();
if (isset($arFields['VAT_INCLUDED']))
$arCatalogProductFields['VAT_INCLUDED'] = $arFields['VAT_INCLUDED'];
if (isset($arFields['VAT_ID']) && !empty($arFields['VAT_ID']))
$arCatalogProductFields['VAT_ID'] = $arFields['VAT_ID'];
if (isset($arFields['MEASURE']) && !empty($arFields['MEASURE']))
$arCatalogProductFields['MEASURE'] = (int)$arFields['MEASURE'];
if (!empty($arCatalogProductFields))
{
$arCatalogProductFields['ID'] = (int)$ID;
if (!self::innerProductModify($arCatalogProductFields))
{
return false;
}
if (!$iblockElementUpdated)
{
$needUpdateIblockElement = true;
}
}
if (isset($arFields['PRICE']) && isset($arFields['CURRENCY_ID']))
{
self::setPrice($ID, $arFields['PRICE'], $arFields['CURRENCY_ID']);
if (!$iblockElementUpdated)
{
$needUpdateIblockElement = true;
}
}
else
{
if (isset($arFields['PRICE']) || isset($arFields['CURRENCY_ID']))
{
$price = $currency = false;
if (!isset($arFields['PRICE']))
{
$basePriceInfo = self::getPrice($ID);
if ($basePriceInfo !== false && is_array($basePriceInfo) && isset($basePriceInfo['PRICE']))
{
$price = $basePriceInfo['PRICE'];
$currency = $arFields['CURRENCY_ID'];
}
}
elseif (!isset($arFields['CURRENCY_ID']))
{
$basePriceInfo = self::getPrice($ID);
if ($basePriceInfo !== false && is_array($basePriceInfo) && isset($basePriceInfo['PRICE']))
{
$price = $arFields['PRICE'];
$currency = $basePriceInfo['CURRENCY'];
}
else
{
$price = $arFields['PRICE'];
$currency = CCrmCurrency::GetBaseCurrencyID();
if ($currency === '')
$currency = false;
}
}
else
{
$price = $arFields['PRICE'];
$currency = $arFields['CURRENCY_ID'];
}
if ($price !== false && $currency !== false)
{
CCrmProduct::setPrice($ID, $price, $currency);
if (!$iblockElementUpdated)
{
$needUpdateIblockElement = true;
}
}
}
}
if ($needUpdateIblockElement)
{
$element = new CIBlockElement();
$element->Update($ID, ['ID' => $ID], false, false, false, false);
}
CCrmEntityHelper::RemoveCached(self::CACHE_NAME, $ID);
foreach (GetModuleEvents("crm", self::EVENT_ON_AFTER_UPDATE, true) as $arEvent)
ExecuteModuleEventEx($arEvent, array($ID, $arFields));
return true;
}