Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Веб-формы, лиды и сквозная аналитика



Как я боролась с веб-формами, чтобы по ним создавался в битриксе лид с заполненной сквозной аналитикой
У заказчика коробочный битрикс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;
}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!