Как проверить разрешение на использование cookie


Для проверки в коде плагина или шаблона, разрешил ли пользователь использование куки определенной категории, используйте следующие способы:

На бэкенде (PHP)

1. Получить объект модели приватности:

$privacyModel = MG::get('privacyModel');

2. Вызвать метод проверки разрешения группы куки:

$isFunctionCookieGroupAllowed = $privacyModel->checkUserAgreedCookieGroup(Models_Privacy::COOKIE_GROUP_FUNCTIONAL);

Всего доступно 4 группы куки для проверки:

  • Models_Privacy::COOKIE_GROUP_ESSENTIAL - Технические (строго необходимые)
  • Models_Privacy::COOKIE_GROUP_FUNCTIONAL - Функциональные
  • Models_Privacy::COOKIE_GROUP_ANALYTICS - Аналитические
  • Models_Privacy::COOKIE_GROUP_MARKETING - Маркетинговые

Для отслеживания изменения списка разрешенных групп используйте хук:

Models_Privacy_changeUserAgreedCookieGroups

Для обеспечения совместимости шаблона или плагина со старыми версиями системы нужно проверять наличие класса Models_Privacy:

if (class_exists('Models_Privacy')) {
  // do something
}

Пример использования:

<?php

class Plugin {
    private static $cookieKey = 'somecookie';

    public function __construct() {
        mgAddAction('mg_start', [__CLASS__, 'setCookie']);
        mgAddAction('Models_Privacy_changeUserAgreedCookieGroups', [__CLASS__, 'unsetCookie']);
    }

    public static function setCookie() {
        $setCookie = true;

        if (class_exists('Models_Privacy')) {
            $setCookie = false;
            $privacyModel = MG::get('privacyModel');
            if ($privacyModel->checkUserAgreedCookieGroup(Models_Privacy::COOKIE_GROUP_FUNCTIONAL)) {
                $setCookie = true;
            }
        }

        if ($setCookie) {
            setcookie(self::$cookieKey, 'somevalue', time() + 3600 * 24 * 5,'/');
        }
    }

    public static function unsetCookie() {
        $privacyModel = MG::get('privacyModel');
        if ($privacyModel->checkUserAgreedCookieGroup(Models_Privacy::COOKIE_GROUP_FUNCTIONAL)) {
            return;
        }

        setcookie(self::$cookieKey, null, -1, '/');
    }
}

На фронтенде (JavaScript)

1. Получить массив групп кук, использование которых пользователь разрешил:

const userAgreedCookieGroups = window?.userAgreedCookieGroups || [];

2. Реализовать проверку, что необходимая вам группа входит в список разрешенных:

if (userAgreedCookieGroups.includes('functional')) {
    return;
}

Для отслеживания изменения списка разрешенных групп используйте событие userAgreedCookieGroupsChange документа:

$(document).on('userAgreedCookieGroupsChange', () => { 
    // do something 
});

Для обеспечения совместимости шаблона или плагина со старыми версиями системы нужно проверять наличие переменной userAgreedCookieGroups:

if (typeof(window.userAgreedCookieGroups) !== 'undefined') {
    // do something
}

Пример использования:

class Plugin {
    cookieKey = 'somecookie';

    constructor() {
        this.setCookie();
        $(document).on('userAgreedCookieGroupsChange', this.onUserAgreedCookieGroupsChange.bind(this));
    }

    setCookie() {
        if (!this.isCookieAllowed()) {
            return;
        }

        const cookieValue = 'somevalue';

        const expiresDate = new Date();
        const expiresTime = expires.getTime();
        expiresDate.setTime(expiresTime + 1000 * 3600 * 24 * 5);
        const expiresString = expiresDate.toUTCString();

        const cookie = `${this.cookieKey}=${cookieValue}; expires=${expiresString}; path=/`;

        document.cookie = cookie;
    }

    isCookieAllowed() {
        if (typeof(window.userAgreedCookieGroups) === 'undefined') {
            return true;
        }
        const userAgreedCookieGroups = window?.userAgreedCookieGroups || [];
        return userAgreedCookieGroups.includes('functional');
    }

    onUserAgreedCookieGroupsChange() {
        const userAgreedCookieGroups = window?.userAgreedCookieGroups || [];
        if (userAgreedCookieGroups.includes('functional')) {
            return;
        }
        this.unsetCookie();
    }

    unsetCookie() {
        const cookie = `${this.cookieKey}=0; Max-Age=0; path=/`;
        document.cookie = cookie;
    }
}