Разработка на 1С-Битрикс Михаил Базаров

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

Вопросы и ответы по 1С-Битрикс, разборы реальных задач и обсуждение заметок блога. Задайте вопрос или помогите другим — все сообщения проходят модерацию.

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

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

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

Задача. Если в корзину добавлены товары со свойством "'Это генератор купона" (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/
Добрый день, благодарю за рабочий код, все четко! Но есть момент.
На странице оформления заказа 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 вызывается перед выполнением шаблона, должен на первом же хите сработать.
Как-то, даже предположить не могу что именно у вас не так.
Форма ответов
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Загрузить файлы
 
Реклама

Место для вашей рекламы

10 000 ₽ в месяц

Единый баннер, который показывается сквозным образом — сразу на всём форуме и во всех заметках блога. Одно размещение — вся аудитория.

Посмотреть, где будет выводиться: форум заметки блога

Блог-note

Заметки по 1С-Битрикс