Документация для разработчиков
Темная тема

OnGetOptimalPrice

Описание и параметры

mixed
функция-обработчик(
   int intProductID,
   int quantity,
   array arUserGroups,
   string renewal,
   array arPrices,
   string siteID,
   array arDiscountCoupons
);

OnGetOptimalPrice - событие, вызываемое в методе CCatalogProduct::GetOptimalPrice. Позволяет заменить стандартный метод выборки наименьшей цены для товара (использование этого обработчика для реализации алгоритмов, требующих информации о корзине, невозможно).

Параметры

ПараметрОписание
intProductID Идентификатор товара.
quantity Количество товара.
arUserGroups Массив групп, которым принадлежит пользователь.
renewal (Y|N) Флаг продления подписки.
arPrices Массив цен.
siteID Идентификатор сайта, для которого производится вычисление.
arDiscountCoupons Массив купонов, которые влияют на выборку скидок. Если задано значение false, то массив купонов будет взят из CCatalogDiscountCoupon::GetCoupons. Если будет передан пустой массив купонов, то купонные скидки учитываться не будут вообще.

Возвращаемое значение

В результате работы обработчика могут быть возвращены следующие значения:

  • true - обработчик ничего не сделал, будет выполнена работа метода CCatalogProduct::GetOptimalPrice;
  • false - возникла ошибка, работа метода прерывается;
  • массив, описывающий наименьшую цену для товара.

Смотрите также



Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
1
Анастасия Слимак
Сообщение не промодерировано, возможны ошибки и неточности.
Код
<?php
use Bitrix\Main\EventManager;

$eventManager = EventManager::getInstance();

$eventManager->addEventHandler(
    "catalog",
    "OnGetOptimalPrice",
    function($productId) {
       $priceTypeCode = 'MSK';
       try {
            $arPrice = \Bitrix\Catalog\Model\Price::getList([
                'filter' => [
                    'PRODUCT_ID' => $productId,
                    'CATALOG_GROUP.NAME' => $priceTypeCode
                ],
                'select' => ['*']
            ])->fetch();
            if ($arPrice) {
                $basePrice = [
                    'ID'                => $arPrice['ID'],
                    'CATALOG_GROUP_ID'  => $arPrice['CATALOG_GROUP_ID'],
                    'PRICE'             => $arPrice['PRICE'],
                    'CURRENCY'          => $arPrice['CURRENCY'],
                    'ELEMENT_IBLOCK_ID' => $arPrice['PRODUCT_ID'],
                ];
                return ['PRICE' => $basePrice];
            }
        } catch (\Exception) {}
        return null;
    }
);

Метод CPrice::GetListEx считается устаревшим. Вот пример на d7.
CATALOG_GROUP.NAME - код типа цены.
В данном примере происходит выборка конкретной цены для товара, а не всех цен, что сокращает запрос.
0
Владимир Ворсин
Сообщение не промодерировано, возможны ошибки и неточности.
Цитата
пишет:
Пример изменения цены в зависимости от региона


AddEventHandler("catalog", "OnGetOptimalPrice", array("myPriceHandler", "GetOptimalPrice"));
class myPriceHandler
{
function GetOptimalPrice(
        $intProductID,
        $quantity = 1,
        $arUserGroups = array(),
        $renewal = "N",
        $arPrices = array(),
        $siteID = false,
        $arDiscountCoupons = false    
    ) {            
                // если применима пользователю скидка на данный товар, то получаем информацию по ценам на товар:
                $dbProductPrice = CPrice::GetListEx(
                    array(),
                    array("PRODUCT_ID" => $intProductID),
                    false,
                    false,
                    array("*")
                );
                while ($arProducPrice = $dbProductPrice->GetNext()) {
//Московская цена
if($arProducPrice['CATALOG_GROUP_CODE'] == 'MSK'){  //Код региональной цены
$arOpt = $arProducPrice;
}
                }
                $arBASE_PRICE = array(
                        'ID' => $arOpt['ID'],
                        'CATALOG_GROUP_ID' => $arOpt['CATALOG_GROUP_ID'],
                        'PRICE' => $arOpt['PRICE'],
                        'CURRENCY' => $arOpt['CURRENCY'],
                        'ELEMENT_IBLOCK_ID' => $arOpt['PRODUCT_ID'],
                );
        return array('PRICE'=>$arBASE_PRICE); // также можно вернуть описания скидок
    }
}
Огонь!
1
Евгений Милютин
Сообщение не промодерировано, возможны ошибки и неточности.
Пример изменения цены в зависимости от региона


AddEventHandler("catalog", "OnGetOptimalPrice", array("myPriceHandler", "GetOptimalPrice"));
class myPriceHandler
{
function GetOptimalPrice(
        $intProductID,
        $quantity = 1,
        $arUserGroups = array(),
        $renewal = "N",
        $arPrices = array(),
        $siteID = false,
        $arDiscountCoupons = false    
    ) {            
                // если применима пользователю скидка на данный товар, то получаем информацию по ценам на товар:
                $dbProductPrice = CPrice::GetListEx(
                    array(),
                    array("PRODUCT_ID" => $intProductID),
                    false,
                    false,
                    array("*")
                );
                while ($arProducPrice = $dbProductPrice->GetNext()) {
//Московская цена
if($arProducPrice['CATALOG_GROUP_CODE'] == 'MSK'){  //Код региональной цены
$arOpt = $arProducPrice;
}
                }
                $arBASE_PRICE = array(
                        'ID' => $arOpt['ID'],
                        'CATALOG_GROUP_ID' => $arOpt['CATALOG_GROUP_ID'],
                        'PRICE' => $arOpt['PRICE'],
                        'CURRENCY' => $arOpt['CURRENCY'],
                        'ELEMENT_IBLOCK_ID' => $arOpt['PRODUCT_ID'],
                );
        return array('PRICE'=>$arBASE_PRICE); // также можно вернуть описания скидок
    }
}
2
Вячеслав Докукин
Сообщение не промодерировано, возможны ошибки и неточности.
А пример нельзя добавить?
© «Битрикс», 2001-2023, «1С-Битрикс», 2023
Наверх