линия

Главная

вторник, 26 июня 2018 г.

Bitrix - сохраняем данные от куда пришел посетитель

Задачи бывают разные:
Черные, белые, красные.
Но всем одинаково хочется -
На что-нибудь  заморочиться




Клиент обратился с просьбой запилить такой функционал, чтоб в свойствах заказа попадала информация о том откуда пришел пользователь. По скайпу на меня смотрел клиент со страхом в глазах ,в ожидании услышать  стоимость разработки. А я тем времени, смотрел на него уставшими и утонувшими в подглазных мешках  глазами. Конечно, это простая задача. Но, у него такой сайт, такое решение от АСПРО, простая задача превращалась в среднюю. Средняя в тяжелую. Тяжеля - невыполнимую. После обсуждения цены  прилег на диван дабы обмозговать задачу....
В итоге через несколько дней получилось вот что:




1. Создаем новое свойство в заказе.


В  описании пишем utm метки. можно ссылку.  Также пишем три обязательных пункта.



2. Пишем код в /bitrix/php_interface/init.php

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?
 /* 
  Функция сохраняет откуда прищел пользователь
 */
 //analitics_Unset();
 //Запускаем шарманку!
 //analitics_Set();
 //пример использования события OnSaleOrderBeforeSaved


    //
 function analitics_Init(){
  if ( $_SESSION["REFERER"] !="" )return true; 
  //Проверяем на наличие utm меток
  $arUtm = getAnaliticsData();  
  if( !is_array($arUtm)) return false;
  $ret = false;
  foreach($arUtm as $id => $arr){
   if(strpos($_SERVER['REQUEST_URI'] , $arr['HREF']) !== false ){
    $_SESSION["REFERER"] = $arr['CODE'];
    $_SESSION["REFERER_PERFIX"] = $arr['PERFIX'];
    $ret = true;
    break;
   } 
  }  
  if($ret) return true;
  //Некоторые данные которые не описать в свойствах
         if (isset($_GET["frommarket"])) { // Яндекс Маркет
   $stFromTransition = "yandext";
   $_SESSION["REFERER_PERFIX"] = 1;
   } 
   else if (strripos($_SERVER["HTTP_REFERER"], "google.") !== false) { // Переход с google
   $stFromTransition = "gp";
   $_SESSION["REFERER_PERFIX"] = 7;
   } 
   else if (strripos($_SERVER["HTTP_REFERER"], "yandex.ru") !== false) { // Переход с yandex
   $stFromTransition = "jp";
   $_SESSION["REFERER_PERFIX"] = 6;
   }  
   else if (strripos($_SERVER["HTTP_REFERER"], "go.mail.ru") !== false) { //
   $stFromTransition = "mp";
   $_SESSION["REFERER_PERFIX"] = 10;
   } 
   else if (strripos($_SERVER["HTTP_REFERER"], "search.yahoo.com") !== false) { //
   $stFromTransition = "yahoo";
   $_SESSION["REFERER_PERFIX"] = 11;
   } 
   else if ($_GET["utm_source"]) {
   $stFromTransition = $_GET["utm_source"];
   } 
   else if (!$_SERVER["HTTP_REFERER"] && !$_GET) { // Прямой переход
   $stFromTransition = "url";
   $_SESSION["REFERER_PERFIX"] = 8;
  }
  $_SESSION["REFERER"] =  $stFromTransition;
 }
 
 
 //Для тестирования
 function analitics_Set(){
     $_SESSION["REFERER"] ="jp";
  $_SESSION["REFERER_PERFIX"] = 6;
 
 }
 //Обнуление данных. Вызывается после оформления заказа!
 function analitics_Unset(){
  $_SESSION["REFERER"] = null;
  $_SESSION["REFERER_ID"] = null;
  $_SESSION["REFERER_DATA"] =null;
 }
 
 
 
 //Возвращает  перфикс метки в системе.
 function analitics_GetPerfix(){
 if($_SESSION["REFERER_PERFIX"] >0){
   return $_SESSION["REFERER_PERFIX"].'-'; 
  }
  return '';
 }
 //Возращает код значения
 function analitics_Getdata(){
  return  $_SESSION["REFERER"];
 }
 
 //Добавляеи или обновлять свойство в заказе
 function AddOrderPropertyExt($code, $value, $order) {
  if (!strlen($code)) {
   return false;
  }
  if (CModule::IncludeModule('sale')) {
   $arProp = CSaleOrderProps::GetList(array(), array('CODE' => $code))->Fetch();
   $arOrderSourceValue = CSaleOrderPropsValue::GetList(array(), array("ORDER_ID" => $order,"ORDER_PROPS_ID" => $arProp['ID']))->Fetch();
   if ($arOrderSourceValue["ID"]){
    echo 'update';
    echo $arOrderSourceValue["ID"];
    CSaleOrderPropsValue::Update($arOrderSourceValue["ID"], array("VALUE" => $value));
   }
   else{
    CSaleOrderPropsValue::Add(array(
    'NAME' => $arProp['NAME'],
    'CODE' => $arProp['CODE'],
    'ORDER_PROPS_ID' => $arProp['ID'],
    'ORDER_ID' => $order,
    'VALUE' => $value,
    ));
   }
  }
 }
 

 /*
  Возращает список  utm меток 
  из свойства REFER
 */
 function getAnaliticsData(){
  $cache = new CPHPCache();
  $cache_time = 0;
  $cache_id = 'analitics_data5';
  $cache_path = 'analitics_data5';
  if ($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, $cache_path)){
   $res = $cache->GetVars();
   if (is_array($res["data"]) && (count($res["data"]) > 0))
   return  $res["data"];   
  }
  $arReturn = [];
  if (CModule::IncludeModule('sale')) {
   $property_enums = CSaleOrderProps::GetList([], [ "CODE"=>"REFER"]);
   while($enum_fields = $property_enums->Fetch()){
    $db_vars = CSaleOrderPropsVariant::GetList( ($by="SORT"), ($order="ASC"), [  "ORDER_PROPS_ID"=>$enum_fields["ID"]   ]  );
    while ($vars = $db_vars->Fetch()){
     $perfix = '';
     $arrTemp = explode("-",$vars["NAME"]); 
     if($arrTemp[0]!=''){
        $perfix = trim($arrTemp[0]);
     }
     $arReturn[$vars['ID']] = [ 
          "NAME"=>$vars["NAME"],
       "HREF"=>$vars["DESCRIPTION"],
       "PERFIX"=>$perfix,
       "CODE"=>$vars["VALUE"],
     ];
    }
   }
   $cache->StartDataCache($cache_time, $cache_id, $cache_path);
   $cache->EndDataCache(["data"=>$arReturn]);   
  }
  return $arReturn;   
 }
 
 
?>


3. Модифицируем оформление заказа.

Конечно, было бы идеально запилить на событиях сохранение данных,  но я пошел скользким путем. В компоненете оформления заказа добавил данную строчку. 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php


$analiticsData = analitics_Getdata();
   if($analiticsData){
      AddOrderPropertyExt("REFER",$analiticsData,$arResult["ORDER_ID"]);
   
   }

?>



4. В итоге то что? А вот что

5. Заказчик доволен, я доволен, все довольны.












4 комментария:

  1. Добрый день!
    Подскажите плиз, куда добавляли кусок кода с добавлением свойства в заказ в шаблон компонента или в сам компонент?

    ОтветитьУдалить
    Ответы
    1. Привет. В компонент оформления заказа component.php . Такой подход не очень хорош тем что при обновлении ядра битрикс правки в component.php сотрутся.

      Удалить
  2. Добрый день! А как связаться с вами можно? Попробовал предложенное решение, не работает. Нужент такой функционал на сайте.

    ОтветитьУдалить
  3. Статья из рубрики - додумывайте сами. Описано поверхностно и не работает

    ОтветитьУдалить