Доброго времени суток!
Нужно реализовать скидки 1+1=3 в интернете нашел решение и переработал под себя
init.php
вот не могу разобраться как сделать обновление корзины, она обновляется только с опозданием в 1 действие, такое чувство что происходит действие с корзиной потом применяется мое событие
Нужно реализовать скидки 1+1=3 в интернете нашел решение и переработал под себя
init.php
Код |
---|
AddEventHandler("sale", "OnBasketUpdate", "OnBasketUpdateHandler"); function OnBasketUpdateHandler($ID, $arItem){ global $USER; if(!is_object($USER)){ $USER = new CUser(); } $userId=$USER->GetID(); $strGroups = $USER->GetUserGroupString(); $arUserGroups = explode(',', $strGroups); $tovari_iskluchenia=[971664,972943,971471,972795,971968]; $gruppi_tovarov_akcii=[2704,2705,2706,2707,2708]; $ids_tovarov_akcii=[]; $schetchik=0; $arFilter = Array("IBLOCK_ID"=>17,"IBLOCK_SECTION_ID"=>$gruppi_tovarov_akcii); $spisok_tov_akcii = \CIBlockElement::GetList(Array("SORT"=>"ASC"), $arFilter, false,false,array('ID')); if ($spisok_tov_akcii->SelectedRowsCount() > 0) { while ($item = $spisok_tov_akcii->GetNext()) { $ids_tovarov_akcii[$schetchik]=$item['ID']; $schetchik++; } } $productID = $arItem['PRODUCT_ID']; $quantity = $arItem['QUANTITY']; if ($userId=="3580" ){ \Bitrix\Main\Loader::IncludeModule('iblock'); \Bitrix\Main\Loader::IncludeModule('catalog'); \Bitrix\Main\Loader::IncludeModule('sale'); $fuser=\Bitrix\Sale\Fuser::getId(); $basket = \Bitrix\Sale\Basket::loadItemsForFUser( $fuser, \Bitrix\Main\Context::getCurrent()->getSite() ); $res=[]; $tovar=[]; foreach ($basket as $basketItem) { if(!$basketItem->isDelay()){ $tov_id=$basketItem->getProductId(); $raschet=''; if (!in_array($tov_id,$tovari_iskluchenia,false)) { if (in_array($tov_id,$ids_tovarov_akcii,false)) {$raschet='raschet'; }; }; $basketPropertyCollection = $basketItem->getPropertyCollection(); $res[]=[$tov_id,$basketItem->getPrice(), $basketItem->getQuantity(), $basketItem->getFinalPrice(), '', 'raschet']; $tovar[]=$tov_id; } } $coli=[]; $coli0=[]; foreach($res as $vl){ if($vl[5]=='raschet'){ $schetchik=1; for ($x=1; $x<=$vl[2]; $x++){ if ($schetchik==3) { $coli[]=[$vl[0],0,$vl[5]]; $schetchik=1; } else{ $coli[]=[$vl[0],$vl[1],$vl[5]]; $schetchik++; } } }else{ $coli0[]=[$vl[0],$vl[1],$vl[5]]; } } $coli = array_reverse($coli)+$coli0; $arFilter = Array("IBLOCK_ID"=>17,"ID"=>$tovar); $res = \CIBlockElement::GetList(Array("SORT"=>"ASC"), $arFilter, false,false,array('ID',"PROPERTY_CML2_BAR_CODE",'CATALOG_QUANTITY','PROPERTY_CML2_LINK','IBLOCK_EXTERNAL_ID','XML_ID')); $productsId=[]; $productsIdXml=[]; $productsIdXml2=[]; while($ar_fields = $res->GetNext()) { $productsId[$ar_fields["PROPERTY_CML2_BAR_CODE_VALUE"]]=$ar_fields['ID']; $productsIdXml[$ar_fields["PROPERTY_CML2_BAR_CODE_VALUE"]]=['IBLOCK_EXTERNAL_ID'=>$ar_fields['IBLOCK_EXTERNAL_ID'],'XML_ID'=>$ar_fields['XML_ID']]; $productsIdXml2[$ar_fields["ID"]]=['IBLOCK_EXTERNAL_ID'=>$ar_fields['IBLOCK_EXTERNAL_ID'],'XML_ID'=>$ar_fields['XML_ID']]; } $itogTovar=[]; foreach($coli as $val){ $itogTovar[$val[0]][$val[1]]++; } $itogo=[]; foreach($itogTovar as $productID0=>$value){ $itogo[$productID0]['price']=0; $itogo[$productID0]['quantity']=0; $itogo[$productID0]['custom']='N'; foreach($value as $price0=>$qunt0){ if($price0>0){ $ar_res = CPrice::GetBasePrice($productID0, false, false); $arPrice0=$ar_res['PRICE']; $itogo[$productID0]['price']=$itogo[$productID0]['price']+$arPrice0*$qunt0; $itogo[$productID0]['quantity']=$itogo[$productID0]['quantity']+$qunt0; }else{ $itogo[$productID0]['quantity']=$itogo[$productID0]['quantity']+$qunt0; $itogo[$productID0]['custom']='Y'; } } $itogo[$productID0]['price']=ceil($itogo[$productID0]['price']/$itogo[$productID0]['quantity']); } foreach ($basket as $basketItem) { $id=$basketItem->getField('PRODUCT_ID'); if($itogo[$id]['custom']=='Y'){ $basketItem->setFields(array( 'CUSTOM_PRICE' => 'Y', 'PRICE' => $itogo[$id]['price'], 'CATALOG_XML_ID'=>$productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'], 'PRODUCT_XML_ID'=>$productsIdXml2[$id]['XML_ID'] )); $basketItem->save(); $basketPropertyCollection = $basketItem->getPropertyCollection(); $basketPropertyCollection->setProperty(array( 'ACTION'=>array( 'NAME' => 'Акция', 'CODE' => 'ACTION', 'VALUE' => 'Товар по акции 2=3', 'SORT' => 100, ), 'CATALOG_XML_ID'=>array( 'NAME' => 'Catalog XML_ID', 'CODE' => 'CATALOG.XML_ID', 'VALUE' => $productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'] ), 'PRODUCT_XML_ID'=>array( "NAME" => "Product XML_ID", "CODE" => "PRODUCT.XML_ID", "VALUE" => $productsIdXml2[$id]['XML_ID'] ) )); $basketPropertyCollection->save(); }else{ $basketItem->setFields(array( 'CUSTOM_PRICE' => 'N', 'PRICE' => $itogo[$id]['price'], 'CATALOG_XML_ID'=>$productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'], 'PRODUCT_XML_ID'=>$productsIdXml2[$id]['XML_ID'] )); $basketItem->save(); $basketPropertyCollection = $basketItem->getPropertyCollection(); $basketPropertyCollection->setProperty(array( 'CATALOG_XML_ID'=>array( 'NAME' => 'Catalog XML_ID', 'CODE' => 'CATALOG.XML_ID', 'VALUE' => $productsIdXml2[$id]['IBLOCK_EXTERNAL_ID'] ), 'PRODUCT_XML_ID'=>array( "NAME" => "Product XML_ID", "CODE" => "PRODUCT.XML_ID", "VALUE" => $productsIdXml2[$id]['XML_ID'] ) )); $basketPropertyCollection->save(); } } } } |
вот не могу разобраться как сделать обновление корзины, она обновляется только с опозданием в 1 действие, такое чувство что происходит действие с корзиной потом применяется мое событие