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

Если предложение SKU в корзине, поменять кнопку добавления на "В корзине"

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

Данная заметка является дополнением к ранее опубликованной: Если товар в корзине, поменять значение input на "В корзине". Проделаем тоже самое, если используются торговые предложения. Но, можно использовать и в других сценариях.

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

Получаем ID предложений в корзине пользователя

Для начала нам нужно получить ID всех предложений которые есть в корзине текущего пользователя. При добавлении в корзину добавляется PRODUCT_ID товара, у SKU он совпадает c ELEMENT_ID. Потому, достаточно воспользоваться методом CSaleBasket::GetList


$arBasketItems = array();
$dbBasketItems = CSaleBasket::GetList(
	array(
		"NAME" => "ASC",
		"ID" => "ASC"
	),
	array(
		"FUSER_ID" => CSaleBasket::GetBasketUserID(),
		"LID" => SITE_ID,
		"ORDER_ID" => "NULL"
	),
	false,
	false,
		array("PRODUCT_ID")
	);
while ($arItems = $dbBasketItems->Fetch())
{
   $allBasketItems[] = $arItems['PRODUCT_ID'];
}

В последней строчке: $allBasketItems[] = $arItems['PRODUCT_ID'], мы загнали ID всех предложений козины в массив allBasketItems

Создаем массив из ID предложений текущего товара

Теперь нужно создать массив из ID предложений текущего товара, сделаем это простым foreach. И загоним в массив allItemOffersIds


foreach ($arResult["OFFERS"] as $arOffer) {
	$allItemOffersIds[] = $arOffer['ID'];
}

Сравниваем массивы через array_intersect

Теперь, с помощью array_intersect просто узнаем: Есть ли в массиве корзины ID-шники предложений из массива SKU текущего товара.

array array_intersect (array $array1 , array $array2 [, array $... ])
Функция array_intersect() возвращает массив, содержащий все значения массива array1, которые содержатся во всех аргументах. Обратите внимание, что ключи сохраняются.

$IsSkusInBasket = array_intersect($allBasketItems, $allItemOffersIds);       

В массиве IsSkusInBasket будут ID тех предложений, текущего товара, которые есть в корзине. Само собой, если ни одного предложения нет - массив будет пустым. Это нам и нужно.

Используем массив IsSkusInBasket- на пустоту

Собственно, дальше все просто. Проверяем массив на пустоту if(empty($SkusInBasket)) и выводим соответсвующую кнопку или текст. Тут уже, используйте под свои потребности. Покажу на примере кнопки "В корзину / В корзине"


<?if(empty($SkusInBasket)) {?>
	<a class="to_basket"> id="<?= $itemIds['ADD_BASKET_LINK'] ?>" href="javascript:void(0);">
       В корзину
    </a>
<?} else {?>
	<a class="to_basket in_basket" id="<?= $itemIds['ADD_BASKET_LINK'] ?>" href="javascript:void(0);">
       В корзине
    </a>
<?}?>

Ajax режим при добавлении в корзину

Весь наш подход имеет один изъян: информация о наличии SKU в корзине, появится только при обновлении страницы. Что бы сразу менять текст на кнопке и добавить class in_basket, добавим немного js кода. Можно в script.js шаблона карточки товара.

Просто методом jquery .addClass на событие .click


<script>
	$('.to_basket').click(function () {
	  $(this).addClass('in_basket');
	  $(this).innerHTML="В корзине";
	});
</script>

В принципе все. Вопросы прошу задавать в комментарии.

Илья Мельников 09.10.2020
А не подскажете как добавить еще и количество предложения в корзине?
Михаил Базаров 10.10.2020
Цитата
Илья Мельников написал:
А не подскажете как добавить еще и количество предложения в корзине?

Там же, в методе CSaleBasket::GetList можно получить поле QUANTITY - количество товара в корзине.

Пишу не проверяя, там подкрутите под себя
Код
// result_modifier.php
$dbBasketItems = CSaleBasket::GetList(
   array(
      "NAME" => "ASC",
      "ID" => "ASC"
   ),
   array(
      "FUSER_ID" => CSaleBasket::GetBasketUserID(),
      "LID" => SITE_ID,
      "ORDER_ID" => "NULL"
   ),
   false,
   false,
      array("PRODUCT_ID", "QUANTITY") // Добавил для получения QUANTITY

   );
