Студия разработки сайтов и приложений

Netspark.ru

Заметки и разработки

Drupal

Куки-баннер по-быстрому

Для приведения сайтов в соответствие с обновленным законом о персональных данных внедрил куки-баннер, один на все сайты. Вот, делюсь кодом.

Баннер совместим с Bootstrap 5 и почти совместим с Bootstrap 4 (нужно только скопировать стили для .fixed-bottom и явным образом задать цвет бэкграунда).

Судя по различным источникам, реальных манипуляций с куками в зависимости от ответа пользователя делать не нужно, во всяком случае пока. Хранить в табличке каждый факт пользовательского согласия с возможностью отозвать — тоже. Так что баннер просто рассказывает, что у нас тут на сайте куки есть, и по кнопке «Согласен» сохраняет факт нажатия в куку. Что позволяет еще год не показывать этот баннер. Ну и ссылку на политику обработки персональных данных даёт.

Выглядит примерно вот так:

cookie-banner.png

Код почти целиком написан чатом жопотэ — сейчас бы еще самому кодить во имя такой благородной цели. Так что я лишь внес одно небольшое уточнение. Для использования нужно вкрутить в html вот этот код баннера:

<div id="cookieConsentWrapper" class="fixed-bottom w-100">
    <div class="cookie-content-wrapper">
        <div id="cookieConsent" class="cookie-consent-container bg-light">
            <div class="cookie-content">
                <div class="cookie-text">
                    <p class="mb-0">
                        На нашем сайте используются куки-файлы, потому что без них всё плохо работает. А с ними — хорошо. Нажмите на кнопку «Согласен», если согласны с <a href="/privacy-policy">условиями обработки куки и данных</a> на сайте. Если не согласны, можете отключить куки в настройках браузера.
                    </p>
                </div>
                <div>
                    <button id="cookieConsentBtn" class="btn btn-primary">Согласен</button>
                </div>
            </div>
        </div>
    </div>
</div>

Добавить JS-код для определения показа и отработки скрытия баннера, а также работы с куками:

// Cookie dialog
    document.addEventListener('DOMContentLoaded', function () {
        const cookieConsentWrapper = document.getElementById('cookieConsentWrapper');
        const cookieConsent = document.getElementById('cookieConsent');
        const cookieConsentBtn = document.getElementById('cookieConsentBtn');

        if (!getCookie('cookieConsent')) {
            setTimeout(() => {
                cookieConsent.classList.add('show');
            }, 500);
        } else {
            cookieConsentWrapper.style.display = 'none';
        }

        cookieConsentBtn.addEventListener('click', function () {
            // Устанавливаем cookie на 365 дней
            setCookie('cookieConsent', 'true', 365);
            cookieConsent.classList.remove('show');
            setTimeout(() => {
                cookieConsentWrapper.style.display = 'none';
            }, 500);
        });

        // Функция для установки cookie
        function setCookie(name, value, days) {
            const date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            const expires = "expires=" + date.toUTCString();
            document.cookie = name + "=" + value + ";" + expires + ";path=/";
        }

        // Функция для получения cookie
        function getCookie(name) {
            const cookieName = name + "=";
            const decodedCookie = decodeURIComponent(document.cookie);
            const cookieArray = decodedCookie.split(';');

            for (let i = 0; i < cookieArray.length; i++) {
                let cookie = cookieArray[i];
                while (cookie.charAt(0) === ' ') {
                    cookie = cookie.substring(1);
                }
                if (cookie.indexOf(cookieName) === 0) {
                    return cookie.substring(cookieName.length, cookie.length);
                }
            }
            return "";
        }
    });

И добавить к стилям вот этот сниппет для оформления баннера:

/* Cookie consent */
.cookie-consent-container {
    box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.3);
    border-radius: 8px 8px 0 0;
    transform: translateY(100%);
    opacity: 0;
    transition: transform 0.4s ease-out, opacity 0.4s ease-out;
}

.cookie-consent-container.show {
    transform: translateY(0);
    opacity: 1;
}

.cookie-content-wrapper {
    max-width: 900px;
    margin: 0 auto;
    padding: 0 15px;
}

.cookie-content {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 15px 0;
    margin-left: 20px;
    margin-right: 20px;
}

.cookie-text {
    flex: 1;
    padding-right: 30px;
}

@media (max-width: 768px) {
    .cookie-content {
        flex-direction: column;
        text-align: center;
    }

    .cookie-text {
        padding-right: 0;
        margin-bottom: 15px;
        text-align: left;
        width: 100%;
    }
}

Если себе на сайт еще не ставили, или ищете легких путей — пользуйтесь на здоровье. Увидеть баннер живьем можно например на https://netspark.ru.

Обсуждение

Чтобы обсудить заметку, написать комментарий, или просто связаться, заходите в Телеграм-канал. У нас весело и всем рады!

Также меня можно найти в Хвиттере, VC.ru, Дзене, или Тенчате.