Стандартная цель метрики JavaScript-событие никогда не может посчитать точное количество отправки формы.
Идею сделать onclick= на кнопку отправки формы или onsubmit= на форму пришлось отмести сразу.
Сделал учет событий отправки данных формы по факту добавления данных в БД.
Вот пошаговая инструкция как это сделать
1.
В настройках счетчика метрики активируем Measurement Protocol
Настройки счетчика - Дополнительные настройки - Безопасность и использование данных - Поставить галочку
2.
Сохранить Токен доступа Measurement Protocol
3.
Создать цель JavaScript с Идентификатором цели, например savetocrm
4.
В файл template/public_layout.php добавить код счетчика Яндекс метрики перед тегом </head>
5.
В сущность, которая является публичной формой добавить поле ym_client_id. В это поле будет записываться Идентификатор клиента (ClientID) Яндекс метрики.
В данном примере ID поля 240
6.
В настройки публичной формы в поле JS вставляем следующий код. Этот код будет извлекать из куков счетчика Яндекс метрики ClientID и подставлять его в поле ym_client_id
В первой строчке поменяйте ID счетчика на свой и измените fields[240] на свое id поля.
Код: Выделить всё
// ID вашего счетчика Яндекс.Метрики
var yaCounterId = 99999999;
function setYaClientId() {
// Пытаемся получить объект счетчика каждые 300 мс, но не более 30 попыток (9 секунд)
var attempts = 0;
var maxAttempts = 30;
var checkInterval = setInterval(function() {
attempts++;
// Проверяем, инициализирован ли нужный счетчик и есть ли метод getClientID
if (typeof window['yaCounter' + yaCounterId] !== 'undefined' &&
typeof window['yaCounter' + yaCounterId].getClientID === 'function') {
var clientId = window['yaCounter' + yaCounterId].getClientID();
if (clientId) {
var field = document.getElementById('fields_240');
if (field) {
field.value = clientId;
// Для надёжности также пробуем установить по name (если форма с name="fields[240]")
var fieldByName = document.querySelector('input[name="fields[240]"]');
if (fieldByName && fieldByName !== field) {
fieldByName.value = clientId;
}
}
}
clearInterval(checkInterval);
return;
}
if (attempts >= maxAttempts) {
clearInterval(checkInterval);
console.warn('Yandex Metrica counter not loaded in time, clientId not set');
}
}, 300);
}
// Запускаем, когда DOM готов
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', setYaClientId);
} else {
setYaClientId();
}
Протестируйте публичную форму, если в поле ym_client_id записывается много цифр, то значит скрипт работает, тогда в настройках - Пользовательский css можно скрыть это поле от пользователей
Код: Выделить всё
#public_form .form-group-240 {
display: none;
}
Создаем автоматизацию - действие при добавлении записи - php код
Эта автоматизация отправит напрямую в Яндекс метрику данные по цели JavaScript-событие
Код: Выделить всё
$counterId = <id вашего счетчиа>;
$secretToken = '<ваш токен>'; //смотри п.п.2
$goalId = 'savetocrm'; //Идентификатор цели JavaScript-событие
$clientId = [240]; //поле с ClientID
$pageUrl = '<url страницы публичной формы>';
$url = 'https://mc.yandex.ru/collect?tid=' . $counterId . '&cid=' . $clientId . '&t=event&ea=' . $goalId . '&ms=' . $secretToken . '&dl=' . urlencode($pageUrl);
file_get_contents($url);
После срабатывания события данные в статистику Яндекс метрики попадают примерно через 20 минут!
