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

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

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

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

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

Для начала создадим новое свойство для товаров каталога, в моем случае называется "Покупается отдельно" с кодом "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-го года пишу заметки по разработке сайтов на Битрикс.
Вы можете задавать уточняющие вопросы в комментариях- отвечаю или дополняю заметки по возможности.

Валидация пароля и подтверждения при регистрации в битрикс Просмотров: 14266 Встала задачка сделать валидацию пароля и его подтверждения в стандартной форме регистраци... Регистрация пользователя в определенную группу сайта на Битрикс Просмотров: 22096 Достаточно часто требуется регистрировать пользователя в определенную группу, в зависимост... Вывести минимальную и максимальную цену в разделе каталога Битрикс. Просмотров: 2161 Что бы вывести минимальную и максимальную стоимость товаров, из каталога 1С-Битрикс, доста... Фиксированная корзина с обновлением, без перезагрузки страницы. Просмотров: 17499 Иногда нужно сделать так, чтобы корзина в интернет магазине, созданном на Битрикс, была по... Установить остатки товара на складе из доступных остатков. Просмотров: 4892 Задача, заполнить остатки товаров, в 1С-Битрикс, из параметра "Доступное количество". Дополнительные картинки в новостях Битрикс, почти фотогалерея. Просмотров: 48049 Частенько стоит задача, по мимо стандартных "Картинка для анонса" и "Деталь... Вывести артикул в печатную форму бланка заказа Просмотров: 386 Задача: в печатную форму бланка заказа добавить артикулы товаров и данные о пользователе. ... Многосайтовость битрикс на разных доменах и поддоменах Просмотров: 61274 Часто спрашивают "как настроить многосайтовость Битрикс на разных доменах", решил записать... Если папка то применяем...в Битрикс Просмотров: 29223 Бывает, стоит задача применить какой-либо стиль или вывести конкретный кусочек кода для ди... Определить местоположение пользователя и показать магазины поблизости... Просмотров: 1168 Задача: в мобильном приложении, которое открывает сайт на 1С-Битрикс внутри себя, нужно оп... Вывести новости из конкретного раздела инфоблока Битрикс Просмотров: 53464 Бывает что требуется вывести конкретные новости или статьи из одного раздела инфоблока в Б... Создание раздела инфоблока при регистрации пользователя в Битрикс Просмотров: 7913 Например вам нужно выводить информацию исключительно для определенного пользователя. Само ... Получить и вывести пользовательские свойства склада в 1С-Битрикс Просмотров: 1322 Задача: вывести пользовательские свойства в подробном описании склада. При этом, есть и мн... Отфильтровать новости в Битрикс за заданный период Просмотров: 15592 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Базовая защита "Битрикс виртуальная машина" от DDoS атак. Просмотров: 5264 Данный способ защиты не панацея, и скорее всего не спасет от профессиональной DDoS атаки, ... Основные функции вывода в шаблонах Битрикс Просмотров: 155358 Знаю, что все их знают. Но иногда не бывает лишним собрать все самое используемое в одну к... Если товар в корзине, поменять значение input на "В корзине" Просмотров: 10243 Если Вам нужно поменять текст на кнопке, добавляющей товар в корзину, достаточно воспользо... Получить все товары из всех заказов пользователя. История купленных т... Просмотров: 1374 Задача: нужно создать раздел, в персональном разделе пользователя, с историей всех купленн... Создание мобильного приложения на cordova, для любого сайта. Просмотров: 14192 Если стоит задача разработки мобильного приложения для сайта, можете воспользоваться данно... Создание скидки на общую сумму покупки в Битрикс корзине Просмотров: 26961 Функционал интернет-магазина, работающего под управлением 1С Битрикс, позволяет задавать м...