Aller au contenu principal

Migration de l'implémentation de la CMP

Depuis la version 32.0.0 de la CMP, l'implémentation dans votre site web a été simplifiée. Dans cette page, nous allons voir comment migrer pas à pas de l'ancienne implémentation vers la nouvelle.


Nouvelle implementation

Le code à implémenter dans votre site web est fourni sous chaque notice dans l'interface de configuration et est facilement copiable grace au bouton "Copier". Il ne reste plus qu'à coller le code dans la section <head> de votre site web.

Pour plus d'informations, voir la page Web cmp.

Event listener

L'event listener a été intégré directement dans la notice, il n'est donc plus nécessaire de l'ajouter sur toutes les pages de votre site web. Vous pouvez donc supprimer le script suivant de votre site web.

A supprimer
<!-- ADD EVENTLISTENER -->
<script type="text/javascript">
(adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=1,window.dataLayer=window.dataLayer||[],__tcfapi("addEventListener",2,function(e,n){if(n&&e.gdprApplies&&("tcloaded"===e.eventStatus||"useractioncomplete"===e.eventStatus)){if((adsbygoogle=window.adsbygoogle||[]).pauseAdRequests=0,e.purpose.consents)
for(var s in window.dataLayer.push({AppConsent_IAB_PURPOSES:e.purpose.consents}),e.purpose.consents)e.purpose.consents[s]&&window.dataLayer.push({event:"appconsent_ctrl_"+s});var o,a;e.acExtraPurposes&&(o={},e.acExtraPurposes.forEach(function(e){o[e]=!0}),window.dataLayer.push({AppConsent_EXTRA_PURPOSES:o})),e.acExtraVendors&&(a={},e.acExtraVendors.forEach(function(e){a[e]=!0}),window.dataLayer.push({AppConsent_EXTRA_VENDORS:a})),e.purpose.consents&&e.vendor.consents&&("object"==typeof sfbxguardian&&e.purpose.consents[1]&&window.sfbxguardian.unblock(),"function"==typeof gtag&&(e.purpose.consents[1]&&e.vendor.consents[755]?gtag("consent","update",{analytics_storage:e.purpose.consents[7]||e.purpose.consents[9]?"granted":"denied",ad_storage:e.purpose.consents[3]?"granted":"denied "}):gtag("consent","update",{analytics_storage:"denied",ad_storage:"denied"})))}window.dataLayer.push({event:"appconsent_loaded"})});
</script>
<!-- END EVENTLISTENER -->

Les commandes init et show

Désormais, les commandes init et show sont automatiquement exécutées à l'initialisation de la notice et cela implique des changements dans l'implémentation de la notice.

La commande init

Auparavant, il était nécessaire d'implémenter le script suivant dans la section <body> des pages HTML.

À supprimer
<script type="text/javascript">
__tcfapi('init', 2, console.log, {
appKey: 'YOUR_APP_KEY',
url: 'https://collector.appconsent.io',
// targetCountries: ['FR', 'UK', 'US'],
// forceGDPRApplies: true,
})
</script>

Callback de la commande init

Si vous avez défini un callback dans la commande init, vous devez désormais l'ajouter à la variable de configuration configSFBXAppConsent dans le paramètre callbacks.

Pour rappel, ce callback sera exécuté à la fin de l'initialisation de la notice. Et prend comme paramètres d'entrées error et state.

info

Dans la documentation de l'ancienne implémentation, nous proposions de mettre console.log en callback de la commande. Si vous êtes dans ce cas, il n'est plus nécessaire de le mettre en callback.

Exemple de la configuration d'un callback :

<script type="text/javascript">
const configSFBXAppConsent = {
appKey: 'YOUR_APP_KEY',
callbacks: {
init: ( error, state ) => {},
}
}
</script>

La commande show

Comme pour la commande init, la commande show n'a plus besoin d'être implémentée comme ceci :

À supprimer
<script type="text/javascript">
__tcfapi('show', 2, console.log, {
lazy: true,
})
</script>

Callback de la commande show

Si vous avez défini un callback dans la commande show, vous devez désormais l'ajouter à la variable de configuration configSFBXAppConsent dans le paramètre callbacks.

Pour rappel, ce callback sera exécuté à la fin de l'exécution de la commande. Et prend comme paramètre d'entrée error.

info

Dans le code d'exemple de l'ancienne implémentation, nous proposions dans la documentation de mettre console.log en callback de la commande. Si vous êtes dans ce cas, il n'est plus nécessaire de le mettre en callback.

Exemple de la configuration d'un callback :

<script type="text/javascript">
const configSFBXAppConsent = {
appKey: 'YOUR_APP_KEY',
callbacks: {
show: ( error ) => {}
}
}
</script>

Changement dans la configuration de la cmp

Option url

L'option url a désormais comme valeur par défaut l'url suivante : https://collector.appconsent.io. Il n'est donc plus nécessaire d'avoir cette option dans la configuration votre cmp, SI vous utilisez cette url.

Ancienne implémentation
<script type="text/javascript">
__tcfapi('init', 2, console.log, {
appKey: 'YOUR_APP_KEY',
url: 'https://collector.appconsent.io',
})
</script>

Nouvelle implementation :

<script type="text/javascript">
const configSFBXAppConsent = {
appKey: 'YOUR_APP_KEY'
}
</script>

Option lazy

L'option lazy est désormais activé par défaut. Si vous aviez déjà activé cette option dans la commande show, il n'est plus nécessaire de l'avoir dans la configuration.

Ancienne implémentation
<script type="text/javascript">
__tcfapi('show', 2, console.log, {
lazy: true,
})
</script>

Nouvelle implementation :

<script type="text/javascript">
const configSFBXAppConsent = {
appKey: 'YOUR_APP_KEY'
}
</script>

Guardian

Si vous n'avez pas implémenté guardian, vous pouvez passer à la suite.

La configuration de guardian a été changée. Auparavant, il était nécessaire d'ajouter une balise <script> dans le lequel on définissait les urls qu'on souhaiter blacklister ou whitelister.

Ancienne implémentation
<script>
window.SFBX_GUARDIAN_BLACKLIST = [
/facebook/, /youtube/,
]
// Or a whitelist
window.SFBX_GUARDIAN_WHITELIST = [
/appconsent/,
]
</script>

Maintenant, cette configuration doit être mise dans la variable de configuration configSFBXAppConsent avec le paramètre dynamicallyLoadedScripts avec deux sous parties blacklist et whitelist.

<script type="text/javascript">
const configSFBXAppConsent = {
appKey: 'YOUR_APP_KEY',
dynamicallyLoadedScripts: {
blacklist: [
/facebook/, /youtube/,
],
whitelist: [
/appconsent/,
]
},
}
</script>

Le script de Guardian a été changée pour pouvoir s'adapté cette nouvelle façon de configurer guardian. Il faut donc remplacer l'ancienne balise <script> contenant le code de Guardian par celle-ci :

A changer
<script>
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).sfbxguardian={})}(this,function(t){"use strict";function o(e,t){return e&&(!t||t!==c)&&(!s.blacklist||s.blacklist.some(function(t){return t.test(e)}))&&(!s.whitelist||s.whitelist.every(function(t){return!t.test(e)}))}function l(t){var e=t.getAttribute("src");return s.blacklist&&s.blacklist.every(function(t){return!t.test(e)})||s.whitelist&&s.whitelist.some(function(t){return t.test(e)})}if(typeof configSFBXAppConsent === 'undefined'){console.error('SFBX Guardian has not been executed! The configuration (configSFBXAppConsent) must be placed before calling the script '); return}if(!configSFBXAppConsent.dynamicallyLoadedScripts||(!configSFBXAppConsent.dynamicallyLoadedScripts.blacklist&&!configSFBXAppConsent.dynamicallyLoadedScripts.whitelist)){console.warn('SFBX Guardian: No whitelist or blacklist has been defined'); return;}var c="javascript/blocked",s={blacklist:configSFBXAppConsent.dynamicallyLoadedScripts.blacklist,whitelist:configSFBXAppConsent.dynamicallyLoadedScripts.whitelist},u={blacklisted:[]},f=new MutationObserver(function(t){for(var e=0;e<t.length;e++)for(var i=t[e].addedNodes,r=function(t){var r=i[t];if(1===r.nodeType&&"SCRIPT"===r.tagName){var e=r.src,n=r.type;if(o(e,n)){u.blacklisted.push([r,r.type]),r.type=c;r.addEventListener("beforescriptexecute",function t(e){r.getAttribute("type")===c&&e.preventDefault(),r.removeEventListener("beforescriptexecute",t)}),r.parentElement&&r.parentElement.removeChild(r)}}},n=0;n<i.length;n++)r(n)});f.observe(document.documentElement,{childList:!0,subtree:!0});var i=document.createElement,a={src:Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype,"src"),type:Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype,"type")};function p(t,e){return function(t){if(Array.isArray(t))return t}(t)||function(t,e){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(t)))return;var r=[],n=!0,i=!1,o=void 0;try{for(var c,a=t[Symbol.iterator]();!(n=(c=a.next()).done)&&(r.push(c.value),!e||r.length!==e);n=!0);}catch(t){i=!0,o=t}finally{try{n||null==a.return||a.return()}finally{if(i)throw o}}return r}(t,e)||r(t,e)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function d(t){return function(t){if(Array.isArray(t))return n(t)}(t)||function(t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}(t)||r(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function r(t,e){if(t){if("string"==typeof t)return n(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(t,e):void 0}}function n(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r<e;r++)n[r]=t[r];return n}document.createElement=function(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];if("script"!==e[0].toLowerCase())return i.bind(document).apply(void 0,e);var n=i.bind(document).apply(void 0,e);try{Object.defineProperties(n,{src:{get:function(){return a.src.get.call(this)},set:function(t){o(t,n.type)&&a.type.set.call(this,c),a.src.set.call(this,t)}},type:{set:function(t){var e=o(n.src,n.type)?c:t;a.type.set.call(this,e)}}}),n.setAttribute=function(t,e){"type"===t||"src"===t?n[t]=e:HTMLScriptElement.prototype.setAttribute.call(n,t,e)}}catch(t){console.warn("sfbxguardian: unable to prevent script execution for script src ",n.src,".\n",'A likely cause would be because you are using a third-party browser extension that monkey patches the "document.createElement" function.')}return n};var y=new RegExp("[|\{}()[\\]^$+*?.]","g");t.unblock=function(){for(var t=arguments.length,r=new Array(t),e=0;e<t;e++)r[e]=arguments[e];r.length<1?(s.blacklist=[],s.whitelist=[]):(s.blacklist&&(s.blacklist=s.blacklist.filter(function(e){return r.every(function(t){return"string"==typeof t?!e.test(t):t instanceof RegExp?e.toString()!==t.toString():void 0})})),s.whitelist&&(s.whitelist=[].concat(d(s.whitelist),d(r.map(function(e){if("string"==typeof e){var r=".*"+e.replace(y,"\\$&")+".*";if(s.whitelist.every(function(t){return t.toString()!==r.toString()}))return new RegExp(r)}else if(e instanceof RegExp&&s.whitelist.every(function(t){return t.toString()!==e.toString()}))return e;return null}).filter(Boolean)))));for(var n=document.querySelectorAll('script[type="'.concat(c,'"]')),i=0;i<n.length;i++){var o=n[i];l(o)&&(u.blacklisted.push([o,"application/javascript"]),o.parentElement.removeChild(o))}var a=0;d(u.blacklisted).forEach(function(t,e){var r=p(t,2),n=r[0],i=r[1];if(l(n)){var o=document.createElement("script");for(var c in"undefined"!==n.src&&o.setAttribute("src",n.src),o.setAttribute("type",i||"application/javascript"),n)c.startsWith("on")&&(o[c]=n[c]);document.head.appendChild(o),u.blacklisted.splice(e-a,1),a++}}),s.blacklist&&s.blacklist.length<1&&f.disconnect()},Object.defineProperty(t,"__esModule",{value:!0})});
</script>

