Сие творение навеяно вордпрессом и, может быть, когда нибудь, будет собрано в пакет. Конечно, в красоте кода я не совсем уверена, но все же...
Создано для 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, и поисковую систему или адрес — источник перехода.
Люблю, целую, Вараника.
Вараника 14.03.2019 14:24 #
плейсхолдер и чанк письма
[ [+param_utm_ref] ] и [ [+ref.utm_source] ]
(что что-то странное творится с полем ввода. Убрать пробелы где стандартные поля modx)
Системное событие OnHandleRequest
Ну вот почему нельзя после публикации откорректировать отвалившиеся куски?
Вараника 14.03.2019 21:28 #
Создать однотипные посадочные страницы под рекламу и заменять ими главную страницу. При этом не попасть под санкции.
Решение — главную не трогаем. Создаем не опубликованный ресурс, который используем как папку для таких однотипных страниц. Т.е. parent не 0.
Для страниц входа используем отдельных шаблон, практически идентичный главному. В моем случае в нем еще пара TV, которые заменяют данные в шапке и подвале.
В шаблоне самой первой строкой вызываем сниппет
Шаблон для подстраховки. Пишу на fenom сразу, а то опять отрежет кода часть.
Код start_id
И тут просто сохраняем эти два параметра.
Теперь в header, где выводится меню, делаем следующее:
pdoResources — так как конкретно в моем случае 1 уровень меню, а посадочные страницы с глаз долой спрятаны в документе-папке.
В tpl_menu_2 я просто вызываю обычный список
Ну а start_id_tpl очень прост
Проверка на шаблон и наличие id и выдача одного из номеров для главной страницы.
Юрий 15.03.2019 18:18 #
Вараника 16.03.2019 18:07 #
Но и ты умничка, я с твоей статьей на 15% примерно подняла свои пару сайтов)))
Максим Литвинов 18.03.2019 12:01 #
Вараника 18.03.2019 18:19 #
Максим Литвинов 18.03.2019 18:41 #
P.S. Не за что! Обращайтесь!
Сергей 19.03.2019 10:50 #
В админке единоразово проскочила ошибка:
Вроде все по инструкции настроил (через clientconfig указал поля), но значения упорно не хочет получать.
Вызов:
Чанк формы:
Шаблон письма:
Вараника 19.03.2019 11:43 #
И в саму валидацию попробовать добавить:
&validate=` cb_phone:minLength=^10^,utm_source,utm_medium,utm_term,utm_content,utm_campaign,original_ref,start_page,ip,ref,url`
Сергей 19.03.2019 11:49 #
Вараника 19.03.2019 11:55 #
Вараника 19.03.2019 15:08 #
Вараника 19.03.2019 17:02 #
Рабочий универсальный хук:
И чанк utm_ref простой
Сергей 20.03.2019 07:20 #
Стили можно в теле письма добавить на свое усмотрение, например как это сделала Вероника:
Если стили не сработают (кроссплатформенность в верстке email писем очень замороченная штука), то надо указывать через параметры style непосредственно у самого элемента (table, tr, td и т.д.).
Спасибо Вероника! :)
Мария Еретнова 12.04.2019 10:38 #
Плагин utm_ref
СНИППЕТ utm_ref
ЧАНК utm_ref
Второй вариант тоже пробовала, не помогло
В форме письма
В хуках/прехуках
Наверняка, я пропускаю или не дописываю что-то важное.
Вараника 12.04.2019 13:25 #
Мария Еретнова 12.04.2019 13:30 #
Вараника 14.04.2019 12:34 #
Попробуйте раскомментировать в коде это тогда:
Мария Еретнова 15.04.2019 12:08 #
Мария Еретнова 15.04.2019 12:12 #
Вараника 15.04.2019 18:45 #
Мария Еретнова 16.04.2019 21:00 #
Мария Еретнова 17.04.2019 11:20 #
Иванна Яковлева 03.06.2019 09:05 #
Очень полезная инфа.
Борис 20.05.2020 00:54 #
Вараника 24.02.2021 20:56 #
Вараника 12.08.2021 16:16 #
По сути все идентично, только крошечное отличие :) Спасибо Леше Либеру за подсказу по событиям ;)
Итак, плагин utm_ref:
Ревистам на заметку, вначале нет вызова php.
Событие OnLoadWebDocument
Теперь сниппет для eForm ( я хотела через параметры сниппета обойтись простым if else, но шо то не пошло и сделала два сниппета).
Внутри чанка с письмом пишем
Увы, не сработало.
А внутри уже код:
В чанке письма почти то же самое. Вызываем сниппет utm_ref_report с небольшими отличиями:
Ну и фсё.
Конечно можно было строку с метками вынести в системные настройки, но что-то я не поняла как :)