Доброго времени суток!
Нужно реализовать скидки 1+1=3 в интернете нашел решение и переработал под себя
init.php
[CODE]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();
}
}
}
}[/CODE]
вот не могу разобраться как сделать обновление корзины, она обновляется только с опозданием в 1 действие, такое чувство что происходит действие с корзиной потом применяется мое событие
Нужно реализовать скидки 1+1=3 в интернете нашел решение и переработал под себя
init.php
[CODE]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();
}
}
}
}[/CODE]
вот не могу разобраться как сделать обновление корзины, она обновляется только с опозданием в 1 действие, такое чувство что происходит действие с корзиной потом применяется мое событие