Cookie Consent - Vexe CMS

Interaktivní správa, kódy a instrukce pro integraci na další weby

Nastavení barev

Upravte barvy tak, aby odpovídaly barevnému schématu cílového webu. Kódy se automaticky přepíší.

Dominantní barva (Primary)
Hover barva (Primary Dark)
Textová světlá barva (Primary Light)
Otevřít install.md
Nezapomeňte: Blok kódů v hlavičce (Head Script) musí být spuštěn před načtením kontejneru GTM (Google Tag Manager), jinak nebude výchozí stav Consent Mode v2 rozpoznán správně.
1 Nasazení hlavičky

Zkopírujte kód z záložky 1. Head Script a vložte jej do šablony webu do sekce <head> co nejvýše (nad GTM).

2 Přidání HTML a odkazů

Vložte HTML kód z záložky 2. HTML Banner na konec šablony před tag </body>. Dále přidejte odkaz pro správu do patičky (ID: openCookieSettingsLink) a na GDPR stránku (ID: gdprCookieSettingsLink).

3 Stylování a JavaScript

Připojte CSS a JavaScript. U CSS můžete nastavit vlastní proměnné v postranním panelu. V JS upravte seznam aktivních služeb a cookies (proměnná window.cookieConsentServices).

Tento prompt můžete kompletně zkopírovat a předložit jakémukoliv AI kódovacímu asistentovi (ChatGPT, Claude, atd.) při implementaci na dalším webu.

Zde se generuje prompt...
<!-- Google Consent Mode v2 - Výchozí blokování cookies před souhlasem -->
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}

    // Pokus o načtení dříve uděleného souhlasu z prohlížeče (LocalStorage)
    var savedConsent = null;
    try {
        savedConsent = JSON.parse(localStorage.getItem('cookie_consent'));
    } catch(e) {}

    // Nastavení výchozího stavu souhlasů: pokud neexistuje uložená volba, vše se zablokuje
    gtag('consent', 'default', {
        'ad_storage': (savedConsent && savedConsent.marketing) ? 'granted' : 'denied',
        'ad_user_data': (savedConsent && savedConsent.marketing) ? 'granted' : 'denied',
        'ad_personalization': (savedConsent && savedConsent.marketing) ? 'granted' : 'denied',
        'analytics_storage': (savedConsent && savedConsent.analytics) ? 'granted' : 'denied',
        'personalization_storage': 'granted', // technické / nezbytné cookies
        'functionality_storage': 'granted',
        'wait_for_update': 500
    });
    
    // Anonymizace reklamních dat v případě absence souhlasu
    gtag('set', 'ads_data_redaction', true);
</script>
<!-- COOKIE CONSENT BANNER -->
<div id="cookieBanner" class="cookie-banner">
    <div class="cookie-banner-main">
        <div class="cookie-content">
            <p class="cookie-text">
                Tento web používá soubory cookies k analýze návštěvnosti a personalizaci reklam. 
                Více informací naleznete v sekci <a href="/ochrana-osobnich-udaju/">Ochrana osobních údajů</a>.
            </p>
        </div>
        <div class="cookie-actions">
            <button id="cookieSettingsBtn" class="cookie-btn cookie-btn-settings">Nastavení</button>
            <button id="cookieRejectBtn" class="cookie-btn cookie-btn-reject">Odmítnout</button>
            <button id="cookieAcceptBtn" class="cookie-btn cookie-btn-accept">Rozumím a přijímám</button>
        </div>
    </div>

    <!-- COOKIE SETTINGS PANEL (EXPANDABLE) -->
    <div id="cookieSettingsPanel" class="cookie-settings-panel" style="display: none;">
        <div class="cookie-settings-title">Podrobné nastavení souborů cookies</div>
        <div class="cookie-settings-options">
            <div class="cookie-option">
                <label class="cookie-switch-label">
                    <input type="checkbox" id="cookieOptNecessary" checked disabled>
                    <span class="cookie-switch-custom"></span>
                    <div class="cookie-option-info">
                        <span class="cookie-option-name">Nezbytné (Technické)</span>
                        <span class="cookie-option-desc">Nutné pro správný chod a bezpečnost webu. Nelze je vypnout.</span>
                        <span id="cookieListNecessary" class="cookie-services-list"></span>
                    </div>
                </label>
            </div>
            <div class="cookie-option">
                <label class="cookie-switch-label">
                    <input type="checkbox" id="cookieOptAnalytics" checked>
                    <span class="cookie-switch-custom"></span>
                    <div class="cookie-option-info">
                        <span class="cookie-option-name">Analytické</span>
                        <span class="cookie-option-desc">Pomáhají nám pochopit, jak návštěvníci používají web.</span>
                        <span id="cookieListAnalytics" class="cookie-services-list"></span>
                    </div>
                </label>
            </div>
            <div class="cookie-option">
                <label class="cookie-switch-label">
                    <input type="checkbox" id="cookieOptMarketing" checked>
                    <span class="cookie-switch-custom"></span>
                    <div class="cookie-option-info">
                        <span class="cookie-option-name">Marketingové</span>
                        <span class="cookie-option-desc">Slouží pro správné cílení a vyhodnocování reklam.</span>
                        <span id="cookieListMarketing" class="cookie-services-list"></span>
                    </div>
                </label>
            </div>
        </div>
        <div class="cookie-settings-actions">
            <button id="cookieSaveSelectedBtn" class="cookie-btn cookie-btn-accept">Uložit vybrané</button>
        </div>
    </div>
