Ниже постараюсь описать как прикрутить этот функционал к карточке товара.
Лично у меня работает при таких настройках:
Модуль Торговый каталогВключить количественный учет - да
Разрешить покупку при отсутствии товара - нет
Разрешить отрицательное количество товара - нет
Разрешить подписку при отсутствии товара - да
Модуль Интернет-магазинНастройки по магазинам -> Подписка на товары -> Использовать уведомления о поступлении товаров - да
Теперь настроим сам процесс подписки:В карточку товара (bitrix:catalog.element) вставляем компонент bitrix:sale.notice.product, параметры комопонента такие:
Код |
---|
<?$APPLICATION->IncludeComponent("bitrix:sale.notice.product", ".default", array(
"NOTIFY_ID" => $arResult['ID'],
"NOTIFY_URL" => htmlspecialcharsback($arResult["SUBSCRIBE_URL"]),
"NOTIFY_USE_CAPTHA" => "N"
),
$component
);?> |
Можно обрамить это все проверкой на $arResult["CATALOG_QUANTITY"] == 0, чтоб выводить только для товара, Доступное количество которого = 0.
В результате получаем в месте вызова компонента ссылочку "Уведомить о поступлении", при клике на которую авторизованный пользователь сразу подписывается на уведомления о поступлении и увидит на месте ссылки надпись "Мы оповестим вас как только товар появится в наличии". А неавторизованного пользователя попросят ввести мейл и ввести каптчу (если параметр "NOTIFY_USE_CAPTHA" == "Y").
Что происходит под капотом:$arResult["SUBSCRIBE_URL"], который мы подключаем в параметре NOTIFY_URL имеет примерно такой вид в моем случае с карточкой: /catalog/путь_к_карточке_товара/?action=SUBSCRIBE_PRODUCT&id=7
Когда мы нажимаем ссылку "Уведомить о поступлении", отправляется запрос на этот адрес, параметр action (или какой там у вас задан в настройках каталога), равный SUBSCRIBE_PRODUCT ловится компонентом и происходит добавление товара в корзину функцией Add2BasketByProductID(). Туда передается такое поле, как 'SUBSCRIBE' равное 'Y'. Таким образом сохраняется информация о том, какой пользователь подписался на какой товар и лежит это все красиво в табличке b_sale_basket до того момента когда наш товар появится на складе.
Допустим, наш товар теперь в наличии и происходит изменение его остатка с 0 на 1. Если посмотреть код метода CCatalogProduct::Update(), то сразу за вызовом обработчиков события OnProductUpdate имеется вызов метода CSaleBasket::ProductSubscribe(). Если кратко, этот метод делает выборку по записям корзины с товаром, который в данный момент обновляется, с флагом SUBSCRIBE = Y и которые не привязаны к заказу.
Фильтр CSaleBasket::GetList():
Скрытый текст |
---|
array( "PRODUCT_ID" => $ID, // ИД товара, пришедшего из метода CCatalogProduct::Update() "SUBSCRIBE" => "Y", "CAN_BUY" => "N", "ORDER_ID" => "NULL", ">USER_ID" => "0", "MODULE" => $MODULE // равно 'catalog' ), |
Далее получются данные о пользователе, получется его мейл и создается почтовое событе типа SALE_SUBSCRIBE_PRODUCT. В него передаются поля для шаблона и отправляется письмо методом CEvent::Send();