• Разная скидка на доставку для авторизованных и не авторизованных Bitrix?

    @tgarl
    Никак.
    Потому как: вопрос, каким образом можно создать заказ не авторизованным пользователям? Заказ всегда привязан к какому-то пользователю. А раз есть пользователь, значит он зарегистрирован.
    Даже если отмечена опция регистрировать пользователя при создании заказа, после происходит пересчет всех скидок и сработает опять правило, что пользователь зарегистрирован.
    Ответ написан
  • Как правильно сформировать таблицу с размерами и цветами?

    @tgarl
    Судя по всему у вас не корректно цикл сформирован.
    вы сначала получили сетку размеров, тут наверное я бы то же по этому пути пошел,
    а затем по каждому ТП отмечаете строчку.
    вам же нужно сформировать массив наподобие
    'цветной'=>[44,46,48,50]
    'не цветной'=[свои размеры]

    и вот по нему уже заполнять таблицу
    Ответ написан
  • Как отфильтровать ассоциативный массив?

    @tgarl
    Сразу в фильтр не пробовали добавить?
    $my_elements = CIBlockElement::GetList (
          Array("ID" => "ASC"),
          Array("IBLOCK_ID" => $iblock_id, 'PROPERTY_SHOW'=>'Y'),
          false,
          false,
          Array('ID', 'NAME',  'PROPERTY_PRICE', 'DETAIL_PAGE_URL')
        );
    Ответ написан
    Комментировать
  • Можно ли в оформление заказа отдавать более 1го Email?

    @tgarl
    Заведите дополнительное свойство заказа. А на событии отправки писем добавьте проверку на заполненность этого дополнительного свойства и если заполнено, то содержимое в поле копия прописывайте.
    Ответ написан
    Комментировать
  • Почему битра отвечает "200 OK" на несуществующие в url-е section_code?

    @tgarl
    Потому что по умолчанию проверяется не весь путь, а только та часть которая отвечает за вывод или раздела или товара.
    В последних версиях настроек компонента есть галочка проверять весь путь(не помню как точно она обзывается) включите ее, тогда будет проверяться именно весь путь. Если такого нет, то придется вам самому делать такую проверку. Просто ЧПУ это правило подмены гет запроса вида 'RULE' => 'SECTION_CODE=$1&ELEMENT_CODE=$2',
    когда загружается раздел проверяется только SECTION_CODE=$1, когда товар только ELEMENT_CODE=$2 - одним словом это древняя тема которая тянется с первых версий существования битрикса.
    Ответ написан
    2 комментария
  • Как создать скидку 10% в корзине только на товары добавленных линий более 2 штух?

    @tgarl Автор вопроса
    Решил.
    1. Есть событие на действия и условия. Нужно различать когда когда и какое использовать(это была моя главная ошибка)
    2. в моем случае нужно использовать OnCondSaleActionsControlBuildList, а не OnCondSaleControlBuildList
    3. само решение:

    public static function Generate($arConditions, $arParams, $control, $subs = false)
        {
    
            $resultValues = array();
            $arValues = false;
    
            if (is_string($arControl))
            {
                $arControl = static::GetControls($arControl);
            }
            $boolError = !is_array($arControl);
    
            if (!$boolError)
            {
                $arValues = static::Check($arOneCondition, $arOneCondition, $arControl, false);
                $boolError = (false === $arValues);
            }
    
    
            if($arOneCondition['logic']=='Equal')
            {
                $logic='true';
            }
            else
            {
                $logic='false';
            }
    $strResult  = '(SaleActionDeactivateDiscount::qDiscAction('.$arParams['BASKET_ROW'].','.$arConditions['value'].'))=='.$logic;
            return  $strResult;
    
        }
     public static function qDiscAction($row,$arCond)
        {
    //пришлось использовать \Bitrix\Sale\Basket::loadItemsForFUser, т.к. кроме $arParams['BASKET_ROW'] другие параметры по какой-то причине пустые и при попытке их передать в свою функцию напрочь ломают скидки
    		$basket = \Bitrix\Sale\Basket::loadItemsForFUser(\Bitrix\Sale\Fuser::getId(), 's1');
    		$linia=[];
    		foreach ($basket as $basketItem) {
    			$mxResult = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
    			$dbEl = \CIBlockElement::GetList(array('sort' => 'asc'), array('ID' => $mxResult), false, false, Array('ID','PROPERTY___2'));
    			while($obEl = $dbEl->Fetch())	
    			{
    				$linia[$obEl['PROPERTY___2_VALUE']]['ID'][]=$basketItem->getProductId();
    				$linia[$obEl['PROPERTY___2_VALUE']]['CNT']+=$basketItem->getQuantity();
    			}			
    		}
    		
    		foreach($linia as $ln=>$massa){
    			if($massa['CNT']>=$arCond && in_array($row['PRODUCT_ID'],$massa['ID'])){
    				return false;
    			}
    		}
    		
           return true;
        }
    Ответ написан
  • Как пересчитать заказ с учетом всех скидок с использованием события OnSaleOrderSaved?

    @tgarl Автор вопроса
    Я был не прав что отказался от before. Нужно все же на событии до сохранения. Но беда остается, что нет пересчета окончательной цены с учетом скидок на доставку. По логике пересчет должен производится сам, но этого не происходит. Заказ по своей цене, доставка по своей.
    Ответ написан
    Комментировать
  • Как для getlist получить все элементы кроме + исключая?

    @tgarl Автор вопроса
    я нашел причину, ошибка написании фильтра - лишняя вложенность в массив
    правильный вариант:

    $GLOBALS[$arParams['FILTER_NAME']][]=[
            "LOGIC"=>"OR",
            
                ['PROPERTY_195'=>[1747], 'PROPERTY_362'=>[1753,1754]], //элементы принадлежат сетям, но относятся к бренду
                ['!PROPERTY_362'=>[1753,1754]], // или все элементы не принадлежащие сетям
         
        ];
    Ответ написан
    Комментировать
  • Как изменить состав отгрузки в заказе?

    @tgarl
    Понимаю что тема старая, но в итоге какое решение?
    //собираем id которые нужно снести с корзины
    foreach ($basket as $basketItem) {  
    $zapjmnimID[] = $basketItem->getField('ID');  
    }
    //добавляем новый товар
    $item = $basket->createItem('catalog', $obEl['ID']); //создаём новый товар в корзине
    $item->setFields(array(
       'QUANTITY' => 1,
       'CURRENCY' => \Bitrix\Currency\CurrencyManager::getBaseCurrency(),
       'LID' => 's1',
       'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
       "CATALOG_XML_ID" => $obEl['IBLOCK_EXTERNAL_ID'],
       "PRODUCT_XML_ID" => $obEl['XML_ID'],
       'CUSTOM_PRICE'=>'Y',
       'PRICE' => $PlProductInfo['PRICE'],
       'NAME'=>$arParams['NAME']['VALUE']
    ));
       
    $item->getPropertyCollection()->setProperty($arParams);
    
    //удаляем не нужные товары
    foreach($zapjmnimID as $delitem){
       $basket->getItemById($delitem)->delete();
    }
    //сохраняем корзину
    $basket->save();
    
    //отгрузка, доставка
    $shipmentCollection = $order->getShipmentCollection();
    удаляем текущую отгрузку
    foreach ($shipmentCollection as $shipment) {
      $shipment->delete();
    }
    //добавляем доставку под другой тип               
    $shipment = $shipmentCollection->createItem();
    $service = \Bitrix\Sale\Delivery\Services\Manager::getById(15);
    $shipment->setFields(array(
       'DELIVERY_ID' => $service['ID'],
       'DELIVERY_NAME' => $service['NAME'],
    ));
    $shipmentItemCollection = $shipment->getShipmentItemCollection();
    //добавляем товары в отгрузку
    foreach ($basket as $basketItem)
    {
       $item = $shipmentItemCollection->createItem($basketItem);
       $item->setQuantity($basketItem->getQuantity());
    }
    //сохраняем заказ
    $result = $order->save();


    вот мой код, но отгрузка пустая и не могу понять в чем именно проблема
    Ответ написан
    Комментировать
  • Узнать купоны введенные пользователем в Bitrix?

    @tgarl
    Я список купонов перед заказом получаю так:
    $basket  = \Bitrix\Sale\Basket::loadItemsForFUser(
       \CSaleBasket::GetBasketUserID(),
        "s1" 
    );
     $order  = Bitrix\Sale\Order::create( "s1" , \Bitrix\Sale\Fuser::getId());
     $order ->setPersonTypeId( 1 );
     $order ->setBasket( $basket );
     $discounts  =  $order ->getDiscount();
     $res  =  $discounts ->getApplyResult();
     foreach($res['COUPON_LIST'] as $cupo_n=>$ar_r){
    ...
    тут проводим манипуляцую с купоном
    ...
    }

    Примерно как нужно я показал, дальше отталкивайтесь от своей задачи.
    Ответ написан
    4 комментария
  • Как сделать акцию в битриксе 3 товара по цене 2?

    @tgarl Автор вопроса
    Приведу итоговое решение для того кто будет искать.
    Некоторые вещи нужно будеть немного адаптировать, но в целом вот решение:
    public static function OnBasketUpdateHandler($ID, $arItem)
        {
            global $USER;
    	if(!is_object($USER)){
    		$USER = new CUser();
    	}
    	$userId=$USER->GetID();
    	$strGroups = $USER->GetUserGroupString();
    	$arUserGroups = explode(',', $strGroups); 
    
    
        $productID = $arItem['PRODUCT_ID'];
        $quantity = $arItem['QUANTITY'];
    
    		
    	if ($userId=="81035" ){//Пока выводим только для меня
    		\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()){
    				$mxResult=[];
    				$aa = \CCatalogSku::GetProductInfo($basketItem->getProductId())['ID'];
    				$mxResult[$aa] = $aa;
    				\CIBlockElement::GetPropertyValuesArray($mxResult, 26, array(
    					'ID' => $mxResult,
    					'IBLOCK_ID' => 26,
    				));
    				$raschet='';
    				if(in_array($mxResult[$aa]['ROZNICHNAYA_SET']['VALUE_ENUM_ID'], [1753,1754]) && $mxResult[$aa]['RASPRODAZHA']['VALUE']=='true'){$raschet='raschet';}
    								
    				$basketPropertyCollection = $basketItem->getPropertyCollection(); 				
    				$res[]=[$basketItem->getProductId(),$basketItem->getPrice(), $basketItem->getQuantity(), $basketItem->getFinalPrice(), $basketPropertyCollection->getPropertyValues()['BAR_CODE']['VALUE'], $raschet];
    				$tovar[]=$basketPropertyCollection->getPropertyValues()['BAR_CODE']['VALUE'];
    					
    			}
    		}
    		
    		$coli=[];
    		$coli0=[];
    		foreach($res as $vl){
    			if($vl[5]=='raschet'){
    			for ($x=1; $x<=$vl[2]; $x++){
    				$coli[]=[$vl[0],$vl[1],$vl[5]];
    			}
    			}else{
    				$coli0[]=[$vl[0],$vl[1],$vl[5]];
    			}
    		}
    		$cont=count($coli);
    		usort($coli, function($a, $b){
    			return $a['1'] <=> $b['1'];
    		});
    		$skidka = floor($cont / 3);
    		for ($x=0; $x<$skidka; $x++){
    			$coli[$x][1]=0;
    		}
    		$coli = array_reverse($coli)+$coli0;
    		$arFilter = Array( "IBLOCK_ID"=>27, "PROPERTY_CML2_BAR_CODE"=>$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=[];
    		
    		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){
    					$arPrice0 = \bh\catalog\tools::getPrc($productID0);
    					$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']=floor($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' => 1000,
    					),
    					'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(
    						'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();
    			}
    		}
    		
    	}
    		
        }
    Ответ написан
    Комментировать