GetOptimalPrice
Добрый день.
Народ, подскажите, пжл. Вот такой трабл:
Я добавляю товар в корзину,используя функцию CSaleBasket::Add($arFields). В массиве $arFields
$arFields = array(
«PRODUCT_ID» => $iIdNumber,
«PRODUCT_PRICE_ID» => 0,
«PRICE» =>$sPriceValue,
«CURRENCY» => $sPriceCurrency,
«VAT_RATE» => 0.2,
«QUANTITY» => 1,
«PRICE_VAT_INCLUDE» => «Y»,/////////добавленый параметр
«LID» => LANG,
«DELAY» => «N»,
«CAN_BUY» => «Y»,
«NAME» => $sName,
«CALLBACK_FUNC» => «CatalogBasketCallback»,
«NOTES» => «»,
«ORDER_CALLBACK_FUNC» => «CatalogBasketOrderCallback»,
«DETAIL_PAGE_URL» => «/numberandcottage/index.php?ID=$iIdNumber»
);
Я добавляю товар в корзину с заданной ценой «PRICE» =>$sPriceValue. При этом указываю стандартные функции обратного вызова «CALLBACK_FUNC» => «CatalogBasketCallback» и «ORDER_CALLBACK_FUNC» => «CatalogBasketOrderCallback».
Но досадно, что стандартные функции обратного вызова при этом обновляют товар в корзине изменяют мою цену на минимально доступную для данного пользователя.
Я так понимаю, что причина этого в функции GetOptimalPrice,которая используется в CatalogBasketCallback и в CatalogBasketOrderCallback.
Чтобы в корзине была актуальная цена товара , я в функцию GetOptimalPrice передаю параметр array(array(«PRICE»=>»200″,»CURRENCY»=>»UAH»)),явным образом ограничивая список цен, из которых выбирается оптимальная.
$arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal,array(array(«PRICE»=>»200″,»CURRENCY»=>»UAH»)));
При этом цена в корзине выводиться нужная,т.е. та ,которую я указал array(array(«PRICE»=>»200″,»CURRENCY»=>»UAH»)).
Но при этом не работают скидки.
Может кто-то уже переписывал функцию GetOptimalPrice?
Помогите решить проблему.Заранее спасибо.
Михаил,спасибо за совет. Но я, чесно говоря, не знаю как реализовать этот способ.
Необходимо,чтобы ОДИН КОНКРЕТНЫЙ пользователь покупал по ОДНОМУ КОНКРЕТНОМУ типу цены,а не группа пользователей. Подскажите,пжл, функции API для реализации этой задачи.
Опишу задачу подробнее: пользователь заходит на сайт,чтобы забронировать номер в отеле. Он указывает дату заезда(в зависимости от этого определяется сезон «низкий» или «высокий»), категорию номера (люкс,полулюкс,стандарт) и количество людей(1,2,3). В зависимости от этих всех параметров определяется нужный тип цены и добавляется номер в корзину для заказа.Но при этом функции обратного вызова подставляют мин. цену в корзину, заменяя при этом правильную цену.
Не сочтите за упрямство:на мой взгляд,решить эту задачу проще передавая функции GetOptimalPrice массив типов цен,по которому эта функция будет искать оптимальную.
Источник
GetOptimalPrice
Добрый день.
Народ, подскажите, пжл. Вот такой трабл:
Я добавляю товар в корзину,используя функцию CSaleBasket::Add($arFields). В массиве $arFields
$arFields = array(
«PRODUCT_ID» => $iIdNumber,
«PRODUCT_PRICE_ID» => 0,
«PRICE» =>$sPriceValue,
«CURRENCY» => $sPriceCurrency,
«VAT_RATE» => 0.2,
«QUANTITY» => 1,
«PRICE_VAT_INCLUDE» => «Y»,/////////добавленый параметр
«LID» => LANG,
«DELAY» => «N»,
«CAN_BUY» => «Y»,
«NAME» => $sName,
«CALLBACK_FUNC» => «CatalogBasketCallback»,
«NOTES» => «»,
«ORDER_CALLBACK_FUNC» => «CatalogBasketOrderCallback»,
«DETAIL_PAGE_URL» => «/numberandcottage/index.php?ID=$iIdNumber»
);
Я добавляю товар в корзину с заданной ценой «PRICE» =>$sPriceValue. При этом указываю стандартные функции обратного вызова «CALLBACK_FUNC» => «CatalogBasketCallback» и «ORDER_CALLBACK_FUNC» => «CatalogBasketOrderCallback».
Но досадно, что стандартные функции обратного вызова при этом обновляют товар в корзине изменяют мою цену на минимально доступную для данного пользователя.
Я так понимаю, что причина этого в функции GetOptimalPrice,которая используется в CatalogBasketCallback и в CatalogBasketOrderCallback.
Чтобы в корзине была актуальная цена товара , я в функцию GetOptimalPrice передаю параметр array(array(«PRICE»=>»200″,»CURRENCY»=>»UAH»)),явным образом ограничивая список цен, из которых выбирается оптимальная.
$arPrice = CCatalogProduct::GetOptimalPrice($productID, $quantity, $USER->GetUserGroupArray(), $renewal,array(array(«PRICE»=>»200″,»CURRENCY»=>»UAH»)));
При этом цена в корзине выводиться нужная,т.е. та ,которую я указал array(array(«PRICE»=>»200″,»CURRENCY»=>»UAH»)).
Но при этом не работают скидки.
Может кто-то уже переписывал функцию GetOptimalPrice?
Помогите решить проблему.Заранее спасибо.
Источник
Обработчик OnGetOptimalPrice. Скидка
Нашел статью http://habrahabr.ru/post/184898/ ,
но она меня не удовлетворила, поскольку там не описано ничего про скидку — $discount,
Соответственно, когда я выполняю данный код, скидка пропадает.
Научите, пожалуйста, как подменить цену, но оставить скидку. Спасибо!
А еще точнее, как подменить цену и перерассчитать для неё скидку?
С учетом всех правил корзины и скидок на товары, если они должны быть обработаны и переданы именно из этого метода.
Или в этой функции только купоны учитываются?
Буду очень рад любому ответу. Спасибо!
| Цитата |
|---|
| Евгений Жуков пишет: Приведенная Вами ссылка содержит описывает неправильное использование события. Если Вам необходима информация о корзине для формирования цены, необходимо работать с правилами работы с корзиной. И никак иначе. |
Спасибо за ответ.
В принципе, мне информация о корзине не нужна (пока). Мне нужно пересчитать скидку на основе купонов и тех активных скидок на товары, где купоны не используются.
| Цитата |
|---|
| Евгений Жуков пишет: Это делает стандартный метод. В чем отличие Вашей логики? |
Я подменяю цену для каждого сайта. =)
Помогите, пожалуйста, с перерасчетом скидки.
| Цитата |
|---|
| Роман Мурадян пишет: Я подменяю цену для каждого сайта |
| Цитата |
|---|
| Роман Мурадян пишет: Я подменяю цену для каждого сайта |
Не понимаю. У Вас несколько сайтов, инфоблок привязан к нескольким сайтам? Скидки на товары тоже привязаны к конкретному сайту. Что мешает завести для каждого сайта свой набор скидок?
Включена мультисайтовость.
Цены на товары на каждом сайте (в каждом регионе) различны. При попадании в корзину должна браться цена товара для данного сайта.
Есть Цена для Москвы, цена для Алексина.
При стандартной работе модуля, как известно в корзину падает товар по минимальной цене, а мне нужно, чтоб он падал по цене данного сайта.
( по московской, по питерской и т.д.)
Моя проблема в том, что я не знаю, как мне при подмене цены учесть еще и скидки.
Так как я не знаю, какой код реализует стандартный функционал метода GetOptimalPrice.
Источник
Тактический обвес GetOptimalPrice
Вроде все хорошо, но поле DISCOUNT_PRICE мало чем полезно. Во-первых, базовая валюта — это не обязательно валюта сайта. Во-вторых, включен в нее НДС или нет — определяется настройками товара. В то время как магазин, например, требует обязательного включения в цену НДС. В итоге для получения цены, которая уйдет в корзину, необходимо еще раз посчитать итоговую минимальную цену в провайдере, после чего магазин еще и переведет ее в свою валюту. На одном-двух товарах еще куда ни шло, но обработка корзины с сотней товаров (оптовый заказ) — уже стоит ресурсов.
Начиная с catalog 15.0.2 появился еще один ключ — RESULT_PRICE . Он содержит следующую информацию:
Ну и что? Еще один ключ, чем он поможет? Сам по себе нет, но в сочетании с набором статических методов — будет полезен. Итак:
I. пара CCatalogProduct::setUsedCurrency ($currency) и CCatalogProduct::getUsedCurrency ()
Метод CCatalogProduct::setUsedCurrency указывает, в какой валюте ($currency) считать данные для ключа RESULT_PRICE . Возвращаемого значения нет. Если указана несуществующая валюта — она будет проигнорирована.
Метод CCatalogProduct::getUsedCurrency возвращает null (в этом случае данные считаются в базовой валюте) либо код используемой валюты.
Сейчас эта пара используется в штатном провайдере ( CCatalogProvider ) для проведения всех расчетов в валюте магазина.
Метод CCatalogProduct::clearUsedCurrency сбрасывает заданную валюту (т.е. после его вызова все расчеты ведутся в базовой валюте)
II. пара CCatalogProduct::setPriceVatIncludeMode ($mode) и CCatalogProduct::getPriceVatIncludeMode ()
Вызов CCatalogProduct::setPriceVatIncludeMode позволяет указать — включать или нет НДС в значения полей ключа RESULT_PRICE . Он имеет все один параметр — булевый. true — включать, false — выключать. По умолчанию НДС включен в результат.
Метод CCatalogProduct::getPriceVatIncludeMode () возвращает текущее состояние этой настройки.
III. Методы CCatalogProduct::setUseDiscount ($mode) и CCatalogProduct::getUseDiscount ()
Метод CCatalogProduct::setUseDiscount позволяет запретить или разрешить использование скидок торгового каталога при вычислении минимальной цены товара. Действует на все данные, возвращаемые CCatalogProduct::GetOptimalPrice . Параметр один, булевый. true — разрешить, false — запретить.
Все методы статические, т.е. действуют в пределах всего хита (после вызова, естественно).
Начиная с обновления catalog 15.0.6 ключ RESULT_PRICE заполняется данными и в том случае, когда использованы обработчики события OnGetOptimalPrice. Параметры, заданные методами CCatalogProduct::setUsedCurrency и CCatalogProduct::setPriceVatIncludeMode при этом учитываются, CCatalogProduct::setUseDiscount — нет.
Для улучшения производительности авторам кастомных провайдеров рекомендуется внести изменения в свой код с учетом вышеизложенных возможностей.
Источник
OnGetOptimalPrice
Описание и параметры
OnGetOptimalPrice — событие, вызываемое в методе CCatalogProduct::GetOptimalPrice. Позволяет заменить стандартный метод выборки наименьшей цены для товара (использование этого обработчика для реализации алгоритмов, требующих информации о корзине, невозможно).
Параметры
| Параметр | Описание |
|---|---|
| intProductID | Идентификатор товара. |
| quantity | Количество товара. |
| arUserGroups | Массив групп, которым принадлежит пользователь. |
| renewal | (Y|N) Флаг продления подписки. |
| arPrices | Массив цен. |
| siteID | Идентификатор сайта, для которого производится вычисление. |
| arDiscountCoupons | Массив купонов, которые влияют на выборку скидок. Если задано значение false, то массив купонов будет взят из CCatalogDiscountCoupon::GetCoupons. Если будет передан пустой массив купонов, то купонные скидки учитываться не будут вообще. |
Возвращаемое значение
В результате работы обработчика могут быть возвращены следующие значения:
- true — обработчик ничего не сделал, будет выполнена работа метода CCatalogProduct::GetOptimalPrice;
- false — возникла ошибка, работа метода прерывается;
- массив, описывающий наименьшую цену для товара.
Смотрите также
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.
Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
Источник