линия

Главная

пятница, 8 июня 2018 г.

Bitrix - история одного мучения или как я прокачал свой скилл

Программист смотрел на задачу как на говно. Ему казалось что задача обычная , заурядная  и не требует уважительного отношения.  Он вытянул спину и выпрямился и где то какие то участки позвонка захрустели, и обратно принял дугообразную позу  и шустрые пальцы бодро застучали по клавиатуре. Коротко задача звучала так: нужно отслеживать  от куда пришел покупатель и сохранять в заказе. Через 15 минут все было готово и программист пошел выпит чашечку бодрящего кофе. Но, заказчик посмотрел и попросил чтоб можно было управлять utm метками через админку. Плюс, значения должны быть списком. Тип ENUM.  Программист хотел посмотреть на сообщение заказчика как на говно но быстро одумался. И выпив одним глотком пол  бокала кофе, при этом его кадык  двигался вверх и вниз  и  из горла выходили булькающие звуки, программист продолжил дело....


В итоге:
1. /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
<?
 /* 
  Функция сохраняет откуда прищел пользователь
 */
 //analitics_Unset();
 //Запускаем шарманку!
 analitics_Init();
 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";
   } 
   else if (strripos($_SERVER["HTTP_REFERER"], "google.") !== false) { // Переход с google
   $stFromTransition = "gp";
   } 
   else if (strripos($_SERVER["HTTP_REFERER"], "//yandex.ru") !== false) { // Переход с yandex
   $stFromTransition = "jp";
   }  
   else if (strripos($_SERVER["HTTP_REFERER"], "go.mail.ru") !== false) { //
   $stFromTransition = "mp";
   } 
   else if (strripos($_SERVER["HTTP_REFERER"], "search.yahoo.com") !== false) { //
   $stFromTransition = "yahoo";
   } 
   else if ($_GET["utm_source"]) {
   $stFromTransition = $_GET["utm_source"];
   } 
   else if (!$_SERVER["HTTP_REFERER"] && !$_GET) { // Прямой переход
   $stFromTransition = "url"; 
  }
  $_SESSION["REFERER"] =  $stFromTransition;
 }
 
 
 //Обнуление данных. Вызывается после оформления заказа!
 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,
    ));
   }
  }
 }
 

 
 function getAnaliticsData(){
  $cache = new CPHPCache();
  $cache_time = 3600;
  $cache_id = 'analitics_data4';
  $cache_path = 'analitics_data4';
  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()){
     //print_r($vars);echo '<p>==============</p>';
     //Array ( [ID] => 15 [ORDER_PROPS_ID] => 32 [NAME] => 1 - Яндекс.Маркет [VALUE] => yandext [SORT] => 1 [DESCRIPTION] => r1=yandex )
     $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;   
 }
 
 
?>

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


3. Нужно будет кастомизирвать компонент добавления заказа. bitrix.sale.order.ajax
Копируем в свое пространство имен компонент и с жадным взглядом меняем код.
Добавляем где то на 5910 строке после  строк
if ($this->arParams['USER_CONSENT'] === 'Y')
{
Main\UserConsent\Consent::addByContext(
$this->arParams['USER_CONSENT_ID'], 'sale/order', $arResult['ORDER_ID']
);
}




1
2
3
4
5
6
7
<?
 $analiticsData = analitics_Getdata();
   if($analiticsData){
      AddOrderPropertyExt("REFER",$analiticsData,$arResult["ORDER_ID"]);
   
   }
?>


Вроде все. 




Комментариев нет:

Отправить комментарий