Добавить товар в отложенные, находясь в карточке товара.
В первую очередь добавим кнопку, по клику на которую будет происходить добавления товара в Отложенные:
<span onclick="add2wish(
'<?=$arResult["ID"]?>',
'<?=$arResult["CATALOG_PRICE_ID_1"]?>',
'<?=$arResult["CATALOG_PRICE_1"]?>',
'<?=$arResult["NAME"]?>',
'<?=$arResult["DETAIL_PAGE_URL"]?>',
this)">
<?//Проверяем, есть ли данный товар в отложенных
$curProductId = $arResult['ID'];
$dbBasketItems = CSaleBasket::GetList(
array(
"NAME" => "ASC",
"ID" => "ASC"
),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"PRODUCT_ID" => $curProductId,
"ORDER_ID" => "NULL",
"DELAY" => "Y"
),
false,
false,
array("PRODUCT_ID")
);
while ($arItems = $dbBasketItems->Fetch())
{
$itInDelay = $arItems['PRODUCT_ID'];
}?>
<span class="wishbtn">
<?if ( (in_array($arResult["ID"], $dbBasketItems)) || (isset($itInDelay)) ) { echo 'Товар отложен'; } else {echo 'Отложить товар';}?>
</span>
</span>
В зависимости от того, добавлен ли товар или еще нет, у нас будет выводится разный текст - Товар отложен или Отложить товар.
Скрипт, отвечающий за добавление товара в Отложенные:
function add2wish(p_id, pp_id, p, name, dpu, th){
$.ajax({
type: "POST",
url: "/ajax/wishlist.php",
data: "p_id=" + p_id + "&pp_id=" + pp_id + "&p=" + p + "&name=" + name + "&dpu=" + dpu,
success: function(html){
$('.wishbtn').html("Товар отложен");
$('#wishcount').html(html);
}
});
};
Содержимое файла wishlist.php:
<?
//Подключаем ядро Битрикс и главный модуль
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Loader;
//Подключаем модуль sale
Loader::includeModule("sale");
//Получаем корзину текущего пользователя
$fUserID = CSaleBasket::GetBasketUserID(True);
$fUserID = IntVal($fUserID);
//Создаем переменные для обработчика
$arFields = array(
"PRODUCT_ID" => $_POST['p_id'],
"PRODUCT_PRICE_ID" => $_POST['pp_id'],
"PRICE" => $_POST['p'],
"CURRENCY" => "RUB",
"WEIGHT" => 0,
"QUANTITY" => 1,
"LID" => 's1',
"DELAY" => "Y",
"CAN_BUY" => "Y",
"NAME" => iconv("UTF-8","Windows-1251",$_POST['name']),
"MODULE" => "sale",
"NOTES" => "",
"DETAIL_PAGE_URL" => $_POST['dpu'],
"FUSER_ID" => $fUserID
);
//Получаем количество отложеных товаров
if (CSaleBasket::Add($arFields)) {
$arBasketItems = array();
$dbBasketItems = CSaleBasket::GetList(
array(
"NAME" => "ASC",
"ID" => "ASC"
),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => "NULL",
"DELAY" => "Y",
),
false,
false,
array("PRODUCT_ID")
);
while ($arItems = $dbBasketItems->Fetch()){
$arBasketItems[] = $arItems["PRODUCT_ID"];
}
//Загоняем отложенне в переменную
$inwished = count($arBasketItems);
}
//Выводи количество отложенных товаров
echo $inwished;
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");
?>
Кнопка с id #wishcount, где будет отображаться результат отработки кода файла wishlist.php (количество товара в Отложенных - $inwished):
<span class="wish_info">
<a href="/izbrannoe/">Отложенные товары</a>
<div id="wishcount" class="prod_nums">
<?
use Bitrix\Main\Loader;
Loader::includeModule("sale");
$delaydBasketItems = CSaleBasket::GetList(
array(),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => "NULL",
"DELAY" => "Y"
),
array()
);
echo $delaydBasketItems;
?>
</div>
</span>
Соответственно, при клике на кнопку добавления товара в Отложенные, у нас будет происходить ajax-запрос к файлу wishlist.php, результатом отработки которого является количество товаров в Отложенных. Данное количество тут же фиксируется в div-е с id wishcount. Так же в этом div-е по умолчанию выводится количество Отложенных товаров.
Кроме того, мы можем перейти на страницу Отложенных, где будет отображаться список всех отложенных товаров. Содержимое данной страницы:
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Отложенные товары");
?>
<span class="clean_wishlist">Очистить</span>
<div class="clearfix"></div>
<div class="wishlist_list">
<?if(\Bitrix\Main\Loader::includeModule("sale"))
{
$dbBasketItems = CSaleBasket::GetList(
array(
"NAME" => "ASC",
"ID" => "ASC"
),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"ORDER_ID" => "NULL",
"DELAY" => "Y"
),
false,
false,
array("ID", "DELAY", "PRODUCT_ID", "PRICE")
);
while ($arItems = $dbBasketItems->Fetch())
{
$arBasketItems[] = $arItems["PRODUCT_ID"];
if($arItems['DELAY'] == 'Y')
{$res = CIBlockElement::GetByID($arItems["PRODUCT_ID"]);?>
<? if($ar_res = $res->GetNext()):?>
<div class="col-sm-4">
<div class="bx_catalog_item_container">
<a href="<?=$ar_res["CANONICAL_PAGE_URL"]?>" class="bx_catalog_item_images" title="Памятник с крестом из гранита габбро-диабаз №26">
<span class="img_wrap">
<?$renderImage = CFile::ResizeImageGet($ar_res['DETAIL_PICTURE'], Array("width" => '285', "height" => '278'), BX_RESIZE_IMAGE_PROPORTIONAL_ALT );?>
<img src="<?=$renderImage["src"]?>" alt="<?=$ar_res['NAME'];?>" title="<?=$ar_res['NAME'];?>">
</span>
<div class="bx_catalog_item_title order_name"><?=$ar_res['NAME'];?></div>
</a>
<div class="bx_catalog_item_price">
<div class="bx_price"><?=preg_replace('/\..+$/','',$arItems["PRICE"]);?> руб.</div>
</div>
<div class="bx_catalog_item_controls">
<div class="bx_catalog_item_controls_blocktwo">
<span class="addToCart">в корзину</span>
<span class="price" style="display: none"><?=preg_replace('/\..+$/','',$arItems["PRICE"]);?> руб.</span>
<span class="product_id" style="display: none"><?=$arItems["PRODUCT_ID"]?></span>
</div>
<div style="clear: both;"></div>
</div>
</div>
</div>
<?endif;?>
<?}
}
$inwished = count($arBasketItems);
}
?>
<?if($inwished == 0):?>
<p class="empty_wishlist">Ничего не найдено.</p>
<?endif;?>
<div class="clearfix"></div>
</div>
<script>
$(function(){
var elm = document.getElementsByClassName('.addToCart');
$(".addToCart").click(function (e) {
var s = $(this).siblings('.product_id').html();
var price = $(this).siblings('.price').html();
var price_m = price.replace(' руб.', "");
price_m = price_m.replace(' ', '');
var sendData = {
id: s,
price: price_m,
value: 1
};
this.blur();
$.ajax({
url: "/ajax/price1.php",
global: false,
type: "POST",
data: ({sendData: sendData}),
success: function (data) {
window.location.href = "/korzina/";
}
});
return false;
});
$(".clean_wishlist").click(function (e) {
$.ajax({
type: "POST",
url: "/ajax/clean.php",
success: function (html) {
$('.wishlist_list').html('<p class="empty_wishlist">Ничего не найдено.</p>');
$('#wishcount').html('0');
}
});
});
});
</script>
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
На данной странице, кроме списка, есть кнопка "Очистить", которая обращается к файлу clean.php. Содержимое данного файла:
<?//Подключаем ядро Битрикс и главный модуль
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Loader;
Loader::includeModule("sale");
$res = CSaleBasket::GetList(array(), array(
'FUSER_ID' => CSaleBasket::GetBasketUserID(),
'LID' => SITE_ID,
'DELAY' => 'Y',
'CAN_BUY' => 'Y'));
while ($row = $res->fetch()) {
CSaleBasket::Delete($row['ID']);
}?>
После клика на эту кнопку, список будет пуст и количество Отложенных в div-е с id wishcount обнулится.