Задать вопрос
@Ex1st

Как изменить цену при добавлении/изменении элемента торгового каталога?

Нужно генерировать цену исходя из закупочной цены.

Для этого решил воспользоваться событием "OnProductAdd" и вот что вышло:
раскрыть код
function ProductAddPriceHandler($id, $arFields)
{
    $purchasePrice = $arFields['PURCHASING_PRICE'];
    $id = $arFields['ID'];

    if ($purchasePrice <= 100) {
        $productPrice = ($purchasePrice / 100 * 100) + $purchasePrice;
    } elseif ($purchasePrice >= 101 and $purchasePrice <= 500) {
        $productPrice = ($purchasePrice / 100 * 75) + $purchasePrice;
    } elseif ($purchasePrice >= 501 and $purchasePrice <= 1000) {
        $productPrice = ($purchasePrice / 100 * 60) + $purchasePrice;
    } elseif ($purchasePrice >= 1001 and $purchasePrice <= 2000) {
        $productPrice = ($purchasePrice / 100 * 50) + $purchasePrice;
    } elseif ($purchasePrice >= 2001 and $purchasePrice <= 4000) {
        $productPrice = ($purchasePrice / 100 * 40) + $purchasePrice;
    } elseif ($purchasePrice >= 4001) {
        $productPrice = ($purchasePrice / 100 * 30) + $purchasePrice;
    }

    $arProductPriceFields = array(
        'PRODUCT_ID' => $id,
        'CATALOG_GROUP_ID' => 1,
        'PRICE' => 500,
        'CURRENCY' => 'RUB',
    );

    $result = \Bitrix\Catalog\Model\Price::add($arProductPriceFields);
}

Событие срабатывает, но цена не добавляется.

Нагуглил, оказывается есть схожий баг от 2012 года. Решение оттуда не попробовал, потому что не понял, как его реализовать.

Вопрос: что не так? И актуален ли баг, кто сталкивался?
  • Вопрос задан
  • 62 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@tgarl
Главная ваша ошибка, это то что вы просто хотите добавить цену, а она может уже у товара есть. Следовательно вам сначала нужно получить идентификатор цены товара. Если его нет, то тогда добавлять, иначе обновлять.

Если посмотреть в документации, то там есть наглядный пример
$res = CPrice::GetList(
        array(),
        array(
                "PRODUCT_ID" => $PRODUCT_ID,
                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
            )
    );

if ($arr = $res->Fetch())
{
    CPrice::Update($arr["ID"], $arFields); //если есть обновляем
}
else
{ //иначе добавляем
    CPrice::Add($arFields);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы