Модуль обмена не умеет выгружать такие цены, но умеет выгружать несколько типов цен
Задача:
из нескольких типов цен заполнять расширенный
у меня 3 типа цены выгружается из 1С
- для 1-2шт (id типа цены на сайте 4)
- для 3-9шт (id типа цены на сайте 2)
- для 10 и более (id типа цены на сайте 3)
1. на сайте завести 4 цены (3 выгружаются, 1 заполняется и по енй работает каталог на сайте)
2. включить поддержку старых событий в модуле Каталог
3. в init.php обработчики
перед добавлением, и изменением цены
AddEventHandler("catalog", "OnBeforePriceUpdate", "MyOnBeforePriceUpdate"); function MyOnBeforePriceUpdate($id,&$arFields){ if(empty($arFields["QUANTITY_FROM"])){ $arFields["QUANTITY_FROM"] = 1; $arFields["QUANTITY_TO"] = 2; } } AddEventHandler("catalog", "OnBeforePriceAdd", "MyOnBeforePriceAdd"); function MyOnBeforePriceAdd(&$arFields){ if(empty($arFields["QUANTITY_FROM"])){ $arFields["QUANTITY_FROM"] = 1; $arFields["QUANTITY_TO"] = 2; } } |
AddEventHandler("catalog", "OnPriceAdd", "MyOnPriceAdd"); function MyOnPriceAdd($id,$arFields){ if(($arFields["CATALOG_GROUP_ID"]!=1) && CModule::IncludeModule('catalog')) { if($arFields["QUANTITY_FROM"]==1){ RecalculateBasePrice($arFields["PRODUCT_ID"]); 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); 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)&&($arFields["CATALOG_GROUP_ID"]!=1)){ RecalculateBasePrice($arFields["PRODUCT_ID"]); } } |
function RecalculateBasePrice($productId){ $return = false; if(($productId > 0) && CModule::IncludeModule('catalog')){ //получим ВСЕ цены продукта $dbProductPrice = CPrice::GetListEx( array(), array("PRODUCT_ID" => $productId), 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])){ //когда все 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; //если хотя бы одна цена с 1С заполнена, то базовая не удаляется } |
AddEventHandler("catalog", "OnBeforePriceDelete", "MyOnBeforePriceDelete"); function MyOnBeforePriceDelete($ID) { $arPrice = CPrice::GetByID($ID); if (($arPrice["CATALOG_GROUP_ID"] == 1) && (RecalculateBasePrice($arPrice["PRODUCT_ID"]))){ return false; } } |