update
\Bitrix\Main\ORM\Data\UpdateResult public static \Bitrix\Catalog\Model\Product::update( $id, array $data );
Метод изменяет запись товара, обновляет внутренний кеш и запускает автоматические действия каталога. Статический метод.
Метод унаследован от \Bitrix\Catalog\Model\Entity. Класс Product дополняет базовый алгоритм проверкой полей товара, расчетом доступности и последующими действиями каталога.
Параметры
| Параметр | Описание |
|---|---|
$id | Идентификатор товара. Метод приводит значение к целому числу при подготовке данных |
$data |
Поля для изменения. Метод принимает плоский массив полей или структуру:
[ "fields" => [ "QUANTITY" => 5 ], "external_fields" => [ "IBLOCK_ID" => 2 ], "actions" => [] ]В fields передают только изменяемые поля товара. Подробное описание полей массива fields смотрите в описании метода add. Ключ external_fields может содержать IBLOCK_ID. Массив actions обычно не заполняют вручную
|
Возвращаемое значение
Метод возвращает объект \Bitrix\Main\ORM\Data\UpdateResult. Через объект можно проверить результат и получить ошибки.
Особенности
Метод проверяет тип товара, количество, флаги, габариты, вес, закупочную цену, валюту и доступность. После успешного изменения метод может пересчитать доступность SKU и комплектов, обновить время изменения элемента и обработать подписки на поступление.
Пример
Изменение количества товара
Пример изменяет количество заранее подготовленного тестового товара. Передайте идентификаторы товара и его инфоблока.
<?php
use Bitrix\Catalog\Model\Product;
use Bitrix\Main\Loader;
if (!Loader::includeModule('catalog'))
{
throw new RuntimeException('Не удалось подключить модуль catalog');
}
// Идентификатор тестового товара, количество которого можно изменить
$productId = 123;
// Идентификатор каталога товара
$iblockId = 2;
try
{
$result = Product::update($productId, [
'fields' => [
'QUANTITY' => 5,
],
'external_fields' => [
'IBLOCK_ID' => $iblockId,
],
]);
if (!$result->isSuccess())
{
echo implode(PHP_EOL, $result->getErrorMessages());
return;
}
echo 'Данные товара обновлены';
}
catch (Throwable $exception)
{
echo $exception->getMessage();
}
Изменение маркировки товара
Пример устанавливает для заранее подготовленного тестового товара группу маркировки «изделия из меха». Системное поле маркировки должно существовать.
<?php
use Bitrix\Catalog\Model\Product;
use Bitrix\Catalog\Product\SystemField\MarkingCodeGroup;
use Bitrix\Catalog\Product\SystemField\Type\HighloadBlock;
use Bitrix\Main\Loader;
if (!Loader::includeModule('catalog') || !Loader::includeModule('highloadblock'))
{
throw new RuntimeException('Не удалось подключить модули catalog и highloadblock');
}
// Идентификатор тестового товара, маркировку которого можно изменить
$productId = 123;
// XML_ID группы маркировки «изделия из меха»
$markingGroupXmlId = '02';
try
{
$markingField = MarkingCodeGroup::load();
if ($markingField === null)
{
throw new RuntimeException('Системное поле маркировки товара не найдено');
}
$markingGroupIds = HighloadBlock::getIdByXmlId(
(int)$markingField['SETTINGS']['HLBLOCK_ID'],
[$markingGroupXmlId]
);
$markingGroupId = $markingGroupIds[$markingGroupXmlId] ?? null;
if ($markingGroupId === null)
{
throw new RuntimeException('Группа маркировки не найдена');
}
$result = Product::update($productId, [
'fields' => [
$markingField['FIELD_NAME'] => $markingGroupId,
],
]);
if (!$result->isSuccess())
{
echo implode(PHP_EOL, $result->getErrorMessages());
return;
}
echo 'Маркировка товара обновлена';
}
catch (Throwable $exception)
{
echo $exception->getMessage();
}