Рассказ пойдет о том, как подружить сайт под управлением 1C Bitrix и систему ExpertSender (профессиональное решение для реализации email-кампаний). На терминалогии и нюансах останавливаться не будем. Если интересно узнать что это за такие звери, что они едят и где живут, добро пожаловать в Google ? Итак, начнем повествование…
Постановка задачи
Давайте разберем все необходимые действия на примере, думаю, так будет нагляднее. Допустим, у нас на сайте существует следующая форма регистрации:
Задача: При регистрации пользователя создавать в ExpertSender подписчика с указанными в форме полями. При изменении данных пользователя в Bitrix, обновлять информацию в ExpertSender.
Итак, что нужно сделать ясно, приступили к решению.
Подготавливаем ExpertSender
Для начала создадим лист в который будем собирать наших подписчиков с формы регистрации. Заходим в систему и выбираем Подписчики → Списки рассылок → Создать лист подписчиков и заполняем все требуемые поля.
Далее разберемся с полями подписчика. По умолчанию ExpertSender предполагает хранение следующих требуемых нам полей: Имя, Фамилия, Email, соответсвенно нам потребуется добавить недостающие поля (Дата рождения, номер телефона, город) как дополнительные. Для этого перейдем в Подписчики → Дополнительные поля и выберем Добавить поле.
Для нас важны здесь такие поля как Название и Тип настраиваемого поля, т.к. они потребуются нам при написании API запроса.
Я предлагаю назвать поля следующим образом:
| Полное название | Название | Тип поля |
| Дата рождения | birthdate | Дата |
| Номер телефона | phone | Число |
| Город | city | Текст |
Теперь подготовим API, для этого перейдем в Настройки → Субаккаунт → API. Мы можем использовать уникальный ключ для API, который позволяет нам делать все что заблагорассудится, но из соображений безопасности рекомендуется создать ключ с определенными правами. Нажимаем Добавить новый ключ API, и выбираем пункт Действия с подписчиками — добавление подписчика/подписчиков в лист. Если позднее нам понадобятся какие-либо другие права, добавим их.
ExpertSender подготовили, далее переходим к настройке Bitrix.
Интегрируем
В Bitrix у пользователей все требуемые нам поля существуют по умолчанию, соответственно создавать их не требуется. Теперь пришло время написать немного кода.
Для того, чтобы при изменении полей пользователя в Bitrix данные изменения так же отражались на подписчиках в ES, создадим и зарегистрируем обработчики событий OnBeforeUserRegister(событие возникающее после регистрации пользователя), и OnBeforeUserUpdate(событие возникающее при обновлении данных пользователя) которые будут получать нужные нам данные, формировать и отправлять запрос к API ES на добавление/обновление подписчиков. Сделаем это в файле bitrix/php_interface/init.php следующим образом.// регистрируем обработчики
AddEventHandler(«main», «OnBeforeUserRegister», $onBeforeUserUpdateHandlerEmailToLogin);
AddEventHandler(«main», «OnBeforeUserUpdate», $onBeforeUserUpdateHandlerEmailToLogin);
// регистрируем обработчики
AddEventHandler("main", "OnBeforeUserRegister", $onBeforeUserUpdateHandlerEmailToLogin);
AddEventHandler("main", "OnBeforeUserUpdate", $onBeforeUserUpdateHandlerEmailToLogin);
$expertsenderUserAddOrUpdate = function (&$arFields) {
// т.к. код на добовление и обновление пользователя идентичен
// но ID пользователя в одном случае хранится в $arFields['ID']
// а вдругом в $arFields['USER_ID'] сделаем проверку перед выборкой полей
// и получим нужные нам поля
if (isset($arFields['ID'])) {
$rsUser = CUser::GetByID($arFields['ID']);
}
else
{
$rsUser = CUser::GetByID($arFields['USER_ID']);
}
$arUser = $rsUser->Fetch();
//Получаем поля в переменные
$email = $arFields['EMAIL'];
$name = $arFields['NAME'];
$last_name = $arFields['LAST_NAME'];
$personal_phone = $arFields['PERSONAL_PHONE'];
$personal_city = $arFields['PERSONAL_CITY'];
$personal_birthday = $arFields['PERSONAL_BIRTHDAY'];
//формируем запрос к api Expertsender
$request ='<ApiRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema">';
$request .='<ApiKey>YOUR_API_KEY</ApiKey>';
$request .='<Data xsi:type="Subscriber">';
$request .='<Mode>AddAndUpdate</Mode>';
$request .='<Force>false</Force>';
$request .='<ListId>3</ListId>';
$request .='<Email>'.$email.'</Email>';
$request .='<Firstname>'.$name.'</Firstname>';
$request .='<Lastname>'.$last_name.'</Lastname>';
$request .='<Properties>';
$request .='<Property>';
$request .='<Id>1</Id>';
$request .='<Value xsi:type="xs:string">'.$personal_phone.'</Value>';
$request .='</Property>';
$request .='<Property>';
$request .='<Id>2</Id>';
$request .='<Value xsi:type="xs:string">'.$personal_city.'</Value>';
$request .='</Property>';
$request .='<Property>';
$request .='<Id>6</Id>';
$request .='<Value xsi:type="xs:date">'.date('Y-m-d', strtotime($personal_birthday)).'</Value>';
$request .='</Property>';
$request .='</Properties>';
$request .='</Data>';
$request .='</ApiRequest>';
//отправляем запрос
$curl_options = array (
CURLOPT_URL => 'https://api2.esv2.com/Api/Subscribers/', //ваш путь к api expertsender
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => FALSE,
CURLOPT_HEADER => array(
'POST https://api2.esv2.com/Api/Subscribers/ HTTP/1.1',
'Accept-Encoding: gzip,deflate',
'Content-Type: text/xml',
'User-Agent: Jakarta Commons-HttpClient/3.1',
'Host: api.esv2.com',
'Content-Length: 715'
),
CURLOPT_POSTFIELDS => ($request)
);
$curl = curl_init() or die("cURL init error");
curl_setopt_array($curl, $curl_options) or die("cURL set options error" . curl_error($curl));
$response = curl_exec($curl) or die ("cURL execute eroor" . curl_error($curl));
curl_close($curl);
При формировании запроса стоит уделять особое внимание типам данных, которые ожидает от нас ES и которые мы ему передаем, т.к. при их несовпадении ответ запроса вернется с ошибкой.
Вот и все. Далее отлаживаем и наслаждаемся проделанной работой.
Так же, мы можем использовать другие события Bitrix и методы Expertsender для решения поставленных нам задач (например, отправки сообщений). Ссылки на документации по данной теме ниже:
Документация по Expert Sender REST API
Данный материал был скопирован, с закрытого сайта yuriysmirnov.ru, и сохранен для себя. На авторство не претендую.
