Как я боролась с веб-формами, чтобы по ним создавался в битриксе лид с заполненной сквозной аналитикой
У заказчика коробочный битрикс24, по системе многосайтовости на одном ядре развернуто шаблонное решение Аспро.Корп2, в нем формы обратной связи сделаны веб-формами. Задача: по заполнению веб-формы создавать лид в битрикс24 с заполненной сквозной аналитикой. |
1. Сквозная аналитика определяется по параметру utm_source. Сохраняем ее в куку
alpha_utm_source.
global $APPLICATION;
if(isset($_GET["utm_source"]) && !empty($_GET["utm_source"])):
$_SESSION["alpha_utm_source"] = str_replace("-", "_", $_GET["utm_source"]);
$APPLICATION->set_cookie("alpha_utm_source", $_SESSION["alpha_utm_source"], time() + (10 * 365 * 24 * 60 * 60), "/");
endif; |
2. подключаем в настройках модуля веб-форм CRM
https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=48&LESSON_ID=3642но, с%ка, нет возможности штатно передать метку, нет возможности штатно указать сквозную аналитику |
3. в веб-форме делаем поле UTM-SOURCE типа hidden
4. обработчик в init.php, который выцарапывает (потому что это тоже не оч просто) куку alpha_utm_source, и если такая есть, то заполняет поле UTM-SOURCE в веб-форме
AddEventHandler('form', 'onAfterResultAdd', 'MyAfterResultAdd',1);
function MyAfterResultAdd($webFormId, $resultId){
CModule::IncludeModule('form');
$arForm = CForm::GetSiteArray($webFormId);
if(in_array("1c",$arForm)){ //cite 1c
$rsResult = CFormResult::GetByID($resultId);
$arResult = $rsResult->Fetch();
$rs = CFormField::GetBySID("UTM_SOURCE", $arResult["FORM_ID"]);
$arFieldUtm = $rs->Fetch();
if(!empty($arResult["STAT_SESSION_ID"]) && !empty($arFieldUtm["ID"]) && CModule::IncludeModule('statistic')){
if ($rs = CSession::GetByID($arResult["STAT_SESSION_ID"])){
$arSession = $rs->Fetch();
if(!empty($arSession["LAST_HIT_ID"])){
if ($rs = CHit::GetByID($arSession["LAST_HIT_ID"])){
$arHit = $rs->Fetch();
if(!empty($arHit["COOKIES"])){
$arCookies = explode(PHP_EOL, $arHit["COOKIES"]);
foreach ($arCookies as $str) {
if(strpos($str, "[BITRIX_SM_alpha_utm_source]") !==false){
$cookieValue = trim(str_replace("[BITRIX_SM_alpha_utm_source] = ", "", $str));
$cookieValue = str_replace("_","-",$cookieValue);
break;
}
}
if(empty($cookieValue)){
$cookieValue = "1ccite";
}
CFormResult::SetField($resultId, "UTM_SOURCE", [$arFieldUtm["ID"]=>$cookieValue]);
}
}
}
}
}
}
} |
5. в лиде создаем свойство с названием UTM_SOURCE_COPY типа строка
6. в настройке веб-формы передаем лид и делаем сопоставление свойства лида UTM_SOURCE_COPY полю веб-формы UTM_SOURCE
7. при создании лида делаем обработчик, который тоже размещаем в init.php, который из нашего свойства проставляет UTM-метку
AddEventHandler("crm", "OnBeforeCrmLeadAdd", "MyOnBeforeCrmLeadAdd");
function MyOnBeforeCrmLeadAdd(&$arFields) {
if(!empty($arFields["UF_CRM_1640828446"])){ //свойство UTM_SOURCE_COPY
$arFields["UTM_SOURCE"] = $arFields["UF_CRM_1640828446"];
}
} |
8. и чтоб по utm-метке сквозная ставилась, потому что она не проставляется, хотя в системе (в настройках сквозной) указана
AddEventHandler("crm", "OnAfterCrmLeadAdd", "MyOnAfterCrmLeadAdd");
function MyOnAfterCrmLeadAdd($arFields) {
if(!empty($arFields["UF_CRM_1640828446"]) && CModule::IncludeModule("crm")){
$arAnalytics = Bitrix\Crm\Tracking\Provider::getAvailableSources();
if(!empty($arAnalytics)) {
foreach($arAnalytics as $analyticId => $arAnalytic) {
if(in_array($arFields["UF_CRM_1640828446"],$arAnalytic["UTM_SOURCE"])){
$data = [
'TRACKING_SOURCE_ID' => $arAnalytic["ID"] //нужная свозная аналитика
];
Bitrix\Crm\Tracking\UI\Details::saveEntityData(CCrmOwnerType::Lead, $arFields["ID"], $data, true);
break;
}
}
}
}
return true;
} |