Désormais, le blocage des cookies et scripts ajoutés par Google Analytics est effectué par le script loader à l'initialisation de la notice. Par défaut, le blocage n'est pas actif, pour l'activer vous devez ajouter la propriété enableGCM à la configuration configSFBXAppConsent.

::: Nouvelle implementation :

<script type="text/javascript">
const configSFBXAppConsent = {
appKey: 'YOUR_APP_KEY',
enableGCM: true
}
</script>

Auparavant, 3 solutions étaient proposées pour activer le blocage de Google Analytics, ces 3 solutions ne sont plus nécessaires et peuvent être supprimées.

Solution 1 - IAB TCF

Il faut simplement supprimer la définition gtag_enable_tcf_support dans la variable window.

A supprimer
    <script type="text/javascript">
window['gtag_enable_tcf_support'] = true;
</script>

Solution 2 - GCM

L'ancienne implémentation de GCM doit être supprimée.

Pour cela, vous devez supprimer le script contenant Google Tag et le script d'ajout de la variable dataLayer.

A supprimer
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('consent', 'default', {
'ad_storage': 'denied',
'analytics_storage': 'denied'
});
gtag('js', new Date());
gtag('config', 'UA-XXXXXXXXX-1');
</script>

Il faut aussi supprimer le script de l'event listener de vos pages.

A supprimer
    <script type="text/javascript">
__tcfapi('addEventListener', 2, function(tcData, success) {
if (success && tcData.gdprApplies && (tcData.eventStatus === 'tcloaded' || tcData.eventStatus === 'useractioncomplete') ) {
if (tcData.purpose.consents[1]) {
gtag('consent', 'update', {
'ad_storage': 'granted',
'analytics_storage': 'granted'
})
}
}
})
</script>

Solution 3 - Google Tag Manager

La troisième solution proposée était d'utiliser votre gestionnaire de balises pour déclencher les balises Google Analytics en fonction des purpose_events envoyés au dataLayer. Selon ce que vous avez implémenté dans vos pages, vous pouvez le supprimer pour migrer vers la nouvelle implémentation.

Pour plus d'information voir la page : Installer Appconsent avec Google Tag Manager