Как получить минимальную цену торговых предложений Битрикс

13 просмотров
Автор: Николай Ковалёв

У товаров в Битрикс может быть сразу несколько торговых предложений с разными ценами. И иногда требуется определить минимальную цену из всех торговых предложений.

Достичь этой цели можно следующим способом:

\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.