while ($arItems = $dbBasketItems->Fetch())
{
   echo '<pre>';
   print_r($arItems); // тут получите ID шники и количества - дальше обработаете
   echo '</pre>';
}
Константин Жуков 27.04.2021
Доброго времени!
У вас в блоке где Используем массив IsSkusInBasket- на пустоту, лишняя >, вторая строка:
<a class="to_basket" (> эта лишняя)

Да, и у меня в версии 20.5.393 это все не работает почему то.

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

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

Вывести свойство отдельно ото всех или исключить из всех Просмотров: 7695 Иногда, на сайте, под управлением 1С-Битрикс, нужно вывести какое-то конкретное свойство о... Вывести информацию, только на первом уровне раздела каталога, в 1С-Би... Просмотров: 5604 Задача: на сайте, в каталоге, выводится два фильтра - боковой и верхний. Оба компонента по... Создание блога с комментариями, оценками и просмотрами на сайте с 1С-... Просмотров: 24582 Если на вашем сайте требуется создание раздела с блогом или новостями, статьями. Записям в... Адаптивное гамбургер меню для битрикс Просмотров: 15172 Заметка коротенькая, но решил оставить ее - так как самому часто нужно нечто подобное. В а... Показать только один тип цены в каталоге Битрикс Просмотров: 14977 Достаточно часто, при создании сайта на битрикс, можно столкнуться с такой проблемой: на с... INPUT type="file" Предпросмотр превью картинки до загрузки Просмотров: 12966 Рассмотрим на примере компонента "Форма добавления-редактирования элементов инфоблока", ка... Умный фильтр только на последнем уровне разделов каталога. Просмотров: 11715 Если в разработаываемом магазине или в принципе в каталоге на Битрикс, вы выводите умный ф... Cordova, ввод в input под диктовку. Голосовой поиск в мобильном прило... Просмотров: 1624 Итак, задачка: реализовать голосовой поиск в мобильном приложении на Cordova. По сути, нам... Информация о заказах и содержимое корзины текущего пользователя. Просмотров: 13112 В процессе разработки сайта могут понадобиться рецепты приведенные ниже. Использовать можн... Вывести новости из конкретного раздела инфоблока Битрикс Просмотров: 55318 Бывает что требуется вывести конкретные новости или статьи из одного раздела инфоблока в Б... Создание мобильного приложения на cordova, для любого сайта. Просмотров: 15922 Если стоит задача разработки мобильного приложения для сайта, можете воспользоваться данно... Установка вебсервера на Apple M1 (нативный ARM стек), оптимизированны... Просмотров: 7441 Появилась задачка, установить стек MAMP (macOS, Apache, MYSQL, PHP) на рабочий ноутбук с п... Установка Битрикс24 "Интернет-Магазин + CRM" на один домен и настройк... Просмотров: 1709 Задача: установить лицензию "Интернет-Магазин + CRM" на один домен. Что бы crm была доступ... Показ страницы сайта в боковом слайдере, на примере всплывающей формы... Просмотров: 3250 Если вы хотите сделать подгрузку любой страницы сайта в боковой слайдер, для этого в битри... Простые калькуляторы в карточке товара каталога на Битрикс Просмотров: 16199 На одном из создаваемых сайтов было необходимо сделать небольшой калькулятор и предварител... AJAX корзина с отправкой количества из раздела каталога Просмотров: 20192 Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При... Правильное подключение стилей и скриптов в Битрикс Просмотров: 85412 Есть несколько способов подключения файлов стилей и скриптов, при верстке шаблонов в систе... Ссылки для добавления и удаления товара из сравнения в Битрикс Просмотров: 8723 Просто оставляю это здесь, вставка ссылок на добавление и удаление товара из сравнения, ес... Отфильтровать новости в Битрикс за заданный период Просмотров: 16728 Иногда, нужно отфильтровать элементы (новости например) по дате в Битрикс, с помощью компо... Привязка к разделам в компоненте "Добавления элементов пользователем" Просмотров: 12830 В системе управления 1С Битрикс есть компонент "Форма добавления / редактирования" - котор...