Удалить товары из корзины, если есть определенные товары.

RSS
Удалить товары из корзины, если есть определенные товары.
 
Удалить товары из корзины, если есть определенные товары.

Задача: если в корзину добавлены товары с определенным свойством, нужно удалить из корзины, все другие товары- предупредив пользователя.
 
Улучшение

Что бы не удалялись товары при обновлении формы заказа, если в ней нет нужных товаров.
Плюс, не обязательно делать свойство добавляемым в корзину, делаем простой проход по элементам инфоблока.

Задача. Если в корзину добавлены товары со свойством "'Это генератор купона" (ETO_GENERATOR_KUPONA), надо удалить все другие товары из корзины.
Код
foreach ($arResult['BASKET_ITEMS'] as $basketItem) {
    $res = CIBlockElement::GetList(
        array(),
        array('ID' => $basketItem['PRODUCT_ID']),
        false,
        false,
        array('PROPERTY_ETO_GENERATOR_KUPONA')
    );
    while ($ob = $res->GetNext()) {
        if ($ob['PROPERTY_ETO_GENERATOR_KUPONA_VALUE']) {
            $arCuponsGoods[] = $basketItem['ID'];
        } else {
            $arNotCuponsGoods[] = $basketItem['ID'];
        }
    }
}

if (count($arCuponsGoods) > 0) {
    foreach ($arNotCuponsGoods as $value) {
        if (!in_array($value, $arCuponsGoods)) {
            $arrForDelItems[] = $value;
        }
    }
}

if(count($arrForDelItems) > 0) {
    foreach ($arrForDelItems as $del) {
        CSaleBasket::Delete($del);
    }
}

Пояснение:
- Создаем два массива, с товарами которые купоны и товарми которые не купоны ($arCuponsGoods и $arNotCuponsGoods)
- Если $arCuponsGoods не пустой, то создаем новый массив ($arrForDelItems) со списком кандидатов на удаление.
- Если $arrForDelItems не пустой, запускаем foreach с удалением записи корзины  CSaleBasket::Delete($del);.

Как генерировать скидочные купоны по информации заказа, можно посмотреть тут https://camouf.ru/blog-note/13295/
Изменено: Михаил Базаров - 12.08.2022 16:56:49
 
Добрый день, благодарю за рабочий код, все четко! Но есть момент.
На странице оформления заказа result_modifier и удаление товаров не отрабатывает при первой загрузке страницы. Если страницу перезагрузить, тогда отработает.

Пробовала и предложенный вариант удаления данных:
if(count($arrForDelItems) > 0) {
   foreach ($arrForDelItems as $del) {
       CSaleBasket::Delete($del);
   }
}

и новый на D7, когда мы получаем корзину, удаляем данные, сохраняем
$basket = Sale\Basket::loadItemsForFUser(Sale\Fuser::getId(), SITE_ID);
$orderBasket = $basket->getBasketItems();
..
if(count($arrForDelItems) > 0) {
foreach($orderBasket as $basketItem) {
     $id=$basketItem->getField('ID');
     if(in_array($id,$arrForDelItems)) {      
       $basketItem->delete();  
     }
 }
}
$basket->save();
$basket->refreshData();

результат одинаковый.
В чем может быть ошибка и куда смотреть? Спасибо
 
Затруднительно сказать. result_modifier вызывается перед выполнением шаблона, должен на первом же хите сработать.
Как-то, даже предположить не могу что именно у вас не так.
Изменено: Михаил Базаров - 22.02.2023 16:41:25
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Файл
Загрузить файлы
 
Поблагодарить и поддержать:
Или подписаться на boosty канал: Видео на Ютубе