Получение элементов инфоблока через D7 и обновление коэффициента
Данная заметка является дополнением к статье Коэффициент единицы измерения из свойства элемента.
Этот код можно выполнить в командной строке PHP или добавить в агента/cron-задание, если требуется регулярно менять коэффициент по расписанию.
use Bitrix\Main\Loader;
use Bitrix\Iblock\ElementTable;
use Bitrix\Catalog\MeasureRatioTable;
Loader::includeModule('iblock');
Loader::includeModule('catalog');
$arElements = ElementTable::getList([
'filter' => [
'IBLOCK_ID' => 3, // Идентификатор инфоблока
'SECTION_ID' => 15 // Раздел 15 или удалите, чтобы изменить все товары
],
'select' => [
'ID'
],
])->fetchAll();
foreach ($arElements as $item) {
// Получаем ID коэффициента для этого товара
$curElementRatio = MeasureRatioTable::getList([
'filter' => [
'=PRODUCT_ID' => $item['ID'],
],
'limit' => 1, // Не обязательно, так как обычно один
'select' => [
'ID'
],
])->fetch();
// Обновляем коэффициент
MeasureRatioTable::update($curElementRatio['ID'], [
'RATIO' => 1.7, // Можно указать float или int
]);
}
Этот скрипт выбирает все товары из инфоблока с ID 3 внутри раздела 15 (если раздел указан). Для каждого товара получает текущий коэффициент единицы измерения и устанавливает новый значение 1.7.
Менять коэффициент при обмене с 1С-Предприятие
Если у вас нет возможности указывать коэффициент прямо в 1С, что бы она передавала его на сайт. Можно перехватывать событие измненеия элемента и принудительно менять коэффициент. Код добавляем в /local/php_interface/init.php (или в /bitrix/php_interface/init.php)
use Bitrix\Main\EventManager;
use Bitrix\Main\Loader;
EventManager::getInstance()->addEventHandler("iblock", "OnBeforeIBlockElementUpdate", "changeMeasureRatio");
function changeMeasureRatio(&$arFields) {
if ($_REQUEST['mode'] == 'import') {
Loader::includeModule('catalog');
// Получаем ID коэффициента для этого товара
$curElementRatio = \Bitrix\Catalog\MeasureRatioTable::getList([
'filter' => [
'=PRODUCT_ID' => $arFields['ID'],
],
'limit' => 1,
'select' => ['ID'],
])->fetch();
if ($curElementRatio) {
// Обновляем коэффициент
\Bitrix\Catalog\MeasureRatioTable::update($curElementRatio['ID'], [
'RATIO' => 1.7, // Можно указать float или int
]);
}
}
}