Телеграм: @camouf_ru Почта: mihail@bazarow.ru

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

Просмотров: 216

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

Корзина битрикс

Для начала создадим новое свойство для товаров каталога, в моем случае называется "Покупается отдельно" с кодом "ATT_B_ONLY". Обязательно, проставляем ему галку Значение добавляется в корзину

Корзина битрикс

Выводим оповещение о удалении в корзине

Переходим в шаблон корзины (sale.basket.basket) и создаем тут файл result_modifier.php, в который добавляем следующий код:

foreach ($arResult['GRID']['ROWS'] as $basketItem) {
    foreach ($basketItem['PROPS'] as $basketItemProp) {
        if ($basketItemProp['CODE'] == 'ATT_B_ONLY') {
             $arResult['BASKET_ITEM_ONLY'][] = $basketItem['NAME'];
        }
    }
}
  • Пребрали массив с товарами корзины.
  • Внутри перебора, довыбрали свойства товаров.
  • Если обнаружен товар со свойством "ATT_B_ONLY" добавили его название в ключ массива $arResult['BASKET_ITEM_ONLY'].
Ссылку на подробную информацию можно вывести на этой же странице, что бы не перенаправлять пользователя на новую. Достаточно воспользоваться заметкой
Показ страницы сайта в боковом слайдере

В template.php, добавляем оповещение с перечислением товаров из $arResult['BASKET_ITEM_ONLY']


В вашей корзине есть товары:
<strong>
<? echo implode(', ', $arResult['BASKET_ITEM_ONLY']) ?>
</strong>
Если продолжите оформление, другие товары будут удалены из корзины.<br>
<span id="show_coopon_about_panel">
Подробнее о купонах
</span>

Удаляем определенные товары из оформления заказа

Теперь, нам нужно удалить товары, у которых нет свойства с кодом "ATT_B_ONLY", из оформления заказа.

В шаблоне оформления заказа (sale.order.ajax) открываем или создаем (если еще нет) файл result_modifier.php и добавляем в него

foreach ($arResult['BASKET_ITEMS'] as $basketItem) {
    foreach ($basketItem['PROPS'] as $basketItemProp) {
        if ($basketItemProp['CODE'] !== 'ATT_B_ONLY') {
            CSaleBasket::Delete($basketItem['ID']);
        }
    }
}

Здесь, ровно тоже самое: проходимся по товарам заказа, внутри по свойствам товара и если нет свойства с кодом "ATT_B_ONLY" удаляем товар (запись корзины) методом CSaleBasket::Delete

Можно дополнить условие, обработав товары методом CSaleBasket::Update - переложив не соответсвующие товары в отложенные корзины. Таким образом, пользователю не придется снова искать их в каталоге, сможет просто найти не попавшие в выборку товары в отложенных.

Михаил Базаров12.08.2022
Улучшение

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

Задача. Если в корзину добавлены товары со свойством "'Это генератор купона" (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/

Записная книжка разработчика

Примерно с 2013-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Если пользователь авторизован то... API Битрикс Просмотров: 20971 Достаточно часто, при создании сайта на битрикс нужно вывести в шаблон или компонент, неку... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 59032 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Настройка выгрузки товаров в Яндекс Маркет с сайта Битрикс Просмотров: 35190 Настройка выгрузки в Яндекс маркет в формате yml, выполняется достаточно просто, кроме одн... Вывести товары из того же раздела в карточке товара Просмотров: 16970 Немножко топорный, но все же вполне действенный способ по выводу внутри подробной карточки... Старые шаблоны битрикс для простой верстки Просмотров: 16062 Новые версии типового интернет-магазина, который идет в комплекте с Битрикс (от 12 версии ... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 884 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Регистрация пользователя в определенную группу сайта на Битрикс Просмотров: 20816 Достаточно часто требуется регистрировать пользователя в определенную группу, в зависимост... Установка вебсервера на Apple M1 (нативный ARM стек), оптимизированны... Просмотров: 4744 Появилась задачка, установить стек MAMP (macOS, Apache, MYSQL, PHP) на рабочий ноутбук с п... Установить остатки товара на складе из доступных остатков. Просмотров: 3660 Задача, заполнить остатки товаров, в 1С-Битрикс, из параметра "Доступное количество". Открытие мобильного приложения Apache Cordova по ссылке Просмотров: 169 Достаточно часто нужно реализовывать открытие мобильного приложения по ссылке. Например: п...