Данная заметка является дополнением к ранее опубликованной
Если товар в корзине, поменять значение input на "В корзине".
Проделаем тоже самое, если используются торговые предложения. Но, можно использовать и в других сценариях.
Если используете старые шаблоны, можете применить и способ из заметки выше. В новых шаблонах это финт не пройдет, если используются SKU
Для начала нам нужно получить 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 предложений текущего товара, сделаем это простым foreach. И загоним в массив allItemOffersIds
foreach ($arResult["OFFERS"] as $arOffer) { $allItemOffersIds[] = $arOffer['ID']; }
Теперь, с помощью array_intersect просто узнаем: Есть ли в массиве корзины ID-шники предложений из массива SKU текущего товара.
array array_intersect (array $array1 , array $array2 [, array $... ])
Функция array_intersect() возвращает массив, содержащий все значения массива array1, которые содержатся во всех аргументах. Обратите внимание, что ключи сохраняются.
$IsSkusInBasket = array_intersect($allBasketItems, $allItemOffersIds);
В массиве IsSkusInBasket будут ID тех предложений, текущего товара, которые есть в корзине. Само собой, если ни одного предложения нет - массив будет пустым. Это нам и нужно.
Собственно, дальше все просто. Проверяем массив на пустоту 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>
В принципе все. Вопросы прошу задавать в комментарии.
![]()
Илья Мельников
|
А не подскажете как добавить еще и количество предложения в корзине?
|
![]()
Михаил Базаров
|
||||
Там же, в методе CSaleBasket::GetList можно получить поле QUANTITY - количество товара в корзине. Пишу не проверяя, там подкрутите под себя
|
||||
На нем, уже много видеоуроков по 1С-Битрикс. Как одиночные видео так и серии видеоуроков Перейти на канал
Совсем скоро выйдет видеокурс по разработке доски объявлений с мобильным приложением. Подписывайтесь и будьте в курсе: