3 типа цены выгружается из 1С
- для 1-2шт (id типа цены на сайте 4)
- для 3-9шт (id типа цены на сайте 2)
- для 10 и более (id типа цены на сайте 3)
для определенных продуктов (Свойство Обработчик заполнено и равно 3)
из нескольких типов цен заполнять цену с расширенным режимом (id типа цены на сайте 1)
1. на сайте завести 4 цены (3 выгружаются, 1 заполняется и по ней работает каталог на сайте)
2. включить поддержку старых событий в модуле Каталог
3. в init.php обработчики и функции
обработчик перед добавлением и изменением цены
AddEventHandler("catalog", "OnBeforePriceUpdate", "MyOnBeforePriceUpdate"); function MyOnBeforePriceUpdate($id, &$arFields){ if (empty($arFields["QUANTITY_FROM"]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) { $arFields["QUANTITY_FROM"] = 1; $arFields["QUANTITY_TO"] = 2; } } AddEventHandler("catalog", "OnBeforePriceAdd", "MyOnBeforePriceAdd"); function MyOnBeforePriceAdd(&$arFields){ if (empty($arFields["QUANTITY_FROM"]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) { $arFields["QUANTITY_FROM"] = 1; $arFields["QUANTITY_TO"] = 2; } }
AddEventHandler("catalog", "OnPriceAdd", "MyOnPriceAdd"); function MyOnPriceAdd($id, $arFields) { if (in_array($arFields["CATALOG_GROUP_ID"],[2,3,4]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) { if ($arFields["QUANTITY_FROM"] == 1) { RecalculateBasePrice($arFields["PRODUCT_ID"]); $dbProductPrice = CPrice::GetListEx( array(), array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9, "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"]), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO") ); if ($arRes = $dbProductPrice->Fetch()) { CPrice::Update($arRes["ID"], array( "PRICE" => $arFields["PRICE"], "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"], "CURRENCY" => "RUB", "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9 )); } else { CPrice::Add(array( "PRODUCT_ID" => $arFields["PRODUCT_ID"], "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"], "PRICE" => $arFields["PRICE"], "CURRENCY" => "RUB", "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9 ), false); } $dbProductPrice = CPrice::GetListEx( array(), array("PRODUCT_ID" => $arFields["PRODUCT_ID"], "QUANTITY_FROM" => 10, "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"]), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO") ); if ($arRes = $dbProductPrice->Fetch()) { CPrice::Update($arRes["ID"], array( "PRICE" => $arFields["PRICE"], "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"], "CURRENCY" => "RUB", "QUANTITY_FROM" => 10, "QUANTITY_TO" => false )); } else { CPrice::Add(array( "PRODUCT_ID" => $arFields["PRODUCT_ID"], "CATALOG_GROUP_ID" => $arFields["CATALOG_GROUP_ID"], "PRICE" => $arFields["PRICE"], "CURRENCY" => "RUB", "QUANTITY_FROM" => 10, "QUANTITY_TO" => false ), false); } } } }
обработчик после изменения цены
AddEventHandler("catalog", "OnPriceUpdate", "MyOnPriceUpdate"); function MyOnPriceUpdate($id, $arFields) { if (isset($arFields["CATALOG_GROUP_ID"]) && ($arFields["QUANTITY_FROM"] == 1) && in_array($arFields["CATALOG_GROUP_ID"],[2,3,4]) && IsNeedRecalculate($arFields["PRODUCT_ID"])) { RecalculateBasePrice($arFields["PRODUCT_ID"]); } }
обработчик перед удалением цены
AddEventHandler("catalog", "OnBeforePriceDelete", "MyOnBeforePriceDelete"); function MyOnBeforePriceDelete($ID){ $arPrice = CPrice::GetByID($ID); if (($arPrice["CATALOG_GROUP_ID"] == 1) && IsNeedRecalculate($arPrice["PRODUCT_ID"]) && (RecalculateBasePrice($arPrice["PRODUCT_ID"]))) { return false; } }
функция - проверка товара на то, надо ли для данного товара заполнять цену с расширенным режимом
function IsNeedRecalculate($productId){ $result = false; if(!empty($productId) && CModule::IncludeModule('iblock')){ $dbItems = \Bitrix\Iblock\Elements\ElementAbsenceTable::getList([ 'filter' => [ "ID" => $productId, "OBRABOTCHIK.VALUE"=>3 ], 'select' => ['ID'], 'cache' => ["ttl" => 360000] ]); if($arItem = $dbItems->fetch()){ $result = true; } } return $result; }
функция - пересчет цен
function RecalculateBasePrice($productId) { $return = false; if (($productId > 0) && CModule::IncludeModule('catalog')) { //получим ВСЕ цены продукта $dbProductPrice = CPrice::GetListEx( array(), array("PRODUCT_ID" => $productId,"CATALOG_GROUP_ID"=>[1,2,3,4]), false, false, array("ID", "CATALOG_GROUP_ID", "PRICE", "QUANTITY_FROM", "QUANTITY_TO") //array() ); $arPrices = array(); $arPrices1 = array(); $arBasePrices = array(); $arBasePrices1 = array(); while ($arRes = $dbProductPrice->Fetch()) { if ($arRes["CATALOG_GROUP_ID"] == 1) { $arBasePrices[$arRes["ID"]] = $arRes; $arBasePrices1[$arRes["QUANTITY_FROM"]] = $arRes["PRICE"]; } elseif ($arRes["QUANTITY_FROM"] == 1) { $arPrices[$arRes["CATALOG_GROUP_ID"]] = $arRes["PRICE"]; $arPrices1[$arRes["CATALOG_GROUP_ID"]] = $arRes; } } $return = isset($arPrices[4]) || isset($arPrices[2]) || isset($arPrices[3]); if (isset($arPrices[4]) && isset($arPrices[2]) && isset($arPrices[3])) { //если раньше делать, то хня творится, да и экономия по ресурсам $price = $arPrices[4]; //Обмен с сайтом (1) от 1 до 2 шт $b = false; foreach ($arBasePrices as $id => $arBasePrice) { if ($arBasePrice["QUANTITY_FROM"] == 1) { if ($arBasePrice["PRICE"] != $price) { CPrice::Update($id, array( "PRICE" => $price, "CATALOG_GROUP_ID" => 1, "CURRENCY" => "RUB", "QUANTITY_FROM" => 1, "QUANTITY_TO" => 2 )); } $b = true; break; } } if (!$b) { CPrice::Add(array( "PRODUCT_ID" => $productId, "CATALOG_GROUP_ID" => 1, "PRICE" => $price, "CURRENCY" => "RUB", "QUANTITY_FROM" => 1, "QUANTITY_TO" => 2 ), false); } $price = $arPrices[2]; //обмен с сайтом (3) от 3 до 9шт $b = false; foreach ($arBasePrices as $id => $arBasePrice) { if ($arBasePrice["QUANTITY_FROM"] == 3) { if ($arBasePrice["PRICE"] != $price) { CPrice::Update($id, array( "PRICE" => $price, "CATALOG_GROUP_ID" => 1, "CURRENCY" => "RUB", "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9 )); } $b = true; break; } } if (!$b) { CPrice::Add(array( "PRODUCT_ID" => $productId, "CATALOG_GROUP_ID" => 1, "PRICE" => $price, "CURRENCY" => "RUB", "QUANTITY_FROM" => 3, "QUANTITY_TO" => 9 ), false); } $price = $arPrices[3]; //обмен с сайтом (10) от 10 и более $b = false; foreach ($arBasePrices as $id => $arBasePrice) { if ($arBasePrice["QUANTITY_FROM"] == 10) { if ($arBasePrice["PRICE"] != $price) { CPrice::Update($id, array( "PRICE" => $price, "CATALOG_GROUP_ID" => 1, "CURRENCY" => "RUB", "QUANTITY_FROM" => 10, "QUANTITY_TO" => null )); } $b = true; break; } } if (!$b) { CPrice::Add(array( "PRODUCT_ID" => $productId, "CATALOG_GROUP_ID" => 1, "PRICE" => $price, "CURRENCY" => "RUB", "QUANTITY_FROM" => 10, "QUANTITY_TO" => null ), false); } } } return $return; }