Есть задача: реализовать некоторое подобие метрики\аналитики посетителей сайта.
Как сделано сейчас: REST api При заходе на index выполняется actionCreate, создаём новый объект типа Visitor, при создании заполняем его свойства ip, user agent и т.д., затем отправляем это всё в бд.
Как хочется сделать: при загрузке при загрузке страницы, некоторый js файл получает клиентские данные (ip, user agent и т.д.) и передаёт их в actionCreate (название экшена условно), который в свою очередь отправляет полученные данные в бд.
В чём вопрос: как реализовать правильно передачу необходимых данных, и вообще рабочая ли схема получится (при условии, что у клиента включены js конечно)?
Получить данные о клиенте (браузер, ОС, прочее) можно в JavaScript при помощи
window.navigator
navigator это объект содержащий поля с необходимой вам информацией. Например, вот так можно получить строку с информацией об ОС.
var os = window.navigator.oscpu
Вот так о браузере
var browser = window.navigator.appCodeName
Более подробно о том, какие поля содержатся в этом объекте можете посмотреть здесь, либо просто выведите объект в консоль - console.log(window.navigator)
Вы можете получить необходимые поля как строки, а затем выполнить AJAX-GET запрос по указанному адресу. Если вам нужен именно чистый JavaScript, без jQuery, то это будет выглядеть как-то так:
var os = window.navigator.oscpu
var browser = window.navigator.appCodeName
var ajax = new XMLHttpRequest();
ajax.open("GET", "путь-к-екшену?os="+os+"&browser="+browser, true);
ajax.send();
ajax.onreadystatechange = function() {
if (ajax.readyState == 4 && ajax.status == 200){
//Здесь обработка ответа
}
else{
//Здесь обработка ошибки
}
};
Затем, уже в самом вашем екшене вы получите в качестве параметров переменные os
и browser
, и уже можете делать с ними что угодно. А вот IP получать нужно будет уже в самом екшене (обычным PHP-шным способом)
Если код полагает единоразовую запись о клиенте при загрузке страницы, то нету смысла выносить всё в JavaScript.
Если замысел другой, то возможно запихать данные клиента в сам html
:
<input type="hidden" id="userIp" value="123.15">...
При отправке данных на сервер:
let ip = document.getElementById('userIp').value;
Совсем иной вариант - создание и регистрация скрипта js
из-под фреймворка(код в шаблоне):
$userIp = '123.15';
$script = <<< JS
function sendUserData() {
console.log($userIp);
}
JS;
$this->registerJs($script, yii\web\View::POS_READY);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Всем приветЕсть такая схема сайта: интерфейс пользователя(он же фронт) -=> back-end этого фронта -=> api
В лекции JavaRush «Реализации интерфейса Set, Queue» говорится следующее:
Согласно ТЗ, мне необходимо реализовать управление движущимся объектом с периодическими паузами в 2 секунды между каждым выполняемым действиемПри...