Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отслеживание закрытия страницы или ухода с нее и изменение значения переменной в БД (https://javascript.ru/forum/misc/84031-otslezhivanie-zakrytiya-stranicy-ili-ukhoda-s-nee-i-izmenenie-znacheniya-peremennojj-v-bd.html)

levy 17.05.2022 11:53

Отслеживание закрытия страницы или ухода с нее и изменение значения переменной в БД
 
Пишу сайт на фрейме yii2. Понадобилось сделать монопольный доступ к странице редактирования формы update. Для этого использую две переменные edit_on и editor, первая булевая (1 - доступ разрешен, 0 - занят) и во вторую заношу id пользователя, который редактирует, чтобы показывать его другим. При сохранении формы возвращаю edit_on 1 и очищаю editor. Однако нужно отследить, когда пользователь уходит со страницы, не сохранив форму. Была идея отправлять ajax запросы на сервер с обновлением переменной last_update каждые 30 секунд, но это будет загружать сервер. Поэтому появилась другая идея: отследить момент закрытия страницы, и во время него отправить запрос на обновление этих двух переменных.

В js я новичок, поэтому не понимаю, как именно написать часть скрипта, отвечающую за обновление двух переменных в БД. И подходит ли .bind или лучше добавить новый слушатель?

$(window).bind('beforeunload',function(event){/*тут запись переменных*/});

voraa 17.05.2022 13:04

beforeunload можно использовать, что бы предупредить пользователя, что он что то не сохранил, что бы дать ему возможность самому сохранить данные перед закрытием страницы.

Если вы не предполагаете использовать старые браузеры (типа IE), то для отслеживания на сервере закрытия страницы, можно использовать
navigator.sendBeacon()

https://developer.mozilla.org/ru/doc...tor/sendBeacon

levy 18.05.2022 11:17

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

function changeEdit(){
var data = {edit_on:1,editor:""};
navigator.sendBeacon(document.URL,data);
};

window.addEventListener('beforeunload', chandeEdit);


Как я понимаю, то этим кодом просто передаются post значения на страницу update. А как их записать в саму таблицу?

voraa 18.05.2022 12:10

Цитата:

Сообщение от levy
Можете подсказать, пожалуйста, как именно тогда задать изменение значений в БД. Пока не разбираюсь в этом.

Это же ваша БД, и только вы должны знать, что и как туда передавать и как изменять.

Только событие не 'beforeunload' а 'unload' должно быть.

Закрытие страницы и уход с нее - разные вещи, если под уходом понимать переключение на другую вкладку или другое окно.
Что именно вам отслеживать надо?

levy 18.05.2022 12:34

Нужно отслеживать закрытие страницы или переход в ней на другой url.

По поводу записи не понимаю, как вообще с помощью js можно произвести запись и возможно ли? Или можно ли вызвать исполнение фоновое php с записью в бд?

Nexus 18.05.2022 15:21

Цитата:

Сообщение от levy
По поводу записи не понимаю, как вообще с помощью js можно произвести запись и возможно ли?

А на кой вам вообще с помощью js базу трогать, если у вас на беке yii? Отправили запрос на backend, backend внес изменения в бд.

voraa 19.05.2022 11:26

Цитата:

Сообщение от levy
Или можно ли вызвать исполнение фоновое php с записью в бд?

Не фоновое, а выполнение php на сервере.
https://developer.mozilla.org/ru/doc...tor/sendBeacon
Там же есть пример, как обратиться к серверу

navigator.sendBeacon("/log", analyticsData); - это и есть обращение к серверу, но без получение отвера от него.
url может быть любым, например какой-нибудь http://myserver.ru/bla-bla/script.php

levy 19.05.2022 13:19

Я создал в контроллере экшн для записи:

public function actionEdit() {
$id = Yii::$app->request->post('id');
$sql = 'UPDATE report SET edit_on = 1 WHERE id = '.$id;
$connection = \Yii::$app->db->createCommand($sql)->execute();
}


Соответственно изменил скрипт:
function changeEdit(){
var id = '<?= $model->id?>';
var data = {id:id};
navigator.sendBeacon("/report/edit",data);
};
window.addEventListener('unload', chandeEdit);


Однако почему-то передается пустой post запрос без параметров.


Часовой пояс GMT +3, время: 12:48.