При использовании события OnBeforeIBlockElementUpdateHandler или OnAfterIBlockElementUpdate, у меня никак не получалось изменить параметр товара «коэффициент единицы измерения». Причина, как выяснилось, в том, что сначала отрабатывают события изменения элемента, а уже потом битрикс под капотом меняет нужный параметр на свой, дефолтный, или тот, который был раньше установлен в элементе (не знаю как под капотом работает, не разбирался). И не дает заменить значение параметра для элемента на нужное.
Изменение значения коэффициента единицы измерения при использовании событий
Если нужно использовать события, вопрос изменения параметра решается следующим образом:
- Создаем одно из событий:
- \Bitrix\Catalog\MeasureRatio::OnBeforeUpdate
- \Bitrix\Catalog\MeasureRatio::OnUpdate
- \Bitrix\Catalog\MeasureRatio::OnAfterUpdate
- В обработчике меняем данные прямо в объекте события
Выглядит это примерно так:
/** Обратите внимание, что событие прописывается с полным путем */
EventManager::getInstance()->addEventHandler( "catalog", "\Bitrix\Catalog\MeasureRatio::OnBeforeUpdate", 'MeasureRatioOnBeforeUpdateHandler');
/** Прописываем для него обработчик*/
function MeasureRatioOnBeforeUpdateHandler(&$eventObject)
{
$productId = $eventObject->getParameter('fields')['PRODUCT_ID'];
$result = new \Bitrix\Main\ORM\EventResult;
$dbItem = \Bitrix\Iblock\ElementPropertyTable::getList([
'select' => ['VALUE'],
'filter' => ['IBLOCK_ELEMENT_ID' => $productId, 'IBLOCK_PROPERTY_ID' => PROP_CODE],
])->fetch();
$dbItem = $dbItem['VALUE'];
$result->modifyFields(array('RATIO' => $newMeasureRatioVal));
return $result;
}Для модификации используется \Bitrix\Main\ORM\EventResult;. Подробности по классу можно посмотреть по ссылке.
Об этой проблеме писали на форуме, где я и подсмотрел решение. Также один из форумчанинов писал, что ему помогло использвание события OnCompleteCatalogImport1C, хотя я не проверял, насколько рабочим может быть решение.
Изменение коэффициента единицы измерения в коде
Здесь все достаточно просто. При необходимости изменения параметра в коде, проблем не возникает. Можно использовать методы:
use Bitrix\Catalog\MeasureRatioTable;
MeasureRatioTable::delete($recordId);
MeasureRatioTable::add([
'PRODUCT_ID' => $productId,
'RATIO' => $ratioValue,
'IS_DEFAULT' => 'Y' //Значения Y/N
]);
MeasureRatioTable::update($recordId,
[
'PRODUCT_ID' => $productId,
'RATIO' => $ratioValue,
'IS_DEFAULT' => 'Y' //Значения Y/N
]);
MeasureRatioTable::getList([
'select' => ['ID', 'RATIO', 'PRODUCT_ID'],
'filter' => ['PRODUCT_ID' => $productId]
]);
Об авторе
Сергей Житников - Веб-разработчик
Занимаюсь веб-разработкой более 5 лет. Специализируюсь на создании адаптивных сайтов и веб-приложений на HTML5, CSS3 и JavaScript. Работаю с популярными CMS и фреймворками, а также уделяю большое внимание оптимизации производительности и чистоте кода.
Есть проект или идея? Буду рад помочь!
Связаться со мной