/ Почему не обновляется цена в Bitrix при помощи функции CPrice::Update?

Почему не обновляется цена в Bitrix при помощи функции CPrice::Update?

14 Июл 2020
Дмитрий М.
646

Рассмотрим пример:

цена на товар храниться в свойстве элемента инфоблока - пусть код свойства с ценой PRICE.

Задача:

Установить цены на товары в соответствии с ценой содержащийся в свойстве элемента.

Для начала нужно выбрать все элементы инфоблока и значение свойства PRICE и составим из них массив $arPrice, индексами массива будут ID элементов а значениями массива - значения свойства PRICE. Если свойство PRICE не числовое, то такой элемент добавлять в массив не будем.

IBLOCK_ID - содержит ID инфоблока в котором хранятся элементы, над которыми будем производить все действия. Для выбора свойства указываем в массиве $arSelectFields - PROPERTY_PRICE.
$rsElement = CIBlockElement::GetList(
    $arOrder  = array("SORT" => "ASC"),
    $arFilter = array(
        "IBLOCK_ID" => 1,
    ),
    false,
    false,
    $arSelectFields = array("ID", "NAME", "IBLOCK_ID", "CODE", "PROPERTY_PRICE")
);
while($arElement = $rsElement->fetch()):
    if (is_numeric($arElement['PROPERTY_PRICE_VALUE'])){
        $arPrice[$arElement['ID']] = array(
            'ID' => $arElement['ID'],
            'PRICE' => $arElement['PROPERTY_PRICE_VALUE']
        );
    }
endwhile;

Чтобы элемент стал Товаром достаточно для элемента добавить параметры товара при помощи метода CCatalogProduct::Add. После этого можно уже добавлять цену если она она отсутствует или обновить если она уже установлена используя методы CPrice::Add/CPrice::Update. Теперь необходимо пройтись по всему массиву и установиться для каждого элемента.

CATALOG_GROUP_ID - содержит ID цены. ID цены можно посмотреть в админке - Магазин -> Настройки -> Цены -> Типы цен (в таблице столбец ID ).
foreach($arPrice as $id=>$price):
    $arFields = Array(
        "PRODUCT_ID" => $key,
        "CATALOG_GROUP_ID" => 1,
        "PRICE" => (int)$price,
        "CURRENCY" => "RUB",
        "QUANTITY_FROM" => false,
        "QUANTITY_TO" => false
    );
    // Добавляем для элемента параметры товара
    CCatalogProduct::Add(
        array(
            "ID" => $key,
            "QUANTITY" => 9999
        )
    );
    //Получаем цены товара ( в том случаи если уже есть цена у товара ), если нет, тогда добавляем сразу цену.
    $res = CPrice::GetList(
        array(),
        array(
            "PRODUCT_ID" => $key,
            "CATALOG_GROUP_ID" => 1
        )
    );
    if ($arr = $res->Fetch())
    {
        echo "Цена успешно обновлена ".CPrice::Update($arr["ID"], $arFields).PHP_EOL;
    }
    else
    {
        echo "Цена успешно добавлена ".CPrice::Add($arFields).PHP_EOL;
    }
endforeach;



Статья была полезна? Поблагодарите автора.

Самые читаемые
#1С Битрикс, #Bitrix CMS, #.htaccess, #настройка редиректов
4 Авг 2019
#Хлебные крошки, #1С Битрикс, #Bitrix CMS, #bitrix:breadcrumbs, #component_epilog, #кэширование
1 Окт 2018
#bitrix, #robots.txt, #sitemap.xml, #поддомены, #мультисайтовость
16 Окт 2018
#ресайз изображений, #1С Битрикс, #Bitrix CMS
3 Мар 2019
#bitrix, #bitrix:catalog.section, #скидки, #товары со скидкой, #страница скидок, #страница со скидками
4 Окт 2018
#Bitrix CMS, #breadcrumb, #bitrix:breadcrumbs, #хлебные крошки, #настройка
13 Фев 2019
#bitrix, #пользовательские свойства, #тип свойств, #привязка к элементам
27 Ноя 2019
#bitrix, #свойства элементов, #обработчик событий, #OnBeforeIBlockElementUpdate, #OnIBlockElementSetPropertyValues
21 Июл 2020