Событие перед записью свойств торговых предложений
Last updated
Was this helpful?
Last updated
Was this helpful?
На скриншоте указано для каких свойств вызывается событие:
Здесь видно, что это событие отличается от [onSetPropsForItem] тем, что вызывается в момент импорта характеристик модификаций МС в свойства торговых предложений БУС.
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'rbs.moyskladstocks',
'OnSetSkuProps',
'OnSetSkuPropsHandler'
);
function OnSetSkuPropsHandler(\Bitrix\Main\Event $event)
{
$eventParams = $event->getParameters();
//Элемент БУС (массив)
$itemBx = $eventParams['itemBx'];
//Элемент МС (объект)
$itemMs = $eventParams['itemMs'];
//Массив с параметрами свойств Битрикса, подробнее описаны ниже
$propSkuList= $eventParams['propSkuList'];
//Массив, который можно менять для установки новых свойств. Данные записываются в метод CIblockElement::SetPropertyValuesEx()
$arResultSku = $eventParams['arResultSku'];
//доступ к текущим характеристикам осуществляется через их перебор
foreach ($itemMs->characteristics as $prop) {
//значение характеристики модификации МС
$propValue = $prop->value;
//значене в верхнем регистре, необходимо чтобы определить существующее значение
//свойства типа "Список", "Эл. инфоблока" или "Справочник"
//поскольку эти свойства записываются через их ID, а не строковое значение
$enumKeyValue = mb_strtoupper($propValue);
//доступ к ID свойству битрикса, ассоциированному с характеристикой
$propIdBx = $propSkuList['PROP_IDS'][$prop->id];
//тип свойства битрикса
$propType = $propSkuList['PROP_TYPES'][$propIdBx]['TYPE'];
//ниже описаны возможные типы свойств торг. предложения битрикса, куда будут импортироваться характеристики
switch ($propType) {
case 'S': //свойства типа "строка"
$arResultSku[$propIdBx] = $prop->value;
break;
case 'N': //свойства типа "число"
$arResultSku[$propIdBx] = (float)$prop->value;
break;
case 'L': //свойства типа "список"
if (isset($propSkuList['PROP_ENUMS'][$prop->id][$enumKeyValue])) {
//текущее значение свойства в виде ID значения списка
$enumId = $propSkuList['PROP_ENUMS'][$prop->id][$enumKeyValue];
if ((int)$enumId > 0) {
$arResultSku[$propIdBx] = $enumId;
}
}
break;
case 'E': //свойства типа "Привязка к элементам инфоблока"
//считывание ID инфоблока, который привязан к свойству
$iblock_id = $propSkuList['PROP_TYPES'][$propIdBx]['PARAM'];
if (isset($propSkuList['PROP_ENUMS'][$prop->id][$enumKeyValue])) {
//текущее значение ID привязанного элемента инфоблока
$elementId = $propSkuList['PROP_ENUMS'][$prop->id][$enumKeyValue];
if ((int)$elementId > 0) {
$arResultSku[$propIdBx] = $elementId ;
}
}
break;
case 'S:directory': //свойства типа "Справочник"
//делаем проверку что модуль корректно загрузил сущность справочника для работы с ним
if (!empty($propSkuList['PROP_TYPES'][$propIdBx]['PARAM']) && $propSkuList['PROP_TYPES'][$propIdBx]['HL_CLASS'] !== null) {
//теперь можем работать со справочником как с классом, со всеми стандартными методами
$entityDataClass = $propSkuList['PROP_TYPES'][$propIdBx]['HL_CLASS'];
//$entityDataClass::add();
//$entityDataClass::update();
//$entityDataClass::getList();
$ufXmlId = ''; //заметьте что привязка к справочнику идет не по ID элемента
//справочника, а по полю UF_XML_ID, которое автоматом создается при
//создании свойства типа "Справочник"
if (isset($propSkuList['PROP_ENUMS'][$prop->id][$enumKeyValue])) {
$ufXmlId = $propSkuList['PROP_ENUMS'][$prop->id][$enumKeyValue];
}
//если есть текущий UF_XML_ID, то можем с ним работать
if(!empty($ufXmlId)){
$arResultSku[$propIdBx] = $ufXmlId;
}
//Пример найти текущий элемент справочника
$hlItem = $entityDataClass::getList([
'filter' => [
'=UF_XML_ID' => $ufXmlId
]
])->fetch();
//$hlItem['UF_NAME'] -- название справчника, которое выводится на сайте
//$hlItem['ID'] -- его значение, которое можно передавать в метод $entityDataClass::update();
//но не советую менять поле UF_NAME, лучше создать новый элемент справочника
//еще пример если нужно подставлять значения справочников исходя из характеристик модификации МС
if($prop->value === '#000') {
$ufNewXmlId = 'black'; //пусть будет ассоциация с текущим значением характеристики
$hlItem = $entityDataClass::getList([
'filter' => [
'=UF_XML_ID' => $ufNewXmlId
]
])->fetch();
//можно искать по любому полю, важно чтобы в элементе
//было нужное значение у поля
//$hlItem['UF_NAME']
//подставляем если нашли элемент с непустым UF_XML_ID
if(isset($hlItem['UF_XML_ID']) && !empty($hlItem['UF_XML_ID'])){
$arResultSku[$propIdBx] = $hlItem['UF_XML_ID'];
} else {
//если он пустой или отсутсвует, то создаем новый с заполненным полем UF_XML_ID
$result = $entityDataClass::add([
'UF_NAME' => 'черный',
'UF_XML_ID' => $ufNewXmlId
]);
if($result->isSuccess()){
$arResultSku[$propIdBx] = $ufNewXmlId;
}
}
}
}
break;
}
}
//Отправляем \Bitrix\Main\EventResult::SUCCESS только в случае, если нужно поменять данные перед отправкой
return new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, $arResultSku);
}