Подписка на рассылку

Как сделать подписку на рассылку на ajax на Битриксе

Если у вас есть модуль подписки и рассылки и вам необходимо сделать подписку пользваотеля на AJAX  без перезагрузки страницы,  то с помощью модуля "простое API" это сделать можно следующим образом. Саму форму описывать не будем,  важно отметить что должно присутствовать поле email и идентификатор рассылки (рубрики - id)

AJAX запрос

var rubricId = 1; //
var email = 'test@mail.ru';

// можем сразу провести валидацию
if (!!email.match(/^[\w\d_\.\-]+@[\w\d\-]+\.[a-z]{2,4}$/i) == false) {
  alert('Вы не верно указали адрес электронной почты');
    return false;
}


$.ajax({    url: '/api/',
    type: 'POST',
    dataType: 'json',
    data: {
        sessid: BX.bitrix_sessid(),
        method: 'subscribe.sign',
       email: email,
       id: rubricId
    },
    error: function (r) {
        
    },
    success: function (r) {
        
        if (!!r.response) {
            
             alert(r.response.msg);
            
        }
        else if (!!r.error) {
            alert(r.error.msg);         
        }
    }
});


Обработчик запроса, файл - /api/subscribe/sign.php

<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) {
    die();
}

  global $APPLICATION;

// Подписка на рассылку

/**
* @var $this \Bxmaker\Api\Handler
*/

if (!CModule::IncludeModule('subscribe')) {
    $this->setError('Не установлен модуль подписки, рассылки', 4, array());
    return false;
}

if (!$this->get('id') || intval($this->get('id')) <= 0) {
    $this->setError('Не получен дентификатор рассылки', 4, array());
    return false;
}

if (!$this->get('email') || !preg_match('/^[\d\w\-\.]+@[\w\d\-\.]+\.[a-z]{2,4}$/i', $this->get('email'), $match)) {
    $this->setError('E-mail указан не верно', '2');
    return false;
}


$id = intval($this->get('id'));
$email = $this->get('email');

$dbrRubric = CRubric::GetList(array("SORT" => "ASC", "NAME" => "ASC"), array(
    "ACTIVE" => "Y",
    "LID" => LANG,
    "ID" => intval($this->get('id')),
    "VISIBLE" => 'Y'
));
if (!$arRubric = $dbrRubric->Fetch()) {
    $this->setError('Рассылка не найдена', 4, array());
    return false;
}

//get current user subscription from cookies
$arRubrics = array();
$oSubscribtion = new CSubscription;
$arSubscribe = $oSubscribtion->GetUserSubscription();
if (!!$arSubscribe['ID'] && $arSubscribe['EMAIL'] == strtolower($email)) {
    //повторная отправка
    if ($arSubscribe['CONFIRMED'] != 'Y') {
       $oSubscribtion->ConfirmEvent($arSubscribe['ID'], SITE_ID);
    }

    $arRubrics = $oSubscribtion->GetRubricArray($arSubscribe['ID']);

    if (!in_array($id, $arRubrics)) {
        // добавляем
        $arRubrics[] = $id;

        $oSubscribtion->Update($arSubscribe['ID'], array(
             "RUB_ID" => $arRubrics
        ));
    }

    $this->setResult(array(
        'msg' => 'Вы успешно подписаны!',
        'email' => $email,
        'rubric_id' => $id
    ));

    return true;
}


// добавляем подписку
$arFields = Array(
    "USER_ID" => ($USER->IsAuthorized() ? $USER->GetID() : false),
    "FORMAT" => "html",
    "EMAIL" => $email,
    "ACTIVE" => "Y",
    "RUB_ID" => array($id),
    "CONFIRMED" => "N",
    "SEND_CONFIRM" => "Y",
);

//can add without authorization
$ID = $oSubscribtion->Add($arFields);
if ($ID > 0) {
    $oSubscribtion->Authorize($ID);


    $this->setResult(array(
        'msg' => 'Вы успешно подписаны!',
        'email' => $email,
        'rubric_id' => $id
    ));
}
else {
    $this->setError($oSubscribtion->LAST_ERROR, '2');
    return false;
}