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;
}