Задать вопрос
pro100taa
@pro100taa

Как сделать отложенную загрузку сниппета?

Здравствуйте!

Есть сниппет, который вылавливает куки.

[[!getRoistatCookie]]

<?php
$roistatVisitId = isset($_COOKIE['roistat_visit']) ? $_COOKIE['roistat_visit'] : "nocookie";
return $roistatVisitId;


Работает, но проблема в том, что если человек заходит в первый раз, то куки не успевают загрузиться и в результате выводит nocookie. Если перезагрузить страницу, то куки выводятся.

Как отложить загрузку сниппета хотя бы на 5 секунд?
Вариант sleep(5); не подходит. Будет задержка ответа.

Какие есть варианты?

Заранее спасибо.
  • Вопрос задан
  • 72 просмотра
Подписаться 1 Сложный 11 комментариев
Пригласить эксперта
Ответы на вопрос 2
Пометите скрипт в файл или просто вызывайте сниппет на какой-нибудь странице с пустым шаблоном и дергайте ее после загрузки страницы через JS (Ajax) с задержкой.
Ответ написан
Комментировать
pro100taa
@pro100taa Автор вопроса
С помощью FB решил так проблему. Может быть кому-то пригодиться.

document.addEventListener('submit', function (e) {
    // Проверяем, что событие произошло на форме с id="mod"
    if (e.target && e.target.id === 'mod') {
        e.preventDefault(); // Предотвращаем отправку формы

        // Функция для получения значения куки
        const getCookie = (name) => {
            const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
            return match ? match[2] : 'nocookie';
        };

        // Функция для преобразования `_ym_d` в формат "дд.мм.гггг"
        const formatYmDate = (cookieValue) => {
            const timestamp = parseInt(cookieValue, 10); // Преобразуем в число
            if (!isNaN(timestamp) && timestamp > 0) {
                // Конвертируем в формат "дд.мм.гггг"
                const date = new Date(timestamp * 1000); // Умножаем на 1000, так как timestamp в секундах
                return date.toLocaleDateString('ru-RU', {
                    day: '2-digit',
                    month: '2-digit',
                    year: 'numeric'
                });
            }
            return 'nocookie';
        };

        // Устанавливаем значения скрытых полей
        e.target.querySelector('#getRoistatCookie').value = getCookie('roistat_visit');
        e.target.querySelector('#getyaClientID').value = getCookie('_ym_uid');
        e.target.querySelector('#getsession_id').value = getCookie('PHPSESSID');
        e.target.querySelector('#getclient_id').value = getCookie('_ga');
        e.target.querySelector('#get_ym_d').value = formatYmDate(getCookie('_ym_d')); // Преобразуем `_ym_d`
        e.target.querySelector('#get_ym_isad').value = getCookie('yandex_login');

        // Отправляем форму через Fetch API
        const formData = new FormData(e.target);
        fetch(e.target.action, {
            method: 'POST',
            body: formData,
        })
            .then(response => response.text())
            .then(data => {
                console.log('Ответ сервера:', data);
                alert('Спасибо, ваша заявка отправлена!');
            })
            .catch(error => console.error('Ошибка:', error));
    }
});
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы