Как реализовать передачу данных из js в action yii2?

140
28 января 2021, 13:00

Есть задача: реализовать некоторое подобие метрики\аналитики посетителей сайта.

Как сделано сейчас: REST api При заходе на index выполняется actionCreate, создаём новый объект типа Visitor, при создании заполняем его свойства ip, user agent и т.д., затем отправляем это всё в бд.

Как хочется сделать: при загрузке при загрузке страницы, некоторый js файл получает клиентские данные (ip, user agent и т.д.) и передаёт их в actionCreate (название экшена условно), который в свою очередь отправляет полученные данные в бд.

В чём вопрос: как реализовать правильно передачу необходимых данных, и вообще рабочая ли схема получится (при условии, что у клиента включены js конечно)?

Answer 1

Получить данные о клиенте (браузер, ОС, прочее) можно в 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-шным способом)

Answer 2

Если код полагает единоразовую запись о клиенте при загрузке страницы, то нету смысла выносить всё в 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);
READ ALSO
Загрузка файла с api-route, Laravel

Загрузка файла с api-route, Laravel

Всем приветЕсть такая схема сайта: интерфейс пользователя(он же фронт) -=> back-end этого фронта -=> api

112
Как используется hashCode в HashSet/HashMap?

Как используется hashCode в HashSet/HashMap?

В лекции JavaRush «Реализации интерфейса Set, Queue» говорится следующее:

114
StateMachine и ожидание выполнения

StateMachine и ожидание выполнения

Согласно ТЗ, мне необходимо реализовать управление движущимся объектом с периодическими паузами в 2 секунды между каждым выполняемым действиемПри...

115