Отправляем купон при подписке на рассылку Битрикс

53 просмотра
Автор: Николай Ковалёв

Очень хорошим стимулом для подписки на рассылку вашего интернет-магазина является выдача купона со скидкой на товар. Сейчас мы реализуем функционал выдачи купона пользователю, если тот подписался на рассылку.

В примере мы создаём купон для правил работы с корзиной. Кроме того, пример будет работать только в случае, если в компоненте не выставлен параметр "Запрашивать подтверждение подписки".

Реализовывать отправку купона при подписке на рассылку, мы будем кастомизируя стандартный компонент подписки bitrix:sender.subscribe.

Для начала полностью копируем этот компонент в своё пространство имён. Затем открываем файл component.php, находим условие if($arParams["CONFIRMATION"]) примерно на 102 строке и в else для этого условия вставляем такой код:

$sendCoupon = true;

if(count($mailingIdList) > 0)
{
	$arExistedSubscription = array();
	$subscriptionDb = \Bitrix\Sender\MailingSubscriptionTable::getSubscriptionList(array(
		'select' => array('EXISTED_MAILING_ID' => 'MAILING.ID'),
		'filter' => array('=CONTACT.EMAIL' => strtolower($_POST["SENDER_SUBSCRIBE_EMAIL"]), '!MAILING.ID' => null),
	));
	while(($subscription = $subscriptionDb->fetch()))
	{
		$arExistedSubscription[] = $subscription['EXISTED_MAILING_ID'];
	}

	// send if it have new subscriptions only
	if(count(array_diff($mailingIdList, $arExistedSubscription)) <= 0)
		$sendCoupon = false;
}
else
{
	// do not send if no selected mailings and subscriber existed
	$contactDb = \Bitrix\Sender\ContactTable::getList(array('filter' => array('=EMAIL' => strtolower($_POST["SENDER_SUBSCRIBE_EMAIL"]))));
	if($contact = $contactDb->fetch())
		$sendCoupon = false;
}

\Bitrix\Sender\Subscription::add($_POST["SENDER_SUBSCRIBE_EMAIL"], $mailingIdList, SITE_ID);

if($sendCoupon)
{
	if(\Bitrix\Main\Loader::includeModule('sale'))
	{
		$COUPON = \Bitrix\Sale\Internals\DiscountCouponTable::generateCoupon(true); //генерируем купон
		$fields = array(
		   "DISCOUNT_ID" => "3", //ID правила работы с корзиной
		   "ACTIVE" => "Y",
		   "TYPE" => \Bitrix\Sale\Internals\DiscountCouponTable::TYPE_ONE_ORDER, //купон на один заказ
		   "COUPON" => $COUPON,
		   "DATE_APPLY" => false
		);
		
		$result = \Bitrix\Sale\Internals\DiscountCouponTable::add($fields);
		if($result->isSuccess())
		{
			$arEventFields = array(
				"EMAIL"  => $_POST["SENDER_SUBSCRIBE_EMAIL"],
				"COUPON" => $COUPON
			);
			CEvent::Send("SEND_COUPON", "s1", $arEventFields);
		}
	}
}

$APPLICATION->set_cookie("SENDER_SUBSCR_EMAIL", $_POST["SENDER_SUBSCRIBE_EMAIL"], $cookieLifeTime);
$arResult['MESSAGE'] = array('TYPE' => 'NOTE', 'CODE' => 'message_success');
$subscr_EMAIL = $_POST["SENDER_SUBSCRIBE_EMAIL"];
unset($_SESSION['SENDER_SUBSCRIBE_LIST']);

И теперь нам остаётся только создать тип почтового события SEND_COUPON и шаблон письма к нему. В шаблоне для вывода купона используйте переменную #COUPON#, а для адреса получателя - #EMAIL#.