B0Bka / box

0 stars 0 forks source link

перерахунок цін в ініті #21

Open B0Bka opened 7 years ago

B0Bka commented 7 years ago

`EventManager::getInstance()->addEventHandler( 'catalog', 'OnPriceUpdate', "onUpdatePrice" ); EventManager::getInstance()->addEventHandler( 'catalog', 'OnProductSetUpdate', "onSetUpdate" ); EventManager::getInstance()->addEventHandler( 'catalog', 'OnProductSetAdd', "onSetUpdate" ); function onUpdatePrice($arg1, $arg2 = false) { $ELEMENT_ID = false; $IBLOCK_ID = false; $OFFERS_IBLOCK_ID = false; $PRICE_TYPE_ID = 1; \CModule::IncludeModule("catalog"); //Check for catalog event

if(is_array($arg2) && $arg2["PRODUCT_ID"] > 0)
{
    //Get iblock element
    $rsPriceElement = \CIBlockElement::GetList(
        array(),
        array(
            "ID" => $arg2["PRODUCT_ID"],
        ),
        false,
        false,
        array("ID", "IBLOCK_ID")
    );
    if($arPriceElement = $rsPriceElement->Fetch())
    {
        $arCatalog = \CCatalog::GetByID($arPriceElement["IBLOCK_ID"]);
        if(is_array($arCatalog))
        {
            //Check if it is offers iblock
            if($arCatalog["OFFERS"] == "Y")
            {
                //Find product element
                $rsElement = \CIBlockElement::GetProperty(
                    $arPriceElement["IBLOCK_ID"],
                    $arPriceElement["ID"],
                    "sort",
                    "asc",
                    array("ID" => $arCatalog["SKU_PROPERTY_ID"])
                );
                $arElement = $rsElement->Fetch();
                if($arElement && $arElement["VALUE"] > 0)
                {
                    $ELEMENT_ID = $arElement["VALUE"];
                    $IBLOCK_ID = $arCatalog["PRODUCT_IBLOCK_ID"];
                    $OFFERS_IBLOCK_ID = $arCatalog["IBLOCK_ID"];
                    $OFFERS_PROPERTY_ID = $arCatalog["SKU_PROPERTY_ID"];
                }
            }
            //or iblock wich has offers
            elseif($arCatalog["OFFERS_IBLOCK_ID"] > 0)
            {
                $ELEMENT_ID = $arPriceElement["ID"];
                $IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
                $OFFERS_IBLOCK_ID = $arCatalog["OFFERS_IBLOCK_ID"];
                $OFFERS_PROPERTY_ID = $arCatalog["OFFERS_PROPERTY_ID"];
            }
            //or it's regular catalog
            else
            {
                $ELEMENT_ID = $arPriceElement["ID"];
                $IBLOCK_ID = $arPriceElement["IBLOCK_ID"];
                $OFFERS_IBLOCK_ID = false;
                $OFFERS_PROPERTY_ID = false;
            }
        }
    }
}
//Check for iblock event
elseif(is_array($arg1) && $arg1["ID"] > 0 && $arg1["IBLOCK_ID"] > 0)
{
    //Check if iblock has offers
    $arOffers = \CIBlockPriceTools::GetOffersIBlock($arg1["IBLOCK_ID"]);
    if(is_array($arOffers))
    {
        $ELEMENT_ID = $arg1["ID"];
        $IBLOCK_ID = $arg1["IBLOCK_ID"];
        $OFFERS_IBLOCK_ID = $arOffers["OFFERS_IBLOCK_ID"];
        $OFFERS_PROPERTY_ID = $arOffers["OFFERS_PROPERTY_ID"];
    }
}

if($ELEMENT_ID)
{
    if(CCatalogProductSet::isProductHaveSet($ELEMENT_ID)) return false;

    $arSelect = Array("OWNER_ID", "ID");
    $arFilter = Array("ITEM_ID"=>$ELEMENT_ID);
    $res = CCatalogProductSet::GetList(Array("SORT" => "ASC"), $arFilter, false, Array("nPageSize"=>500), $arSelect);
    while($ob = $res->GetNext())
    { 
        if(!in_array($ob['OWNER_ID'], $arSet)) $arSet[] = $ob['OWNER_ID'];
    }
    if(count($arSet) > 0)
    {
        foreach($arSet as $setId)
        {
            $arSetItems = CCatalogProductSet::getAllSetsByProduct($setId, CCatalogProductSet::TYPE_GROUP);
            $arComplectItems = CCatalogProductSet::getAllSetsByProduct($setId, CCatalogProductSet::TYPE_SET);
            $arSetItems[] = array_shift($arComplectItems);
            $sets = array_shift($arSetItems);
            if(is_array($sets))
            {
                $sum = 0;
                foreach($sets['ITEMS'] as $el)
                {
                    $arPrice = CCatalogProduct::GetOptimalPrice($el['ITEM_ID'], 1, array(2), $renewal, array(), 's1');
                    $sum += $arPrice['DISCOUNT_PRICE'];
                }
                $arFields = Array(
                    "PRODUCT_ID" => $setId,
                    "CATALOG_GROUP_ID" => $PRICE_TYPE_ID,
                    "PRICE" => $sum,
                    "CURRENCY" => "UAH",
                );
                $res = CPrice::GetList(
                        array(),
                        array(
                                "PRODUCT_ID" => $setId,
                                "CATALOG_GROUP_ID" => $PRICE_TYPE_ID
                            )
                    );

                if ($arr = $res->Fetch())
                {
                    CPrice::Update($arr["ID"], $arFields);
                }
            }
        }
    }
}

}

function onSetUpdate($id, $arFields) { $PRICE_TYPE_ID = 1; $set = CCatalogProductSet::getSetByID($id); $setId = $set['OWNER_ID']; foreach($set['ITEMS'] as $el) { $arPrice = CCatalogProduct::GetOptimalPrice($el['ITEM_ID'], 1, array(2), $renewal, array(), 's1'); $sum += $arPrice['DISCOUNT_PRICE']; } $arFields = Array( "PRODUCT_ID" => $setId, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID, "PRICE" => $sum, "CURRENCY" => "UAH", ); $res = CPrice::GetList( array(), array( "PRODUCT_ID" => $setId, "CATALOG_GROUP_ID" => $PRICE_TYPE_ID ) );

if ($arr = $res->Fetch())
{
    CPrice::Update($arr["ID"], $arFields);
}

}`