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

Данная заметка является дополнением к ранее опубликованной
Если товар в корзине, поменять значение 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>
<?}?>

И не большая фенька

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

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

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

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

Просмотров: 2247 | Комментариев: 3
Внимание! все сообщения проходят премодерацию. Ваше сообщение появится после проверки
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений
Загрузить файл
Нажимая кнопку "Отправить", Вы принимаете условия
Политики конфиденциальности и обработки персональных данных
Илья Мельников
А не подскажете как добавить еще и количество предложения в корзине?
Имя Цитировать
Михаил Базаров
Цитата
Илья Мельников написал:
А не подскажете как добавить еще и количество предложения в корзине?

Там же, в методе 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>';
}
Имя Цитировать
Константин Жуков
Доброго времени!
У вас в блоке где Используем массив IsSkusInBasket- на пустоту, лишняя >, вторая строка:
<a class="to_basket" (> эта лишняя)

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

Цены на разработку сайта или приложения

Что бы узнать точные стоимость и срок разработки:
достаточно, как можно подробнее, заполнить опросник и выслать на электронную почту info@bazarow.ru.
После ознакомления, смогу задать уточняющие вопросы и оценить.

В стоимость разработки уже включены и не требуют доплат:
  • Лицензия на необходимую редакцию 1С-Битрикс: Управление сайтом и лицензии на дополнительные модули, если требуются для конкретного проекта.
  • Применение технологии композитный сайт: Оптимизация скорости работы проекта под нагрузками.
  • Один год, бесплатной, технической поддержки от 1С-Битрикс
Интернет-магазин от 250 000 рублей
Полно-комплексная разработка интернет-магазина любой сложности. Интеграция с 1С, службами доставки и оплаты. Внутренняя СЕО оптимизация перед запуском.
Сайт компании от 200 000 рублей
Сайт с каталогом товаров или услуг, без функционала магазина. Включает формы обратной связи внутри карточек каталога. Любое количество статичных и динамичных разделов.
Инфоресурс от 200 000 рублей
Портал или доска объявлений с большим количеством разделов. Возможность включения форумов, блогов, регистрации пользователей, внутри сайтовая социальная сеть.
Сайт на готовом решении от 40 000 рублей
Подбор решения из более 200-от готовых сайтов, в соответствии с тематикой бизнеса. Запуск сайта на сервере или хостинге, со всеми настройками. Не большие доработки под задачу.
Мобильное приложение от 200 000 рублей

Кроме сайтов, занимаюсь разработкой мобильных приложений на технологии Apache Cordova. Это полноценные приложения, которые публикуются и распостранияются через официальные магазины GooglePlay и AppStore

  • Полная интеграция с базой данных, основного сайта.
  • Вывод каталогов продукции и услуг, прямо в приложении.
  • Персональные разделы пользователей с историей заказов.
  • Прямой доступ к устройству: GPS, камера, звонки и медиабиблиотека

attention