Как получить минимальную цену торговых предложений Битрикс
У товаров в Битрикс может быть сразу несколько торговых предложений с разными ценами. И иногда требуется определить минимальную цену из всех торговых предложений.
Достичь этой цели можно следующим способом:
\Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\Loader::includeModule('catalog'); $iblock_id = 8; // ID инфоблока с товарами $product_id = 1000; // ID товара для которого нужно определить минимальную цену торгового предложения $iblock_info = CCatalogSKU::GetInfoByProductIBlock($iblock_id); if(is_array($iblock_info)) { $rsOffers = CIBlockElement::GetList(array("PRICE" => "ASC"), array("IBLOCK_ID" => $iblock_info["IBLOCK_ID"], "PROPERTY_" . $iblock_info["SKU_PROPERTY_ID"] => $product_id)); while($arOffer = $rsOffers->GetNext()) { $offer_price = GetCatalogProductPrice($arOffer["ID"], 1); echo $offer_price; break; } }
Здесь мы для одного товара получаем список всех его торговых предложений отсортированных по цене в порядке возрастания. То есть первым в выборке будет торговое предложение с наименьшей ценой. Затем мы выводим эту минимальную цену и прекращаем выполнение цикла.
Как записать минимальную цену торговых предложений в свойство товара
Но у меня стояла чуть другая задача. Мне нужно было определить минимальную цену и записать её в свойство товара. При этом сделать это нужно было для всех товаров инфоблока.
Делается это вот так:
\Bitrix\Main\Loader::includeModule('iblock'); \Bitrix\Main\Loader::includeModule('catalog'); $iblock_id = 8; // ID инфоблока с товарами $iblock_info = CCatalogSKU::GetInfoByProductIBlock($iblock_id); $success = array(); if(is_array($iblock_info) && !empty($iblock_info["SKU_PROPERTY_ID"])) { $rsOffers = CIBlockElement::GetList(array("PRICE" => "ASC"), array("IBLOCK_ID" => $iblock_info["IBLOCK_ID"]), array("ID", "PROPERTY_" . $iblock_info["SKU_PROPERTY_ID"])); while($arOffer = $rsOffers->GetNext()) { $offer_price = GetCatalogProductPrice($arOffer["ID"], 1); // 1 - это ID типа цены $product_id = $arOffer["PROPERTY_" . $iblock_info["SKU_PROPERTY_ID"] . "_VALUE"]; // проверка if(array_key_exists($product_id, $success))
continue; CIBlockElement::SetPropertyValuesEx($product_id, false, array("MINIMUM_PRICE" => $offer_price["PRICE"])); $success[$product_id] = 1; } }
Здесь мы получаем список всех торговых предложений отсортированных по цене в порядке возрастания. При обходе всех предложений циклом, мы записываем минимальную цену в свойство товара MINIMUM_PRICE.
Но так как у одного товара может быть несколько торговых предложений, мы ещё добавляем проверку. То есть, после того как мы обновили свойство товара, записываем ID этого товара в массив $success, а на последующих шагах цикла проверяем, обновляли ли мы уже свойство для товара с таким же ID.