Получить минимальную цену с учётом нескольких типов цен
Расчёт минимальной цены товара среди всех типов цен с учётом количества, скидок и доступности типов цен для пользователя.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
Получение минимальной цены товара среди всех доступных типов цен. Используйте в списках товаров, фильтрах, компонентах каталога для отображения лучшей цены.
use Bitrix\Main\Loader;
/**
* Получить минимальную цену среди всех типов цен
* @param int $productId ID товара
* @param int $userId ID пользователя (для проверки доступности типов цен)
* @param int $quantity Количество для расчёта
* @return array|false ['PRICE' => float, 'CURRENCY' => string, 'PRICE_TYPE_ID' => int] или false
*/
function getMinimalPriceFromAllTypes($productId, $userId = 0, $quantity = 1) {
if (!Loader::includeModule('catalog')) {
return false;
}
// Получаем все типы цен
$priceTypes = CCatalogGroup::GetList([], ['BASE' => 'N']);
$allPriceTypes = [];
while ($type = $priceTypes->Fetch()) {
$allPriceTypes[] = $type['ID'];
}
// Добавляем базовый тип цены
$baseType = CCatalogGroup::GetBaseGroup();
if ($baseType) {
$allPriceTypes[] = $baseType['ID'];
}
$minimalPrice = null;
$minimalPriceData = null;
// Проверяем каждый тип цены
foreach ($allPriceTypes as $priceTypeId) {
// Проверяем доступность типа цены для пользователя
if ($userId > 0) {
$userGroups = CUser::GetUserGroup($userId);
$priceType = CCatalogGroup::GetByID($priceTypeId);
if ($priceType && !empty($priceType['USER_GROUP'])) {
$allowedGroups = explode(',', $priceType['USER_GROUP']);
if (empty(array_intersect($userGroups, $allowedGroups))) {
continue; // Тип цены недоступен для пользователя
}
}
}
// Получаем цену этого типа
$price = CPrice::GetList(
[],
[
'PRODUCT_ID' => $productId,
'CATALOG_GROUP_ID' => $priceTypeId
],
false,
false,
['PRICE', 'CURRENCY']
)->Fetch();
if ($price) {
$priceValue = (float)$price['PRICE'];
// Получаем цену с учётом скидок
$optimalPrice = CCatalogProduct::GetOptimalPrice(
$productId,
$quantity,
$userId,
'N',
[],
false,
false,
[$priceTypeId]
);
if ($optimalPrice && isset($optimalPrice['PRICE']['PRICE'])) {
$priceValue = (float)$optimalPrice['PRICE']['PRICE'];
}
if ($minimalPrice === null || $priceValue < $minimalPrice) {
$minimalPrice = $priceValue;
$minimalPriceData = [
'PRICE' => $priceValue,
'CURRENCY' => $price['CURRENCY'],
'PRICE_TYPE_ID' => $priceTypeId
];
}
}
}
return $minimalPriceData ?: false;
}
Usage:
// Получить минимальную цену для текущего пользователя
$userId = $GLOBALS['USER']->GetID();
$minPrice = getMinimalPriceFromAllTypes(12345, $userId, 1);
if ($minPrice) {
echo 'Минимальная цена: ' . $minPrice['PRICE'] . ' ' . $minPrice['CURRENCY'];
echo 'Тип цены ID: ' . $minPrice['PRICE_TYPE_ID'];
}
// Для неавторизованного пользователя
$minPrice = getMinimalPriceFromAllTypes(12345, 0, 1);
Notes:
⚠️ Метод проверяет доступность типов цен через группы пользователя. Для неавторизованных пользователей доступны только публичные типы цен. GetOptimalPrice учитывает скидки и персональные цены. Если товар имеет несколько типов цен, возвращается минимальная среди доступных.