Сие творение навеяно вордпрессом и, может быть, когда нибудь, будет собрано в пакет. Конечно, в красоте кода я не совсем уверена, но все же...


Создано для REVO, легко адаптируется под EVO.
Задача — присылать данные на почту, для анализа их CRM



Готовый вид:


Этап 1 / Создание плагина.

Назовем его utm_ref, зададим системное событие OnHanequest
В коде пишем

if ($modx->event->name == 'OnHandleRequest') {
	if (!isset($_COOKIE['original_ref'])) 
		$_COOKIE['original_ref'] = isset($_SERVER['HTTP_REFERER']) ? 
        $_SERVER['HTTP_REFERER'] : ''; 

	if (!isset($_COOKIE['start_page'])) 
		$_COOKIE['start_page'] = ( isset($_SERVER["HTTPS"]) ? 'https://' : 'http://' ) . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
	
	if(isset($_SERVER["HTTP_X_FORWARDED_FOR"]) && $_SERVER["HTTP_X_FORWARDED_FOR"] != "")
		$_COOKIE['ip'] = $_SERVER["HTTP_X_FORWARDED_FOR"];
	else
		$_COOKIE['ip'] = $_SERVER["REMOTE_ADDR"];
	
	   $_COOKIE['url'] =  ( isset($_SERVER["HTTPS"]) ? 'https://' : 'http://' ) . $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
	 $utm_ref = $modx->getOption('utm_ref');
         $fields = explode(",", $utm_ref);

     /*	Можно просто перечислить так
     $fields = array('utm_source','utm_medium','utm_term', 'utm_content', 'utm_campaign', 'original_ref', 'start_page', 'ip', 'url', 'roistat', 'roistat_referrer', 'roistat_pos', 'yclid');
     */  

    $cookie_field = '';
	foreach ($fields as $id=>$field){
	   $field = trim($field);
		if (isset($_GET[$field]) && $_GET[$field] != '')
			$cookie_field = htmlspecialchars($_GET[$field],ENT_QUOTES, 'UTF-8');
		elseif(isset($_COOKIE[$field]) && $_COOKIE[$field] != ''){ 
			$cookie_field = $_COOKIE[$field];
		}else{
			$cookie_field = '';
		}
		
		$domain = $_SERVER["SERVER_NAME"];
		if ( strtolower( substr($domain, 0, 4) ) == 'www.' ) $domain = substr($domain, 4); 
        if ( substr($domain, 0, 1) != '.' && $domain != "localhost" ) $domain = '.'.$domain; 
		
		setcookie($field, $cookie_field , time()+60*60*24*30, '/', $domain );

		$_COOKIE[$field] = $cookie_field;

		$_COOKIE[$field] =  $_COOKIE[preg_replace("/_i$/","",$field)];
		
       $modx->setPlaceholders(array(
       $field => $_COOKIE[$field],
       ),'ref.');
		
	}

}


Мы отслеживаем первых вход на сайт и сохраняем в кукки все полученные параметры. Список нужных параметров задаем или напрямую в тексте, или в системных настройках. Я вынесла в настройки, чтобы потом из этого сформировать компонент.



В этом же плагине мы сохраняем все в плэйсхолдеры и, по желанию, их можем использовать где угодно так

или {$_modx->getPlaceholder('ref.utm_source')}


Если решили делать через системную настройку / tv-ire / компонент ClientConfig то создаем там значение

  • имя Массив utm меток
  • ключ utm_ref
  • значение utm_source,utm_medium,utm_term,utm_content,utm_campaign,original_ref,start_page,ip,ref,url,roistat,roistat_referrer,roistat_pos,yclid

*обратите внимание — последние кастомные. Т.е можно получить что угодно и делать с этим что вздумается.


Этап 2 / Создание хука.

А теперь создаем сниппет по имени utm_ref и в нем уже:


$utm_ref = $modx->getOption('utm_ref');
$fields = explode(",", $utm_ref);
 
 $param_utm_ref = '<table width="100%">';
	foreach ($fields as $field){
	$field = trim($field); 
	 $value = $modx->getPlaceholder('ref.'.$field);
	 $param_utm_ref .= '<tr><td>'.$field.'</td><td>'.$value.'</td></tr>';
	
	}
$param_utm_ref .= '</table>';	
  /* вот почему-то не съел просто переменную $param_utm_ref без присоединения. Костыль :) */

	 $hook->setValue('param_utm_ref', ''.$param_utm_ref);
return true;

Тут мы собираем ту же системную настройку / tv / список и т.д., что и в плагине. К ней приклеивает одноименные плейсхолдеры и засовываем все в таблицу. Почему? Меня психоз взял указывать в 5 чанках писем списки всех меток и я сразу все в табличку приклеила. Но Вы можете делать и по своему, указывая в чанке письма не, а. Но для этого придется немного подправить код выше, засунув setValue в цикл или просто без хука создать у формы скрытые поля с этим именем и value равным .


Этап 3 / Передача в письмо.

В чанке письма пишем или


<h4>Параметры сессии</h4>
{$param_utm_ref}


А в вызове formit или AjaxForm добавляем

'preHooks' => 'utm_ref',
'hooks' => 'utm_ref, email',

или

&preHooks = `utm_ref`
&hooks = `utm_ref, email`


До вызова email, не забываем.



В общем-то вот и все. Мы получаем и utm, и ip, и поисковую систему или адрес — источник перехода.


Люблю, целую, Вараника.