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

  • 2020-07-14
  • Дмитрий М.
  • 277

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

<p> <b>Рассмотрим пример</b>: </p> <blockquote> цена на товар храниться в свойстве элемента инфоблока - пусть код свойства с ценой PRICE. </blockquote> <p> <b>Задача</b>: </p> <blockquote> Установить цены на товары в соответствии с ценой содержащийся в свойстве элемента.<br> </blockquote> <p> Для начала нужно выбрать все элементы инфоблока и значение свойства <b>PRICE</b> и составим из них массив <b>$arPrice</b>, индексами массива будут <b>ID </b>элементов а значениями массива - значения свойства <b>PRICE</b>. Если свойство <b>PRICE </b>не числовое, то такой элемент добавлять в массив не будем. </p> <blockquote class="bxhtmled-quote"> <b>IBLOCK_ID </b>- содержит <b>ID </b>инфоблока в котором хранятся элементы, над которыми будем производить все действия. Для выбора свойства указываем в массиве <b>$arSelectFields</b> - <b>PROPERTY_PRICE.</b> </blockquote> <pre class="line-numbers"><code class="language-php">$rsElement = CIBlockElement::GetList( $arOrder = array("SORT" =&gt; "ASC"), $arFilter = array( "IBLOCK_ID" =&gt; 1, ), false, false, $arSelectFields = array("ID", "NAME", "IBLOCK_ID", "CODE", "PROPERTY_PRICE") ); while($arElement = $rsElement-&gt;fetch()): if (is_numeric($arElement['PROPERTY_PRICE_VALUE'])){ $arPrice[$arElement['ID']] = array( 'ID' =&gt; $arElement['ID'], 'PRICE' =&gt; $arElement['PROPERTY_PRICE_VALUE'] ); } endwhile;</code> </pre> <p> Чтобы элемент стал Товаром достаточно для элемента добавить параметры товара при помощи метода <b>CCatalogProduct::Add</b>. После этого можно уже добавлять цену если она она отсутствует или обновить если она уже установлена используя методы <b>CPrice::Add</b>/<b>CPrice::Update</b>. Теперь необходимо пройтись по всему массиву и установиться для каждого элемента. </p> <blockquote class="bxhtmled-quote"> <b>CATALOG_GROUP_ID</b> - содержит <b>ID </b>цены. <b>ID </b>цены можно посмотреть в админке - <i>Магазин -&gt; Настройки -&gt; Цены -&gt; Типы цен (в таблице столбец ID )</i>. </blockquote> <pre class="line-numbers"><code class="language-php">foreach($arPrice as $id=&gt;$price): $arFields = Array( "PRODUCT_ID" =&gt; $key, "CATALOG_GROUP_ID" =&gt; 1, "PRICE" =&gt; (int)$price, "CURRENCY" =&gt; "RUB", "QUANTITY_FROM" =&gt; false, "QUANTITY_TO" =&gt; false ); // Добавляем для элемента параметры товара CCatalogProduct::Add( array( "ID" =&gt; $key, "QUANTITY" =&gt; 9999 ) ); //Получаем цены товара ( в том случаи если уже есть цена у товара ), если нет, тогда добавляем сразу цену. $res = CPrice::GetList( array(), array( "PRODUCT_ID" =&gt; $key, "CATALOG_GROUP_ID" =&gt; 1 ) ); if ($arr = $res-&gt;Fetch()) { echo "Цена успешно обновлена ".CPrice::Update($arr["ID"], $arFields).PHP_EOL; } else { echo "Цена успешно добавлена ".CPrice::Add($arFields).PHP_EOL; } endforeach; </code> </pre><br> <br>

17.07.2020 13:47:28

Если Вы столкнулись с ситуацией, когда при добавлении цены для товара при помощи API с использованием CPrice::Add цена успешно добавляется, но не выводится и не показывается в админке - это означает что для элемент инфоблока не является Товаром, а значит сперва необходимо определить его в качестве товара, а потом уже добавлять ему цену.

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

цена на товар храниться в свойстве элемента инфоблока - пусть код свойства с ценой 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;





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

Возврат к списку

Другие статьи