Нейросети рисуют дипфейки, а мы все еще боремся с выводом цены со скидкой в фильтре.
Реализации штатной нет, т.к. скидки могут быть групповые и персональные.
Разработчикам на заметку: пока разделить общие скидки и персональные! Фильтр ОБЯЗАН выводить скидки если они ОБЩИЕ, пожалуйста доработайте, а то из коробки не рабочий вариант выходит - цены на сайте одни, а фильтруем по другим (((
Реализация нештатная: Делаем в торговом предложении свойство числовое, например Цена со скидкой, тип Число, код PRICE. Выводим в фильтр вместо цены. Далее автоматом пишем в это поле значение. Для этого в init.php пишем следующее:
Код |
---|
//
$eventManager = \Bitrix\Main\EventManager::getInstance();
// Цепляем событие изменения цены у товара
$eventManager->addEventHandler( 'catalog', '\Bitrix\Catalog\Price::OnAfterUpdate', ['bitrixFix', 'writeOptimalPrice']);
$eventManager->addEventHandler( 'catalog', '\Bitrix\Catalog\Price::OnAfterAdd', ['bitrixFix', 'writeOptimalPrice']);
// Цепляем событие изменения скидки через маркетинг
$eventManager->addEventHandler("sale", "DiscountonAfterAdd", ['bitrixFix', 'writeOptimalPriceAll']);
$eventManager->addEventHandler("sale", "DiscountonAfterUpdate", ['bitrixFix', 'writeOptimalPriceAll']);
$eventManager->addEventHandler("sale", "DiscountonAfterDelete", ['bitrixFix', 'writeOptimalPriceAll']);
class bitrixFix {
// Для частной цены
static function writeOptimalPrice (\Bitrix\Main\Event $event) {
$data = $event->getParameter("fields");
if (empty($data["PRODUCT_ID"]))
return true;
$arPrice = CCatalogProduct::GetOptimalPrice($data["PRODUCT_ID"], 1, array(2), "N", array() , "s1");
CIBlockElement::SetPropertyValueCode($data["PRODUCT_ID"], "PRICE", $arPrice["DISCOUNT_PRICE"]);
}
static function writeOptimalPriceAll (\Bitrix\Main\Event $event) {
// О мой кодер, поменяй же меня на IBLOCK_ID своего ИБ с Торговыми предложениями
$IBLOCK_WITH_TP = 6;
$data = $event->getParameter("fields");
if (empty($data["SHORT_DESCRIPTION_STRUCTURE"]))
return true;
$res = CIBlockElement::GetList(
[]
, [
"IBLOCK_ID" => $IBLOCK_WITH_TP
, "PROPERTY_DAY_VALUE" => 'Y'
]
, false
, []
, [
"ID"
]
);
while ($ob = $res->GetNextElement()) {
$arFields = $ob->GetFields();
$arPrice = CCatalogProduct::GetOptimalPrice($arFields["ID"], 1, [2], "N", [] , "s1");
CIBlockElement::SetPropertyValueCode($arFields["ID"], "PRICE", $arPrice["DISCOUNT_PRICE"]);
}
// Пересоздаем индекс, чтобы на сайте поменялося
Bitrix\Iblock\PropertyIndex\Manager::DeleteIndex($IBLOCK_WITH_TP);
Bitrix\Iblock\PropertyIndex\Manager::markAsInvalid($IBLOCK_WITH_TP);
$index = Bitrix\Iblock\PropertyIndex\Manager::createIndexer($IBLOCK_WITH_TP);
$index->startIndex();
$res = $index->continueIndex();
$index->endIndex();
\Bitrix\Iblock\PropertyIndex\Manager::checkAdminNotification();
CBitrixComponent::clearComponentCache("bitrix:catalog.smart.filter");
CIBlock::clearIblockTagCache($IBLOCK_WITH_TP);
}
}
|
Хорошего дня!