</div>
/* Zde se vygeneruje styl na základě nastavení barev... */
document.addEventListener('DOMContentLoaded', function() {
    // COOKIE CONSENT BANNER LOGIC
    const cookieBanner = document.getElementById('cookieBanner');
    const cookieAcceptBtn = document.getElementById('cookieAcceptBtn');
    const cookieRejectBtn = document.getElementById('cookieRejectBtn');
    const cookieSettingsBtn = document.getElementById('cookieSettingsBtn');
    const cookieSettingsPanel = document.getElementById('cookieSettingsPanel');
    const cookieSaveSelectedBtn = document.getElementById('cookieSaveSelectedBtn');
    const openCookieSettingsLink = document.getElementById('openCookieSettingsLink');
    const gdprCookieSettingsLink = document.getElementById('gdprCookieSettingsLink');
    
    // Checkboxes
    const optAnalytics = document.getElementById('cookieOptAnalytics');
    const optMarketing = document.getElementById('cookieOptMarketing');

    // Dynamické načítání služeb a cookies - upravte seznam podle cílového webu
    window.cookieConsentServices = window.cookieConsentServices || {
        necessary: [
            { name: 'Systémové cookies', cookies: ['sessionid', 'csrftoken'] }
        ],
        analytics: [
            { name: 'Microsoft Clarity', cookies: ['_clck', '_clsk'] },
            { name: 'Google Tag Manager', cookies: ['_ga', '_gid'] }
        ],
        marketing: [
            { name: 'Google Ads', cookies: ['gcl_au', '_gcl_aw'] },
            { name: 'Meta Pixel', cookies: ['_fbp', '_fbc'] }
        ]
    };

    if (cookieBanner) {
        // Vykreslení aktivních služeb a cookies pod jednotlivými přepínači
        function renderServices() {
            const services = window.cookieConsentServices;
            
            const elNecessary = document.getElementById('cookieListNecessary');
            const elAnalytics = document.getElementById('cookieListAnalytics');
            const elMarketing = document.getElementById('cookieListMarketing');
            
            if (elNecessary && services.necessary) {
                elNecessary.innerHTML = 'Služby a cookies: ' + services.necessary.map(s => `${s.name} (${s.cookies.join(', ')})`).join(', ');
            }
            if (elAnalytics && services.analytics) {
                elAnalytics.innerHTML = 'Služby a cookies: ' + services.analytics.map(s => `${s.name} (${s.cookies.join(', ')})`).join(', ');
            }
            if (elMarketing && services.marketing) {
                elMarketing.innerHTML = 'Služby a cookies: ' + services.marketing.map(s => `${s.name} (${s.cookies.join(', ')})`).join(', ');
            }
        }
        
        renderServices();

        // Pokud uživatel dosud neučinil volbu, zobrazí se lišta
        if (!localStorage.getItem('cookie_consent')) {
            cookieBanner.style.display = 'flex';
        }

        // Funkce pro aktualizaci stavu souhlasu
        function updateConsent(consentState) {
            localStorage.setItem('cookie_consent', JSON.stringify(consentState));

            // 1. Aktualizace stavu v Google Consent Mode v2
            if (typeof gtag === 'function') {
                gtag('consent', 'update', {
                    'ad_storage': consentState.marketing ? 'granted' : 'denied',
                    'ad_user_data': consentState.marketing ? 'granted' : 'denied',
                    'ad_personalization': consentState.marketing ? 'granted' : 'denied',
                    'analytics_storage': consentState.analytics ? 'granted' : 'denied',
                    'personalization_storage': consentState.necessary ? 'granted' : 'denied',
                    'functionality_storage': consentState.necessary ? 'granted' : 'denied'
                });
            }

            // 2. Push události do Google Tag Manager Data Layer
            window.dataLayer = window.dataLayer || [];
            window.dataLayer.push({
                'event': 'cookie_consent_update',
                'cookie_consent_necessary': consentState.necessary,
                'cookie_consent_analytics': consentState.analytics,
                'cookie_consent_marketing': consentState.marketing
            });

            // 3. Odeslání nativního Javascript eventu (pro hardcoded měření v kódu)
            window.dispatchEvent(new CustomEvent('cookie_consent_updated_event', { detail: consentState }));

            // Skrytí lišty s plynulou animací
            cookieBanner.style.opacity = '0';
            setTimeout(() => {
                cookieBanner.style.display = 'none';
                if (cookieSettingsPanel) cookieSettingsPanel.style.display = 'none';
            }, 400);
        }

        // Tlačítko "Přijmout vše"
        if (cookieAcceptBtn) {
            cookieAcceptBtn.addEventListener('click', function() {
                updateConsent({ necessary: true, analytics: true, marketing: true });
            });
        }

        // Tlačítko "Odmítnout vše"
        if (cookieRejectBtn) {
            cookieRejectBtn.addEventListener('click', function() {
                updateConsent({ necessary: true, analytics: false, marketing: false });
            });
        }

        // Tlačítko "Nastavení" (zobrazení/skrytí detailního panelu)
        if (cookieSettingsBtn && cookieSettingsPanel) {
            cookieSettingsBtn.addEventListener('click', function() {
                cookieSettingsPanel.style.display = cookieSettingsPanel.style.display === 'none' ? 'block' : 'none';
            });
        }

        // Tlačítko "Uložit vybrané" (v detailním nastavení)
        if (cookieSaveSelectedBtn && optAnalytics && optMarketing) {
            cookieSaveSelectedBtn.addEventListener('click', function() {
                updateConsent({
                    necessary: true,
                    analytics: optAnalytics.checked,
                    marketing: optMarketing.checked
                });
            });
        }

        // Pomocná funkce pro zobrazení lišty a předvyplnění stavu z LocalStorage
        function showSettings() {
            const stored = localStorage.getItem('cookie_consent');
            if (stored) {
                try {
                    const parsed = JSON.parse(stored);
                    if (optAnalytics) optAnalytics.checked = !!parsed.analytics;
                    if (optMarketing) optMarketing.checked = !!parsed.marketing;
                } catch (e) {}
            }
            cookieBanner.style.display = 'flex';
            cookieBanner.style.opacity = '1';
            if (cookieSettingsPanel) cookieSettingsPanel.style.display = 'block';
        }

        // Vyvolání z patičky (stálý odkaz)
        if (openCookieSettingsLink) {
            openCookieSettingsLink.addEventListener('click', function(e) {
                e.preventDefault();
                showSettings();
            });
        }

        // Vyvolání z textu GDPR stránky
        if (gdprCookieSettingsLink) {
            gdprCookieSettingsLink.addEventListener('click', function(e) {
                e.preventDefault();
                showSettings();
                cookieBanner.scrollIntoView({ behavior: 'smooth', block: 'end' });
            });
        }
    }
});
A Nastavení souhlasů u tagů v GTM

V GTM klikněte na libovolnou značku (např. Meta Pixel HTML tag), rozbalte Pokročilá nastavení -> Nastavení souhlasu a zvolte možnost Vyžadovat dodatečný souhlas se spuštěním značky. Jako souhlas přidejte ad_storage (pro marketingové tagy) nebo analytics_storage (pro analytické tagy).

B Spouštění přes Custom Event

Lišta po udělení souhlasu odesílá do GTM dataLayeru událost s názvem cookie_consent_update. Můžete tak vytvořit spouštěč (Trigger) typu Custom Event se stejným názvem a podmínkou cookie_consent_marketing se rovná true.

C Generátor GTM značek (Přidání služby bez programování)

Vyplňte formulář níže. Generátor automaticky sestaví správný HTML skript pro GTM, který stačí zkopírovat a vložit jako **Vlastní HTML značku** spouštěnou na triggeru **Consent Initialization**: