Files
drmaterac.pl/modules/cookiesplus/cookiesplus.php
2025-01-06 20:47:25 +01:00

2442 lines
110 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* ISC License
*
* Copyright (c) 2024 idnovate.com
* idnovate is a Registered Trademark & Property of idnovate.com, innovación y desarrollo SCP
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
* REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* @author idnovate
* @copyright 2024 idnovate
* @license https://www.isc.org/licenses/ https://opensource.org/licenses/ISC ISC License
*/
if (!defined('_PS_VERSION_')) {
exit;
}
include_once _PS_MODULE_DIR_ . 'cookiesplus/classes/CookiesPlusIdnovateValidation.php';
include_once _PS_MODULE_DIR_ . 'cookiesplus/classes/CookiesPlusCookie.php';
include_once _PS_MODULE_DIR_ . 'cookiesplus/classes/CookiesPlusFinality.php';
include_once _PS_MODULE_DIR_ . 'cookiesplus/classes/CookiesPlusUserConsent.php';
include_once _PS_MODULE_DIR_ . 'cookiesplus/classes/HTMLTemplateCookiesPlusModule.php';
class CookiesPlus extends Module
{
public $addons_id_product;
public function __construct()
{
$this->name = 'cookiesplus';
$this->tab = 'front_office_features';
$this->version = '1.6.0';
$this->author = 'idnovate';
$this->need_instance = 0;
$this->module_key = '22c3b977fe9c819543a216a2fd948f22';
// $this->author_address = '0xd89bcCAeb29b2E6342a74Bc0e9C82718Ac702160';
$this->bootstrap = true;
$this->addons_id_product = '21644';
$this->ps_versions_compliancy = ['min' => '1.5', 'max' => _PS_VERSION_];
parent::__construct();
$this->displayName = $this->l('Cookies - GDPR Cookie law (block before consent)');
$this->description = $this->l('Make your store GDPR compliant using this module. This module lets you block the cookies until the customer gives his consent accepting the notice.');
$this->confirmUninstall = $this->l('Are you sure you want to delete the module and the related data?');
$this->tabs = [
[
'class_name' => 'COOKIES',
'parent_class_name' => 'CONFIGURE',
'name' => [
'en' => 'Cookies configuration',
'es' => 'Configuración de cookies',
'de' => 'Konfiguration von Cookies',
'fr' => 'Configuration des cookies',
'it' => 'Configurazione dei cookie',
'nl' => 'Cookies configuratie',
'pl' => 'Konfiguracja plików cookie',
'pt' => 'Configuração de cookies',
'ro' => 'Configurarea modulelor cookie',
'ru' => 'Конфигурация файлов cookie',
'se' => 'Cookies konfiguration',
],
'module' => $this->name,
'icon' => 'group_work',
],
[
'class_name' => 'AdminCookiesPlusConfiguration',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Configuration',
'es' => 'Configuración',
'de' => 'Aufbau',
'fr' => 'Configuration',
'it' => 'Configurazione',
'nl' => 'Configuratie',
'pl' => 'Konfiguracja',
'pt' => 'Configuração',
'ro' => 'Configurație',
'ru' => 'Конфигурация',
'se' => 'Konfiguration',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusAppearance',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Appearance',
'es' => 'Apariencia',
'de' => 'Aussehen',
'fr' => 'Apparence',
'it' => 'Aspetto',
'nl' => 'Uiterlijk',
'pl' => 'Wygląd',
'pt' => 'Aparência',
'ro' => 'Aspect',
'ru' => 'вид',
'se' => 'Utseende',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusFinalities',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Cookie finalities',
'es' => 'Finalidades de cookie',
'de' => 'Cookie-Endgültigkeiten',
'fr' => 'Finalités des cookies',
'it' => 'Finalità dei cookie',
'nl' => 'Cookie finaliteiten',
'pl' => 'Ostateczna wersja plików cookie',
'pt' => 'Finalidades do cookie',
'ro' => 'Finalitățile cookie-urilor',
'ru' => 'Окончательность файлов cookie',
'se' => 'Cookie finaliteter',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusCookies',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Cookies',
'es' => 'Cookies',
'de' => 'Cookies',
'fr' => 'Cookies',
'it' => 'Cookies',
'nl' => 'Cookies',
'pl' => 'Cookies',
'pt' => 'Cookies',
'ro' => 'Cookies',
'ru' => 'Cookies',
'se' => 'Cookies',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusGTM',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Google Tag Manager (GTM)',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusFB',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Facebook Pixel',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusYT',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'YouTube',
],
'module' => $this->name,
],
[
'class_name' => 'AdminCookiesPlusUsersConsent',
'parent_class_name' => 'COOKIES',
'name' => [
'en' => 'Users consent',
'es' => 'Consentimiento de los usuarios',
'de' => 'Zustimmung der Benutzer',
'fr' => 'Consentement des utilisateurs',
'it' => 'Consenso degli utenti',
'nl' => 'Gebruikers toestemming',
'pl' => 'Zgoda użytkowników',
'pt' => 'Consentimento dos usuários',
'ro' => 'Utilizatorii sunt de acord',
'ru' => 'Согласие пользователей',
'se' => 'Användarens samtycke',
],
'module' => $this->name,
],
];
}
public function install()
{
$result = include dirname(__FILE__) . '/sql/install.php';
if (!$result) {
$this->_errors[] = $this->l('Error creating tables');
return false;
}
$result = $this->copyOverrideFolder();
if (!$result) {
$this->_errors[] = $this->l('Error copying overrides');
return false;
}
$result = parent::install();
if (!$result) {
$this->_errors[] = $this->l('Error in parent::install');
return false;
}
// Hooks
$result = true;
$result &= $this->registerHook('displayHeader');
// If there's only 1 position it returns false, so we discard the $result
$this->updatePosition(Hook::getIdByName('displayHeader'), 0, 1);
if (version_compare(_PS_VERSION_, '1.7', '<')) {
$result &= $this->registerHook('top');
}
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
$result &= $this->registerHook('displayBeforeBodyClosingTag');
}
if (Module::isInstalled('mobile_theme')) {
$result &= $this->registerHook('displayMobileHeader');
}
$result &= $this->registerHook('displayMyAccountBlock');
$result &= $this->registerHook('displayMyAccountBlockfooter');
$result &= $this->registerHook('tmMegaLayoutFooter');
$result &= $this->registerHook('displayCookies');
$result &= $this->registerHook('displayCookiesHeader');
$result &= $this->registerHook('customerAccount');
$result &= $this->registerHook('displayBackOfficeHeader');
$result &= $this->registerHook('displayAfterBodyOpeningTag');
$result &= $this->registerHook('actionShopDataDuplication');
$result &= $this->registerHook('actionOutputHTMLBefore');
$result &= $this->registerHook('actionHtaccessCreate');
if (Module::isInstalled('cdc_googletagmanager')) {
$cdc_googletagmanager = Module::getInstanceByName('cdc_googletagmanager');
// if (version_compare($cdc_googletagmanager->version, '5', '')) {
$result &= $this->registerHook('displayAfterTitle');
$this->updatePosition(Hook::getIdByName('displayAfterTitle'), 0, 1);
// } else {
$result &= $this->registerHook('displayAfterTitleTag');
$this->updatePosition(Hook::getIdByName('displayAfterTitleTag'), 0, 1);
// }
}
// GDPR module
$result &= $this->registerHook('registerGDPRConsent');
if (!$result) {
$this->_errors[] = $this->l('Error registering hooks');
return false;
}
// Tabs
$result = $this->installTabs($this->tabs);
if (!$result) {
$this->_errors[] = $this->l('Error installing tabs');
return false;
}
$result = $this->setDefaultValues();
if (!$result) {
$this->_errors[] = $this->l('Error setting default values');
return false;
}
// Cache modules
/*if (Module::isInstalled('litespeedcache')) {
$litespeedcacheConfig = json_decode(Configuration::get('LITESPEED_CACHE_MODULE'), true);
if (!isset($litespeedcacheConfig['cookiesplus'])) {
$litespeedcacheConfig['cookiesplus'] = array(
'module' => 'cookiesplus',
'name' => '',
'priv' => 1,
'ttl' => 1800,
'tag' => 'cookiesplus',
'events' => '',
'ctrl' => '',
'methods' => '!hookDisplayHeader',
'render' => '*',
'asvar' => 1,
'ie' => 0,
'ce' => 1,
);
Configuration::updateValue('LITESPEED_CACHE_MODULE', json_encode($litespeedcacheConfig));
}
}
if (Module::isInstalled('stadvancedcache')) {
$stadvancedcacheConfig = unserialize(Configuration::get('ST_ADVCACHE_DYN_HOOKS'));
if (!isset($stadvancedcacheConfig['cookiesplus'])) {
$stadvancedcacheConfig['cookiesplus'] = array(
'header',
'displayBeforeBodyClosingTag'
);
Configuration::updateValue('ST_ADVCACHE_DYN_HOOKS', serialize($stadvancedcacheConfig));
$stadvancedcache = new StAdvancedCache();
$stadvancedcache->clearAllCache();
}
}
if (Module::isInstalled('jprestaspeedpack')) {
$jprestaspeedpackConfig = Configuration::get('pagecache_dyn_hooks');
if (strpos($jprestaspeedpackConfig, 'cookiesplus') === false) {
$jprestaspeedpackConfig .= 'displaybeforebodyclosingtag|cookiesplus|0,';
Configuration::updateValue('pagecache_dyn_hooks', $jprestaspeedpackConfig);
$jprestaspeedpack = new Jprestaspeedpack();
$jprestaspeedpack->clearCache();
}
}*/
$result = self::clearCache();
if (!$result) {
$this->_errors[] = $this->l('Error clearing cache');
return false;
}
$result = Tools::generateHtaccess();
if (!$result) {
$this->_errors[] = $this->l('Error generating htaccess');
return false;
}
return true;
}
public function installTabs($moduleTabs = null)
{
if (!$moduleTabs) {
$moduleTabs = $this->tabs;
}
$languages = Language::getLanguages(false);
foreach ($moduleTabs as $moduleTab) {
if (!Tab::getIdFromClassName($moduleTab['class_name'])) {
$tab = new Tab();
$tab->class_name = $moduleTab['class_name'];
$tab->module = $moduleTab['module'];
$tab->active = 1;
foreach ($languages as $language) {
if (is_array($moduleTab['name'])) {
if (isset($moduleTab['name'][$language['iso_code']]) && $moduleTab['name'][$language['iso_code']]) {
$tab->name[$language['id_lang']] = $moduleTab['name'][$language['iso_code']];
} else {
$tab->name[$language['id_lang']] = $moduleTab['name']['en'];
}
} else {
$tab->name[$language['id_lang']] = $moduleTab['name'];
}
}
if (isset($moduleTab['parent_class_name']) && is_string($moduleTab['parent_class_name'])) {
$tab->id_parent = Tab::getIdFromClassName($moduleTab['parent_class_name']);
} elseif (isset($moduleTab['id_parent'])) {
$tab->id_parent = $moduleTab['id_parent'];
} else {
$tab->id_parent = -1;
}
if (isset($moduleTab['icon'])) {
$tab->icon = $moduleTab['icon'];
}
$tab->add();
if (!$tab->id) {
return false;
}
}
}
return true;
}
public static function clearCache()
{
if (method_exists('Tools', 'clearAllCache')) {
Tools::clearAllCache();
}
if (method_exists('Tools', 'clearSmartyCache')) {
Tools::clearSmartyCache();
}
if (method_exists('Tools', 'clearSf2Cache')) {
Tools::clearSf2Cache();
}
if (method_exists('Tools', 'clearCache')) {
Tools::clearCache(Context::getContext()->smarty);
}
if (method_exists('Media', 'clearCache')) {
Media::clearCache();
}
$version = (int) Configuration::get('PS_CCCJS_VERSION');
if ($version) {
Configuration::updateValue('PS_CCCJS_VERSION', ++$version);
}
$version = (int) Configuration::get('PS_CCCCSS_VERSION');
if ($version) {
Configuration::updateValue('PS_CCCCSS_VERSION', ++$version);
}
return true;
}
public function uninstall()
{
$result = true;
$result &= $this->copyOverrideFolder();
$result &= parent::uninstall();
$result &= $this->uninstallTabs();
include dirname(__FILE__) . '/sql/uninstall.php';
/*if (Module::isInstalled('litespeedcache')) {
$litespeedcacheConfig = json_decode(Configuration::get('LITESPEED_CACHE_MODULE'), true);
if (isset($litespeedcacheConfig['cookiesplus'])) {
unset($litespeedcacheConfig['cookiesplus']);
Configuration::updateValue('LITESPEED_CACHE_MODULE', json_encode($litespeedcacheConfig));
}
if (Module::isInstalled('stadvancedcache')) {
$stadvancedcacheConfig = unserialize(Configuration::get('ST_ADVCACHE_DYN_HOOKS'));
if (isset($stadvancedcacheConfig['cookiesplus'])) {
unset($stadvancedcacheConfig['cookiesplus']);
Configuration::updateValue('ST_ADVCACHE_DYN_HOOKS', serialize($stadvancedcacheConfig));
$stadvancedcache = new StAdvancedCache();
$stadvancedcache->clearAllCache();
}
}
}*/
$result &= self::clearCache();
$result &= Tools::generateHtaccess();
return (bool) $result;
}
public function uninstallTabs($moduleTabs = null)
{
if (!$moduleTabs) {
$moduleTabs = Tab::getCollectionFromModule($this->name);
foreach ($moduleTabs as $moduleTab) {
$moduleTab->delete();
}
} else {
foreach ($moduleTabs as $moduleTab) {
$idTab = Tab::getIdFromClassName($moduleTab['class_name']);
if ($idTab) {
$tab = new Tab($idTab);
$tab->delete();
}
}
}
return true;
}
public function enable($force_all = false)
{
if (!$this->copyOverrideFolder()) {
return false;
}
$result = true;
$result &= parent::enable($force_all);
$result &= Tools::generateHtaccess();
return (bool) $result;
}
public function disable($force_all = false)
{
if (!$this->copyOverrideFolder()) {
return false;
}
$result = true;
$result &= parent::disable($force_all);
$result &= Tools::generateHtaccess();
// Bypass if (!defined('PS_INSTALLATION_IN_PROGRESS')) {
$this->hookActionHtaccessCreate();
return (bool) $result;
}
public function setDefaultValues()
{
Configuration::updateValue('C_P_REVOKE_CONSENT', date('Y-m-d H:i:s', time()));
Configuration::updateValue('C_P_REFRESH', 0);
Configuration::updateValue('C_P_EXPIRY', '365');
Configuration::updateValue('C_P_BOTS', 'Ahrefs|ADmantX|Alexa|AskJeeves|Baidu|Bing|Butterfly|Cookiebot|crawler|DuckDuckGo|exabot|Evaliant|Facebook|Firefly|Froogle|Gigabot|Google|Googlebot|Grapeshot|Inktomi|InfoSeek|Lighthouse|Looksmart|MeanPath|Mediapartners-Google|Me.dium|MJ12bot|MSN|NationalDirectory|OpenSiteExplorer|Pinterest|Proximic|Rankivabot|Scooter|Sogou|Sogouwebspider|Sosospider|Squider|TechnoratiSnoop|TECNOSEEK|Teoma|TweetmemeBot|TweetMeme|Twiceler|Twitturls|URL_Spider_SQL|WebAltaCrawler|WebFindBot|www.galaxy.com|Yaho|Yandex|Ahrefs|YodaoBot');
Configuration::updateValue('C_P_HOOK_POSITION', 0);
Configuration::updateValue('C_P_OVERLAY_OPACITY', '0.5');
Configuration::updateValue('C_P_GEO', '0');
Configuration::updateValue('C_P_POSITION', 'center');
Configuration::updateValue('C_P_WIDTH', '50');
Configuration::updateValue('C_P_ACCEPT_DISPLAY', 1);
Configuration::updateValue('C_P_MORE_INFO_DISPLAY', 1);
Configuration::updateValue('C_P_OVERLAY', 1);
Configuration::updateValue('C_P_OVERLAY_OPACITY', '0.5');
Configuration::updateValue('C_P_BUTTON_POSITION', '1');
Configuration::updateValue('C_P_FONT_COLOR', '#000');
Configuration::updateValue('C_P_BACKGROUND_COLOR', '#FFFFFF');
Configuration::updateValue('C_P_ACCEPT_FONT_SIZE', '16px');
Configuration::updateValue('C_P_ACCEPT_BACKGROUND_COLOR', '#20BF6B');
Configuration::updateValue('C_P_ACCEPT_BORDER_COLOR', '#20BF6B');
Configuration::updateValue('C_P_ACCEPT_FONT_COLOR', '#FFFFFF');
Configuration::updateValue('C_P_MORE_INFO_FONT_SIZE', '16px');
Configuration::updateValue('C_P_MORE_INFO_BACKGROUND_COLOR', '#FFFFFF');
Configuration::updateValue('C_P_MORE_INFO_BORDER_COLOR', '#7A7A7A');
Configuration::updateValue('C_P_MORE_INFO_FONT_COLOR', '#000');
Configuration::updateValue('C_P_REJECT_FONT_SIZE', '16px');
Configuration::updateValue('C_P_REJECT_BACKGROUND_COLOR', '#FFFFFF');
Configuration::updateValue('C_P_REJECT_BORDER_COLOR', '#7A7A7A');
Configuration::updateValue('C_P_REJECT_FONT_COLOR', '#000');
Configuration::updateValue('C_P_SAVE_FONT_SIZE', '16px');
Configuration::updateValue('C_P_SAVE_BACKGROUND_COLOR', '#FFFFFF');
Configuration::updateValue('C_P_SAVE_BORDER_COLOR', '#7A7A7A');
Configuration::updateValue('C_P_SAVE_FONT_COLOR', '#000');
Configuration::updateValue('C_P_REJECT_DISPLAY', '1');
Configuration::updateValue('C_P_DEFAULT_CONSENT', true);
if (version_compare(_PS_VERSION_, '1.7', '<')) {
Configuration::updateValue('C_P_MATERIAL_ICONS_LIBRARY', '1');
Configuration::updateValue('C_P_MATERIAL_ICONS', 1);
} else {
if ($this->context->shop->theme->getName() === 'panda') {
Configuration::updateValue('C_P_MATERIAL_ICONS_LIBRARY', 2);
} else {
Configuration::updateValue('C_P_MATERIAL_ICONS_LIBRARY', 1);
}
}
$cookiesDefault = [];
// English
$langCode = 'en';
$cookiesDefault['title'][$langCode] = '<strong>Your cookie settings</strong>';
$cookiesDefault['text'][$langCode] = '<p>This store asks you to accept cookies for performance, social media and advertising purposes. Social media and advertising cookies of third parties are used to offer you social media functionalities and personalized ads. Do you accept these cookies and the processing of personal data involved?</p>';
// Spanish
$langCode = 'es';
$cookiesDefault['title'][$langCode] = '<strong>Tu configuración de cookies</strong>';
$cookiesDefault['text'][$langCode] = '<p>Esta tienda te pide que aceptes cookies para fines de rendimiento, redes sociales y publicidad. Las redes sociales y las cookies publicitarias de terceros se utilizan para ofrecerte funciones de redes sociales y anuncios personalizados. ¿Aceptas estas cookies y el procesamiento de datos personales involucrados?</p>';
// French
$langCode = 'fr';
$cookiesDefault['title'][$langCode] = '<strong>Vos paramètres de cookies</strong>';
$cookiesDefault['text'][$langCode] = '<p>Ce magasin vous demande d\'accepter les cookies afin d\'optimiser les performances, les fonctionnalités des réseaux sociaux et la pertinence de la publicité. Les cookies tiers liés aux réseaux sociaux et à la publicité sont utilisés pour vous offrir des fonctionnalités optimisées sur les réseaux sociaux, ainsi que des publicités personnalisées. Acceptez-vous ces cookies ainsi que les implications associées à l\'utilisation de vos données personnelles ?</p>';
// French (Canada)
$langCode = 'qc';
$cookiesDefault['title'][$langCode] = '<strong>Vos paramètres de cookies</strong>';
$cookiesDefault['text'][$langCode] = '<p>Ce magasin vous demande d\'accepter les cookies afin d\'optimiser les performances, les fonctionnalités des réseaux sociaux et la pertinence de la publicité. Les cookies tiers liés aux réseaux sociaux et à la publicité sont utilisés pour vous offrir des fonctionnalités optimisées sur les réseaux sociaux, ainsi que des publicités personnalisées. Acceptez-vous ces cookies ainsi que les implications associées à l\'utilisation de vos données personnelles ?</p>';
// Polish
$langCode = 'pl';
$cookiesDefault['title'][$langCode] = '<strong>Ustawienia plików cookie</strong>';
$cookiesDefault['text'][$langCode] = '<p>Niniejsza witryna wykorzystuje pliki cookies w celu świadczenia usług na najwyższym poziomie i w sposób dostosowany do indywidualnych potrzeb. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w urządzeniu końcowym. Jeśli nie akceptujesz opuść tę stronę internetową.</p>';
// Romanian
$langCode = 'ro';
$cookiesDefault['title'][$langCode] = '<strong>Setările cookie-urilor</strong>';
$cookiesDefault['text'][$langCode] = '<p>Acest magazin vă solicită să acceptați cookie-uri pentru performanță, media și publicitate. Mediile sociale și cookie-urile de publicitate ale unor terțe părți sunt utilizate pentru a vă oferi funcții de social media și anunțuri personalizate. Acceptați aceste cookie-uri și procesarea datelor personale implicate?</p>';
// Portuguese
$langCode = 'pt';
$cookiesDefault['title'][$langCode] = '<strong>As tuas configurações de cookies</strong>';
$cookiesDefault['text'][$langCode] = '<p>Esta loja pede-te para aceitares cookies para efeitos de desempenho, redes sociais e publicidade. Os cookies de publicidade e de redes sociais de terceiros são utilizados para te oferecer funcionalidades sociais e anúncios personalizados. Aceitas estes cookies e o processamento de dados pessoais envolvidos?</p>';
// Slovak
$langCode = 'sk';
$cookiesDefault['title'][$langCode] = '<strong>Nastavenia súborov cookie</strong>';
$cookiesDefault['text'][$langCode] = '<p>Náš obchod používa súbory cookie za účelom zabezpečenia nevyhnutnej funkcionality stránok, sociálnych médií a marketingu. Súhlasíte s týmito súbormi cookies a spracovaním príslušných osobných údajov?</p>';
// Nederlands
$langCode = 'nl';
$cookiesDefault['title'][$langCode] = '<strong>Je cookie-instellingen</strong>';
$cookiesDefault['text'][$langCode] = '<p>Deze winkel vraagt je om cookies te accepteren voor betere prestaties en voor sociale-media- en advertentiedoeleinden. Er worden sociale-media- en advertentiecookies van derden gebruikt om je sociale-mediafunctionaliteit en persoonlijke advertenties te bieden. Accepteer je deze cookies en de bijbehorende verwerking van je persoonsgegevens?</p>';
// Deutsch
$langCode = 'de';
$cookiesDefault['title'][$langCode] = '<strong>Ihre Cookie-Einstellungen</strong>';
$cookiesDefault['text'][$langCode] = '<p>Für eine optimal Performance, eine reibungslose Verwendung sozialer Medien und aus Werbezwecken empfiehlt dir dieser Laden, der Verwendung von Cookies zuzustimmen. Durch Cookies von sozialen Medien und Werbecookies von Drittparteien hast du Zugriff auf Social-Media-Funktionen und erhältst personalisierte Werbung. Stimmst du der Verwendung dieser Cookies und der damit verbundenen Verarbeitung deiner persönlichen Daten zu?</p>';
// Greek
$langCode = 'gr';
$cookiesDefault['title'][$langCode] = '<strong>Οι ρυθμίσεις cookie σας</strong>';
$cookiesDefault['text'][$langCode] = '<p>Αυτό το κατάστημα σου ζητά να αποδεχτείς τα cookies για σκοπούς απόδοσης, κοινωνικής δικτύωσης και διαφήμισης. Τα cookies κοινωνικής δικτύωσης και διαφήμισης παρέχονται από τρίτα μέρη για να σου προσφέρουν λειτουργίες κοινωνικής δικτύωσης και εξατομικευμένες διαφημίσεις. Αποδέχεσαι αυτά τα cookies και την συνεπαγόμενη επεξεργασία προσωπικών δεδομένων;</p>';
// Italian
$langCode = 'it';
$cookiesDefault['title'][$langCode] = '<strong>Impostazioni dei cookie</strong>';
$cookiesDefault['text'][$langCode] = '<p>Questo negozio richiede di accettare i cookie per scopi legati a prestazioni, social media e annunci pubblicitari. I cookie di terze parti per social media e a scopo pubblicitario vengono utilizzati per offrire funzionalità social e annunci pubblicitari personalizzati. Accetti i cookie e l\'elaborazione dei dati personali interessati?</p>';
// Svenska
$langCode = 'sv';
$cookiesDefault['title'][$langCode] = '<strong>Dina cookieinställningar</strong>';
$cookiesDefault['text'][$langCode] = '<p>Denna butik ber dig att godkänna cookies för anpassning av prestanda, sociala medier och marknadsföring. Tredjepartscookies för sociala medier och marknadsföring används för att erbjuda anpassade annonser och funktioner för sociala medier. Godkänner du dessa cookies och behandlingen av berörda personuppgifter?</p>';
// Dansk
$langCode = 'da';
$cookiesDefault['title'][$langCode] = '<strong>Dine indstillinger for cookies</strong>';
$cookiesDefault['text'][$langCode] = '<p>Denne butik beder dig om at acceptere cookies til performance, sociale medier og reklameformål. Sociale medier og tredjeparts annoncecookies bruges til at tilbyde dig funktionaliteter og tilpassede annoncer på sociale medier. Vil du acceptere disse cookies og behandlingen af implicerede personoplysninger?</p>';
// Norsk
$langCode = 'no';
$cookiesDefault['title'][$langCode] = '<strong>Dine innstillinger for informasjonskapsler</strong>';
$cookiesDefault['text'][$langCode] = '<p>Denne butikken spør om du godtar informasjonskapsler for ytelsesformål, sosiale medier og annonsering. Informasjonskapsler for sosiale medier og annonsering fra tredjeparter brukes for å tilby deg funksjoner på sosiale medier og tilpassede annonser. Godtar du disse informasjonskapslene og den involverte behandlingen av personopplysningene dine?</p>';
// ČEŠTINA
$langCode = 'cs';
$cookiesDefault['title'][$langCode] = '<strong>Tvá nastavení souborů cookie</strong>';
$cookiesDefault['text'][$langCode] = '<p>Společnost tento obchod žádá o tvůj souhlas s používáním souborů cookie pro účely výkonu, sociálních médií a reklamy. Sociální média a reklamní soubory cookie třetích stran používáme k tomu, abychom ti mohli nabízet funkce sociálních médií a přizpůsobenou reklamu. Další informace nebo doplnění nastavení získáš kliknutím na tlačítko „Více informací“ nebo otevřením nabídky „Nastavení souborů cookie“ v dolní části webové stránky. Podrobnější informace o souborech cookie a zpracování tvých osobních údajů najdeš v našich Zásadách ochrany osobních údajů a používání souborů cookie. Souhlasíš s používáním souborů cookie a zpracováním souvisejících osobních údajů?</p>';
// Magyar
$langCode = 'hu';
$cookiesDefault['title'][$langCode] = '<strong>Cookie-beállítások</strong>';
$cookiesDefault['text'][$langCode] = '<p>Ez a bolt a megfelelő teljesítmény és a közösségimédia-funkciók biztosításához, valamint a hirdetések megjelenítéséhez kéri a cookie-k elfogadását. A harmadik felek közösségimédia- és hirdetési cookie-jai használatával biztosítunk közösségimédia-funkciókat, és jelenítünk meg személyre szabott reklámokat. Ha több információra van szükséged, vagy kiegészítenéd a beállításaidat, kattints a További információ gombra, vagy keresd fel a webhely alsó részéről elérhető Cookie-beállítások területet. A cookie-kkal kapcsolatos további információért, valamint a személyes adatok feldolgozásának ismertetéséért tekintsd meg Adatvédelmi és cookie-kra vonatkozó szabályzatunkat. Elfogadod ezeket a cookie-kat és az érintett személyes adatok feldolgozását?</p>';
$cookiesDefault['cookie'][CookiesPlusFinality::NECESSARY_COOKIE] = CookiesPlusFinality::getDefaultValues(CookiesPlusFinality::NECESSARY_COOKIE);
$cookiesDefault['cookie'][CookiesPlusFinality::PREFERENCE_COOKIE] = CookiesPlusFinality::getDefaultValues(CookiesPlusFinality::PREFERENCE_COOKIE);
$cookiesDefault['cookie'][CookiesPlusFinality::STATISTIC_COOKIE] = CookiesPlusFinality::getDefaultValues(CookiesPlusFinality::STATISTIC_COOKIE);
$cookiesDefault['cookie'][CookiesPlusFinality::MARKETING_COOKIE] = CookiesPlusFinality::getDefaultValues(CookiesPlusFinality::MARKETING_COOKIE);
// $cookiesDefault['cookie'][CookiesPlusFinality::UNCLASSIFIED_COOKIE] = CookiesPlusFinality::getDefaultValues(CookiesPlusFinality::UNCLASSIFIED_COOKIE);
// $cookiesDefault['cookie'][CookiesPlusFinality::PERFORMANCE_COOKIE] = CookiesPlusFinality::getDefaultValues(CookiesPlusFinality::PERFORMANCE_COOKIE);
$fields = [];
$languages = Language::getLanguages(false);
foreach ($languages as $lang) {
$languageCode = strtok($lang['language_code'], '-');
$fields['C_P_TITLE'][$lang['id_lang']] = (isset($cookiesDefault['title'][$languageCode]) && $cookiesDefault['title'][$languageCode]) ? $cookiesDefault['title'][$languageCode] : $cookiesDefault['title']['en'];
$fields['C_P_TEXT_BASIC'][$lang['id_lang']] = (isset($cookiesDefault['text'][$languageCode]) && $cookiesDefault['text'][$languageCode]) ? $cookiesDefault['text'][$languageCode] : $cookiesDefault['text']['en'];
}
Configuration::updateValue('C_P_TITLE', $fields['C_P_TITLE'], true);
Configuration::updateValue('C_P_TEXT_BASIC', $fields['C_P_TEXT_BASIC'], true);
$modules = Module::getModulesOnDisk(true);
if (Shop::isFeatureActive()) {
$shops = Shop::getShops(false, null, true);
} else {
$shops = [1];
}
foreach ($shops as $shop) {
foreach ($cookiesDefault['cookie'] as $cookiesPlusFinalityId => $cookieDefault) {
$cookiesPlusFinality = new CookiesPlusFinality();
$cookiesPlusFinality->id_shop = $shop;
$cookiesPlusFinality->technical = (isset($cookieDefault['technical']) && $cookieDefault['technical']) ? $cookieDefault['technical'] : 0;
$cookiesPlusFinality->active = (isset($cookieDefault['active']) && $cookieDefault['active']) ? $cookieDefault['active'] : 0;
$cookiesPlusFinality->position = $cookieDefault['position'];
if (isset($cookieDefault['modules']) && $cookieDefault['modules']) {
$modulesIds = [];
foreach ($modules as $module) {
if ($module->installed && in_array($module->name, $cookieDefault['modules'])) {
$modulesIds[] = $module->id;
}
}
$cookiesPlusFinality->modules = json_encode($modulesIds);
// If store has any of the modules, enable this finality
if ($modulesIds) {
$cookiesPlusFinality->active = 1;
}
}
foreach ($languages as $lang) {
$languageCode = strtok($lang['language_code'], '-');
$cookiesPlusFinality->name[$lang['id_lang']] = (isset($cookieDefault['name'][$languageCode]) && $cookieDefault['name'][$languageCode]) ? $cookieDefault['name'][$languageCode] : $cookieDefault['name']['en'];
$cookiesPlusFinality->description[$lang['id_lang']] = (isset($cookieDefault['description'][$languageCode]) && $cookieDefault['description'][$languageCode]) ? $cookieDefault['description'][$languageCode] : $cookieDefault['description']['en'];
}
$result = $cookiesPlusFinality->save();
if ($cookiesPlusFinalityId === CookiesPlusFinality::STATISTIC_COOKIE) {
$cookiesPlusStatisticFinalityId = $cookiesPlusFinality->id;
}
if ($cookiesPlusFinalityId === CookiesPlusFinality::MARKETING_COOKIE) {
$cookiesPlusMarketingFinalityId = $cookiesPlusFinality->id;
}
if (!$result) {
return false;
}
if (isset($cookieDefault['cookies']) && $cookieDefault['cookies']) {
foreach ($cookieDefault['cookies'] as $cookie) {
$cookiesPlusCookie = new CookiesPlusCookie();
$cookiesPlusCookie->id_shop = $shop;
$cookiesPlusCookie->id_cookiesplus_finality = $cookiesPlusFinality->id;
$cookiesPlusCookie->active = $cookie['active'];
$cookiesPlusCookie->name = $cookie['name'];
$cookiesPlusCookie->provider = isset($cookie['provider']) ? $cookie['provider'] : '';
$cookiesPlusCookie->provider_url = isset($cookie['provider_url']) ? $cookie['provider_url'] : '';
// If store has any of the modules, enable this finality
if (isset($cookie['modules']) && $cookie['modules']) {
foreach ($modules as $module) {
if ($module->installed && isset($module->name) && in_array($module->name, $cookie['modules'])) {
$cookiesPlusCookie->active = 1;
$cookiesPlusFinality = new CookiesPlusFinality($cookiesPlusFinality->id);
$cookiesPlusFinality->active = 1;
// $cookiesPlusFinality->save();
break;
}
}
}
foreach ($languages as $lang) {
$languageCode = strtok($lang['language_code'], '-');
if (isset($cookie['purpose']['en'])) {
$cookiesPlusCookie->purpose[$lang['id_lang']] = (isset($cookie['purpose'][$languageCode]) && $cookie['purpose'][$languageCode]) ? $cookie['purpose'][$languageCode] : $cookie['purpose']['en'];
}
if (isset($cookie['expiry']['en'])) {
$cookiesPlusCookie->expiry[$lang['id_lang']] = (isset($cookie['expiry'][$languageCode]) && $cookie['expiry'][$languageCode]) ? $cookie['expiry'][$languageCode] : $cookie['expiry']['en'];
}
}
$cookiesPlusCookie->save();
}
}
}
// GTM
$gtm = [
$cookiesPlusStatisticFinalityId => [
'cookiesPlusFinality' => $cookiesPlusStatisticFinalityId,
'gtmFinality' => [
'analytics_storage' => true,
],
'firingEvent' => '',
],
$cookiesPlusMarketingFinalityId => [
'cookiesPlusFinality' => $cookiesPlusMarketingFinalityId,
'gtmFinality' => [
'ad_storage' => true,
'ad_user_data' => true,
'ad_personalization' => true,
],
'firingEvent' => '',
],
];
$gtm = json_encode($gtm);
Configuration::updateValue('C_P_GTM_CONSENT', $gtm, false, null, $shop);
}
return true;
}
public function getContent()
{
Tools::redirectAdmin('index.php?controller=AdminCookiesPlusConfiguration&token=' . Tools::getAdminTokenLite('AdminCookiesPlusConfiguration'));
}
public function getWarnings($getAll = true)
{
$warnings = [];
if (Configuration::get('PS_DISABLE_NON_NATIVE_MODULE')) {
$warnings[] = sprintf($this->l('%1$s "%2$s" at %3$s - %4$s'), $this->l('Disable'), $this->l('Disable non PrestaShop modules'), $this->l('Advanced Parameters'), $this->l('Performance'));
}
if (Configuration::get('PS_DISABLE_OVERRIDES')) {
$warnings[] = sprintf($this->l('%1$s "%2$s" at %3$s - %4$s'), $this->l('Disable'), $this->l('Disable all overrides'), $this->l('Advanced Parameters'), $this->l('Performance'));
}
$cookiesPlusFinalitiesList = CookiesPlusFinality::getCookiesPlusFinalities();
$atLeastOneFinalityNonTechnical = false;
$atLeastOneFinalityTechnical = false;
foreach ($cookiesPlusFinalitiesList as $cookiesPlusFinality) {
if ($cookiesPlusFinality['active'] && $cookiesPlusFinality['technical']) {
$atLeastOneFinalityTechnical = true;
}
if ($cookiesPlusFinality['active'] && !$cookiesPlusFinality['technical']) {
$atLeastOneFinalityNonTechnical = true;
}
}
// If there's any technical cookie finality enabled
if (!$atLeastOneFinalityTechnical) {
$warnings[] = $this->l('Please check "Cookie finalities". You need to enable at least one technical cookie finality.');
}
// If there's only technical cookies, there's no need to display the warnings
if (!$atLeastOneFinalityNonTechnical) {
$warnings[] = $this->l('Please check "Cookie finalities". You need to enable at least one non-technical cookie finality. If there\'s only technical cookies finalities enabled, the cookie notice will not be displayed');
}
/*if (Module::isInstalled('litespeedcache')) {
$warnings[] = $this->l('It seems that you are using litespeedcache cache. An additional configuration in this module may be required.');
}
if (Module::isInstalled('stadvancedcache')) {
$warnings[] = $this->l('It seems that you are using stadvancedcache cache. An additional configuration in this module may be required.');
}
if (Module::isInstalled('jprestaspeedpack')) {
$warnings[] = $this->l('It seems that you are using jprestaspeedpack cache. An additional configuration in this module may be required.');
}*/
if (Module::isInstalled('litespeedcache')
|| Module::isInstalled('stadvancedcache')
|| Module::isInstalled('jprestaspeedpack')
|| Module::isInstalled('pagecache')) {
$warnings[] = $this->l('If you are using a cache module please ensure that the cookies module is working correctly.');
}
if (count($warnings) && version_compare(_PS_VERSION_, '1.6.1', '<')) {
return $warnings[0];
}
if (!$getAll && count($warnings)) {
return $warnings[0];
}
return $warnings;
}
public function getModuleList()
{
$query = 'SELECT m.`id_module`, m.`name`
FROM `' . _DB_PREFIX_ . 'module` m';
$module_list = Db::getInstance()->executeS($query);
foreach ($module_list as $key => &$module) {
$module['displayName'] = Module::getModuleName($module['name']);
if ((int) $module['id_module'] === 0) {
unset($module_list[$key]);
}
if ($module['name'] === $this->name) {
unset($module_list[$key]);
}
}
unset($module);
usort($module_list, static function ($a, $b) {
return strnatcasecmp($a['displayName'], $b['displayName']);
});
return $module_list;
}
protected static function executeModule()
{
if (!Configuration::get('C_P_ENABLE')) {
return false;
}
// Validate allowed IPs
if (Configuration::get('C_P_DEBUG') && !self::onlyIPDebug()) {
return false;
}
// Validate user agent
if (self::byPassUserAgent()) {
return false;
}
// Validate disallow IPs
if (self::bypassIP()) {
return false;
}
return true;
}
protected static function getGeo()
{
// Don't display outside EU
if (Configuration::get('PS_GEOLOCATION_ENABLED')
&& !Configuration::get('C_P_GEO')
&& !in_array(Tools::getRemoteAddr(), ['localhost', '127.0.0.1', '::1'])) {
// Check if Maxmind Database exists
if (@filemtime(_PS_GEOIP_DIR_ . _PS_GEOIP_CITY_FILE_)) {
if (version_compare(_PS_VERSION_, '1.7', '<')) {
include_once _PS_GEOIP_DIR_ . 'geoipcity.inc';
$gi = geoip_open(realpath(_PS_GEOIP_DIR_ . _PS_GEOIP_CITY_FILE_), GEOIP_STANDARD);
$record = geoip_record_by_addr($gi, Tools::getRemoteAddr());
if (is_object($record)
&& $record->continent_code
&& $record->continent_code !== 'EU') {
return false;
}
} else {
$reader = new GeoIp2\Database\Reader(_PS_GEOIP_DIR_ . _PS_GEOIP_CITY_FILE_);
try {
$record = $reader->city(Tools::getRemoteAddr());
} catch (GeoIp2\Exception\AddressNotFoundException $e) {
$record = null;
}
if (is_object($record)
&& $record->continent->code
&& $record->continent->code !== 'EU') {
return false;
}
}
}
}
return true;
}
protected static function byPassUserAgent()
{
if (isset($_SERVER['HTTP_USER_AGENT'])
&& Configuration::get('C_P_BOTS')
&& preg_match('/' . Configuration::get('C_P_BOTS') . '/i', $_SERVER['HTTP_USER_AGENT'])) {
return true;
}
return false;
}
protected static function bypassIP()
{
if (Configuration::get('C_P_IPS')
&& in_array(Tools::getRemoteAddr(), explode('|', Configuration::get('C_P_IPS')))) {
return true;
}
return false;
}
protected static function onlyIPDebug()
{
if (!Configuration::get('C_P_IPS_DEBUG')) {
return true;
}
if (in_array(Tools::getRemoteAddr(), explode('|', Configuration::get('C_P_IPS_DEBUG')))) {
return true;
}
return false;
}
public function getCookiesPlusCookiesList()
{
$idCookiesPlusFinality = (int) Tools::getValue('id_cookiesplus_finality');
if (!Tools::getIsset('addcookiesplus_finality') && !$idCookiesPlusFinality) {
return $this->displayError('Error loading cookies');
}
$cookiesPlusCookiesList = CookiesPlusCookie::getCookiesPlusCookies($idCookiesPlusFinality, null, false, $this->context->shop->id);
$fields_list = [
'active' => [
'title' => $this->l('Enabled'),
'active' => 'active',
'type' => 'bool',
],
'name' => [
'title' => $this->l('Cookie name'),
'filter_key' => 'a!name',
],
'provider' => [
'title' => $this->l('Provider'),
],
'purpose' => [
'title' => $this->l('Purpose'),
'callback' => 'getCookiePurposeCallback',
'callback_object' => 'CookiesPlusCookie',
],
'expiry' => [
'title' => $this->l('Expiry'),
],
];
$helperList = new HelperList();
$helperList->shopLinkType = '';
$helperList->simple_header = false;
$helperList->show_toolbar = true;
$helperList->module = $this;
$helperList->actions = ['edit', 'deletecookie'];
$helperList->identifier = 'id_cookiesplus_cookie';
$helperList->table = 'cookiesplus_cookie';
$helperList->token = Tools::getAdminTokenLite('AdminCookiesPlusCookies');
$helperList->currentIndex = $this->context->link->getAdminLink('AdminCookiesPlusCookies', false) . '&back=1&id_cookiesplus_finality=' . (int) Tools::getValue('id_cookiesplus_finality');
$helperList->title = $this->l('Cookies detail');
if (!Tools::getIsset('addcookiesplus_finality')) {
$helperList->toolbar_btn['new'] = [
'href' => $helperList->currentIndex . '&add' . $helperList->table . '&token=' . $helperList->token . '&id_cookiesplus_finality=' . Tools::getValue('id_cookiesplus_finality'),
'desc' => $this->l('Add new'),
];
}
$helperList->listTotal = count($cookiesPlusCookiesList);
return $helperList->generateList($cookiesPlusCookiesList, $fields_list);
}
public function displayDeleteCookieLink($token = null, $id = null, $name = null)
{
$tpl = $this->context->smarty->createTemplate('helpers/list/list_action_delete.tpl');
$tpl->assign([
'href' => $this->context->link->getAdminLink('AdminCookiesPlusCookies', false) . '&id_cookiesplus_cookie=' . $id . '&deletecookiesplus_cookie&token=' . $token,
'confirm' => $this->l('Delete the selected item?') . $name,
'action' => $this->l('Delete'),
'consent_hash' => $id,
]);
return $tpl->fetch();
}
/* Hooks */
public function hookDisplayAfterTitle($params)
{
return $this->hookDisplayAfterTitleTag($params);
}
public function hookDisplayAfterTitleTag()
{
if (Module::isInstalled('cdc_googletagmanager')) {
$html = '';
if (Configuration::get('C_P_GTM_ENABLE')) {
$cookiesPlusCookiePreferences = self::getCookiesPlusCookiePreferences();
$gtmConsents = json_decode(Configuration::get('C_P_GTM_CONSENT'), true);
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities((int) $this->context->language->id, true);
$gtm = [];
foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
$index = 'cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality'];
if (isset($cookiesPlusCookiePreferences[$index], $gtmConsents[(int) $cookiesPlusFinality['id_cookiesplus_finality']])) {
foreach (array_keys($gtmConsents[(int)$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality']) as $gtmFinality) {
if ($cookiesPlusCookiePreferences[$index] === 'on') {
if (isset($gtmConsents[(int)$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'][$gtmFinality])
&& $gtmConsents[(int)$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'][$gtmFinality]) {
$gtm[(int)$cookiesPlusFinality['id_cookiesplus_finality']][$gtmFinality] = true;
} else {
$gtm[(int)$cookiesPlusFinality['id_cookiesplus_finality']][$gtmFinality] = false;
}
} else {
$gtm[(int)$cookiesPlusFinality['id_cookiesplus_finality']][$gtmFinality] = false;
}
}
}
}
$this->context->smarty->assign([
'gtm' => $gtm,
]);
$html .= $this->context->smarty->fetch($this->local_path . 'views/templates/hook/gtm_consentmode.tpl');
}
if (Configuration::get('C_P_GTM_ENABLE')) {
$html .= Configuration::get('C_P_GTM_HEAD');
} else {
$random = Tools::substr(md5(microtime()), 0, 10);
$divName = 'hookDisplayAfterTitleTag_' . $this->id . '_' . $random;
$this->context->smarty->assign([
'divName' => $divName,
'id_module' => $this->id,
'finalities' => implode(',', array_keys(json_decode(Configuration::get('C_P_GTM_FIRE_CONSENT'), true) ?? []) ?: []),
'script' => json_encode(Configuration::get('C_P_GTM_HEAD')),
'js' => '[]',
'css' => '[]',
]);
$html .= $this->context->smarty->fetch($this->local_path . 'views/templates/hook/hookmoduledata.tpl');
}
return $html;
}
}
/* Don't place in this header anything that can NOT be cachable */
public function hookHeader()
{
return $this->hookDisplayHeader();
}
public function hookDisplayHeader()
{
$cookiesPlusCookiePreferences = self::getCookiesPlusCookiePreferences();
if (isset($cookiesPlusCookiePreferences['consent_date'])
&& date('Y-m-d H:i', strtotime(Configuration::get('C_P_REVOKE_CONSENT'))) > date('Y-m-d H:i', strtotime($cookiesPlusCookiePreferences['consent_date']))) {
$this->resetCookiesPlusPreferences();
}
// Check if consent file exists
if (Configuration::get('C_P_SAVE_CONSENT')) {
if (isset($cookiesPlusCookiePreferences['consent_hash'])) {
if (!CookiesPlusUserConsent::getCookiesPlusUserConsentDataByHash($cookiesPlusCookiePreferences['consent_hash'])) {
$this->resetCookiesPlusPreferences();
}
}
}
$this->context->controller->addCSS(_MODULE_DIR_ . $this->name . '/views/css/cookiesplus.css');
if (Configuration::get('C_P_MATERIAL_ICONS')) {
$this->context->controller->addCSS(_MODULE_DIR_ . $this->name . '/views/css/cookiesplus-material-icons.css');
// $html .= '<link rel="preload" href="'._MODULE_DIR_ . $this->name . '/views/css/cookiesplus-material-icons.css'.'" as="style" crossorigin="anonymous" />';
}
if (version_compare(_PS_VERSION_, '1.7', '<')) {
$this->context->controller->addJS(_MODULE_DIR_ . $this->name . '/views/js/cookiesplus-front.js');
} else {
$this->context->controller->registerJavascript(
'cookiesplus-front',
'modules/' . $this->name . '/views/js/cookiesplus-front.js',
[
'attributes' => 'async',
]
);
}
// Just assign to smarty, in case user add an IF condition in template for a custom script
$this->context->smarty->assign([
'C_P_COOKIE_VALUE' => (array) $cookiesPlusCookiePreferences,
]);
$this->context->smarty->assign([
'C_P_CSS' => Configuration::get('C_P_CSS'),
'C_P_BACKGROUND_COLOR' => Configuration::get('C_P_BACKGROUND_COLOR'),
'C_P_FONT_COLOR' => Configuration::get('C_P_FONT_COLOR'),
'C_P_BUTTON_POSITION' => Configuration::get('C_P_BUTTON_POSITION'),
'C_P_ACCEPT_DISPLAY' => Configuration::get('C_P_ACCEPT_DISPLAY'),
'C_P_ACCEPT_BACKGROUND_COLOR' => Configuration::get('C_P_ACCEPT_BACKGROUND_COLOR'),
'C_P_ACCEPT_BORDER_COLOR' => Configuration::get('C_P_ACCEPT_BORDER_COLOR'),
'C_P_ACCEPT_FONT_COLOR' => Configuration::get('C_P_ACCEPT_FONT_COLOR'),
'C_P_ACCEPT_FONT_SIZE' => Configuration::get('C_P_ACCEPT_FONT_SIZE'),
'C_P_ACCEPT_PADDING' => Configuration::get('C_P_ACCEPT_PADDING'),
'C_P_MORE_INFO_DISPLAY' => Configuration::get('C_P_MORE_INFO_DISPLAY'),
'C_P_MORE_INFO_BACKGROUND_COLOR' => Configuration::get('C_P_MORE_INFO_BACKGROUND_COLOR'),
'C_P_MORE_INFO_BORDER_COLOR' => Configuration::get('C_P_MORE_INFO_BORDER_COLOR'),
'C_P_MORE_INFO_FONT_COLOR' => Configuration::get('C_P_MORE_INFO_FONT_COLOR'),
'C_P_MORE_INFO_FONT_SIZE' => Configuration::get('C_P_MORE_INFO_FONT_SIZE'),
'C_P_MORE_INFO_PADDING' => Configuration::get('C_P_MORE_INFO_PADDING'),
'C_P_REJECT_DISPLAY' => Configuration::get('C_P_REJECT_DISPLAY'),
'C_P_REJECT_BACKGROUND_COLOR' => Configuration::get('C_P_REJECT_BACKGROUND_COLOR'),
'C_P_REJECT_BORDER_COLOR' => Configuration::get('C_P_REJECT_BORDER_COLOR'),
'C_P_REJECT_FONT_COLOR' => Configuration::get('C_P_REJECT_FONT_COLOR'),
'C_P_REJECT_FONT_SIZE' => Configuration::get('C_P_REJECT_FONT_SIZE'),
'C_P_REJECT_PADDING' => Configuration::get('C_P_REJECT_PADDING'),
'C_P_SAVE_BACKGROUND_COLOR' => Configuration::get('C_P_SAVE_BACKGROUND_COLOR'),
'C_P_SAVE_BORDER_COLOR' => Configuration::get('C_P_SAVE_BORDER_COLOR'),
'C_P_SAVE_FONT_COLOR' => Configuration::get('C_P_SAVE_FONT_COLOR'),
'C_P_SAVE_FONT_SIZE' => Configuration::get('C_P_SAVE_FONT_SIZE'),
'C_P_SAVE_PADDING' => Configuration::get('C_P_SAVE_PADDING'),
'C_P_MATERIAL_ICONS_LIBRARY' => Configuration::get('C_P_MATERIAL_ICONS_LIBRARY'),
'C_P_ICONS' => Configuration::get('C_P_ICONS'),
'C_P_TAB_ENABLED' => Configuration::get('C_P_TAB_ENABLED'),
'C_P_TAB_POSITION' => Configuration::get('C_P_TAB_POSITION'),
'C_P_TAB_BACKGROUND_COLOR' => Configuration::get('C_P_TAB_BACKGROUND_COLOR'),
'C_P_TAB_FONT_COLOR' => Configuration::get('C_P_TAB_FONT_COLOR'),
]);
$html = $this->context->smarty->fetch($this->local_path . 'views/templates/hook/cookies-style.tpl');
if (!Module::isInstalled('cdc_googletagmanager')) {
if (Configuration::get('C_P_GTM_ENABLE')) {
$gtmConsents = json_decode(Configuration::get('C_P_GTM_CONSENT'), true);
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities((int) $this->context->language->id, true);
$gtm = [];
foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
$index = 'cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality'];
if (isset($cookiesPlusCookiePreferences[$index], $gtmConsents[(int) $cookiesPlusFinality['id_cookiesplus_finality']])) {
foreach (array_keys($gtmConsents[(int)$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality']) as $gtmFinality) {
if ($cookiesPlusCookiePreferences[$index] === 'on') {
if (isset($gtmConsents[(int)$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'][$gtmFinality])
&& $gtmConsents[(int)$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'][$gtmFinality]) {
$gtm[(int)$cookiesPlusFinality['id_cookiesplus_finality']][$gtmFinality] = true;
} else {
$gtm[(int)$cookiesPlusFinality['id_cookiesplus_finality']][$gtmFinality] = false;
}
} else {
$gtm[(int)$cookiesPlusFinality['id_cookiesplus_finality']][$gtmFinality] = false;
}
}
}
}
if (!empty($gtm)) {
$this->context->smarty->assign([
'gtm' => call_user_func_array('array_merge', $gtm),
]);
}
$html .= $this->context->smarty->fetch($this->local_path . 'views/templates/hook/gtm_consentmode.tpl');
}
if (Configuration::get('C_P_GTM_ENABLE')) {
$html .= Configuration::get('C_P_GTM_HEAD');
} elseif (Configuration::get('C_P_GTM_FIRE_CONSENT')) {
$random = Tools::substr(md5(microtime()), 0, 10);
$divName = 'hookDisplayHeader' . $this->id . '_' . $random;
$this->context->smarty->assign([
'divName' => $divName,
'id_module' => $this->id,
'finalities' => implode(',', array_keys(json_decode(Configuration::get('C_P_GTM_FIRE_CONSENT'), true)) ?: []),
'script' => json_encode(Configuration::get('C_P_GTM_HEAD')),
'js' => '[]',
'css' => '[]',
]);
$html .= $this->context->smarty->fetch($this->local_path . 'views/templates/hook/hookmoduledata.tpl');
}
}
return $html;
}
public function hookDisplayAfterBodyOpeningTag()
{
$html = '';
if (Configuration::get('C_P_GTM_ENABLE')) {
$html .= Configuration::get('C_P_GTM_BODY');
} elseif (Configuration::get('C_P_GTM_FIRE_CONSENT')) {
$random = Tools::substr(md5(microtime()), 0, 10);
$divName = 'hookDisplayAfterBodyOpeningTag_' . $this->id . '_' . $random;
$this->context->smarty->assign([
'divName' => $divName,
'id_module' => $this->id,
'finalities' => implode(',', array_keys(json_decode(Configuration::get('C_P_GTM_FIRE_CONSENT'), true)) ?: []),
'script' => json_encode(Configuration::get('C_P_GTM_HEAD')),
'js' => '[]',
'css' => '[]',
]);
$html .= $this->context->smarty->fetch($this->local_path . 'views/templates/hook/hookmoduledata.tpl');
}
return $html;
}
public function hookDisplayCookiesHeader()
{
$this->hookDisplayHeader();
}
public function hookFooter()
{
$html = null;
$cookiesPlusPreferences = self::getCookiesPlusCookiePreferences();
// Don't display modal with Creative Elements editor
/*if (Tools::isSubmit('cp_type')) {
$displayModal = false;
}*/
// Get scripts from all finalities
$script = [];
$scriptNot = [];
$cookies = [];
$gtm = [];
$fb = [];
if (Configuration::get('C_P_GTM_ENABLE')) {
$gtmConsents = json_decode(Configuration::get('C_P_GTM_CONSENT'), true);
}
if (Configuration::get('C_P_FB_ENABLE')) {
$fbConsents = json_decode(Configuration::get('C_P_FB_CONSENT'), true);
}
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities((int) $this->context->language->id, true);
// $atLeastOneFinalityNonTechnical = false;
foreach ($cookiesPlusFinalities as &$cookiesPlusFinality) {
$cookiesPlusFinality['cookies'] = CookiesPlusCookie::getCookiesPlusCookies($cookiesPlusFinality['id_cookiesplus_finality'], (int) $this->context->language->id, true, $this->context->shop->id);
/*if ($cookiesPlusFinality['active'] && !$cookiesPlusFinality['technical']) {
$atLeastOneFinalityNonTechnical = true;
}*/
if ($cookiesPlusFinality['js_script']) {
// Strip <script> tags
// $cookiesPlusFinality['js_script'] = preg_replace('#<script[^>]*>([^<]+)</script>#', '$1', $cookiesPlusFinality['js_script']);
// Escape all chars
// $cookiesPlusFinality['js_script'] = str_replace('"', "'", $cookiesPlusFinality['js_script']);
/*$escapers = array("\\", "/", "\"", "\n", "\r", "\t", "\x08", "\x0c", "'",);
$replacements = array("\\\\", "\\/", "\\\"", "\\n", "\\r", "\\t", "\\f", "\\b", "\'");
$cookiesPlusFinality['js_script'] = str_replace($escapers, $replacements, $cookiesPlusFinality['js_script']);*/
// $cookiesPlusFinality['js_script'] = str_replace("\r", "\\r", $cookiesPlusFinality['js_script']);
// $cookiesPlusFinality['js_script'] = str_replace("\n", "\\n", $cookiesPlusFinality['js_script']);
// remove comments
// $cookiesPlusFinality['js_script'] = preg_replace('/<!--(.|\s)*?-->/', '', $cookiesPlusFinality['js_script']);
// remove tabs, spaces, newlines, etc.
// $cookiesPlusFinality['js_script'] = str_replace(array(PHP_EOL, "\t"), '', $cookiesPlusFinality['js_script']);
// $cookiesPlusFinality['js_script'] = preg_replace('/\v(?:[\v\h]+)/', '', $cookiesPlusFinality['js_script']);
/*$cookiesPlusFinality['js_script'] = str_replace("\n", '', $cookiesPlusFinality['js_script']);
$cookiesPlusFinality['js_script'] = str_replace("\r", '', $cookiesPlusFinality['js_script']);
$cookiesPlusFinality['js_script'] = str_replace("\t", '', $cookiesPlusFinality['js_script']);*/
// remove all spaces
// $cookiesPlusFinality['js_script'] = preg_replace('|\s\s+|', ' ', $cookiesPlusFinality['js_script']);
// Minify fails with <!--// -->
/*if (version_compare(_PS_VERSION_, '1.7', '>')) {
$script[(int)$cookiesPlusFinality['id_cookiesplus_finality']] = JSMin::minify($cookiesPlusFinality['js_script']);
} else {
$script[(int)$cookiesPlusFinality['id_cookiesplus_finality']] = $cookiesPlusFinality['js_script'];
}*/
$script[(int) $cookiesPlusFinality['id_cookiesplus_finality']] = $cookiesPlusFinality['js_script'];
}
if ($cookiesPlusFinality['js_not_script']) {
$scriptNot[(int) $cookiesPlusFinality['id_cookiesplus_finality']] = $cookiesPlusFinality['js_not_script'];
}
if ($cookiesPlusFinality['cookies']) {
$cookies[(int) $cookiesPlusFinality['id_cookiesplus_finality']] = $cookiesPlusFinality['cookies'];
}
if (Configuration::get('C_P_GTM_ENABLE')) {
if ($cookiesPlusFinality['technical']) {
continue;
}
if (isset($gtmConsents[(int) $cookiesPlusFinality['id_cookiesplus_finality']])) {
if (isset($gtmConsents[(int) $cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'])
&& $gtmConsents[(int) $cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality']) {
$gtm[(int) $cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'] = $gtmConsents[$cookiesPlusFinality['id_cookiesplus_finality']]['gtmFinality'];
$gtm[(int) $cookiesPlusFinality['id_cookiesplus_finality']]['firingEvent'] = $gtmConsents[$cookiesPlusFinality['id_cookiesplus_finality']]['firingEvent'];
}
}
}
if (Configuration::get('C_P_FB_ENABLE')) {
if ($cookiesPlusFinality['technical']) {
continue;
}
if (isset($fbConsents[(int) $cookiesPlusFinality['id_cookiesplus_finality']])) {
$fb[(int) $cookiesPlusFinality['id_cookiesplus_finality']] = 'true';
}
}
}
unset($cookiesPlusFinality);
// If there's only technical cookies, there's no need to display the warning
/*if (!$atLeastOneFinalityNonTechnical) {
$displayModal = false;
}*/
$script = json_encode($script);
$script = self::sanitizeJson($script);
$scriptNot = json_encode($scriptNot);
$scriptNot = self::sanitizeJson($scriptNot);
$cookies = json_encode($cookies);
$cookies = self::sanitizeJson($cookies);
$gtm = json_encode($gtm);
$gtm = self::sanitizeJson($gtm);
$fb = json_encode($fb);
$fb = self::sanitizeJson($fb);
/*$cookie = array();
if (isset($_COOKIE['cookiesplus'])) {
$cookie = json_decode($_COOKIE['cookiesplus'], true);
}
$cookieExpiryTime = time() + Configuration::get('C_P_EXPIRY') * 86400;
setcookie('cookiesplus', json_encode($cookie), $cookieExpiryTime, '/');
*/
$this->context->smarty->assign([
'C_P_REFRESH' => Configuration::get('C_P_REFRESH'),
'C_P_EXPIRY' => Configuration::get('C_P_EXPIRY') ?: 365,
'C_P_CMS_PAGE' => (int) Configuration::get('C_P_CMS_PAGE'),
'C_P_DATE' => date('Y-m-d H:i', time()),
'C_P_COOKIE_VALUE_JSON' => $cookiesPlusPreferences ? json_encode($cookiesPlusPreferences) : '{}', // empty JSON
'C_P_OVERLAY' => Configuration::get('C_P_OVERLAY'),
'C_P_OVERLAY_OPACITY' => Configuration::get('C_P_OVERLAY_OPACITY'),
'C_P_NOT_AVAILABLE_OUTSIDE_EU' => self::getGeo(), // Don't display modal outside EU
'C_P_FINALITIES_COUNT' => count($cookiesPlusFinalities),
'C_P_SCRIPT' => $script,
'C_P_SCRIPT_NOT' => $scriptNot,
'C_P_COOKIES' => $cookies,
'C_P_GTM' => $gtm,
'C_P_FB' => $fb,
]);
$html .= $this->context->smarty->fetch($this->local_path . 'views/templates/hook/cookies-notice-vars.tpl');
if (!self::executeModule()) {
return $html;
}
$cpClass = '';
if (Configuration::get('C_P_WIDTH') == '100') {
$cpClass = 'col-12 col-xs-12';
} elseif (Configuration::get('C_P_WIDTH') == '75') {
if (Configuration::get('C_P_BUTTON_POSITION') == '2') {
$cpClass = 'col-11 col-xs-11 col-md-9';
} else {
$cpClass = 'col-12 col-xs-12 col-md-9';
}
} elseif (Configuration::get('C_P_WIDTH') == '50') {
if (Configuration::get('C_P_BUTTON_POSITION') == '2') {
$cpClass = 'col-11 col-xs-11 col-md-9 col-xl-6';
} else {
$cpClass = 'col-12 col-xs-12 col-md-9 col-lg-6';
}
} elseif ((int) Configuration::get('C_P_WIDTH') === 25) {
$cpClass = 'col-12 col-xs-12 col-md-6 col-lg-4 col-xl-3';
}
if ($this->context->language->id) {
$idLang = $this->context->language->id;
} elseif ($this->context->cookie->id_lang) {
$idLang = $this->context->cookie->id_lang;
} else {
$idLang = (int) Configuration::get('PS_LANG_DEFAULT');
}
$this->context->smarty->assign([
'link' => Context::getContext()->link,
'C_P_COOKIE_VALUE' => (array) $cookiesPlusPreferences,
'C_P_POSITION' => Configuration::get('C_P_POSITION'),
'C_P_WIDTH' => Configuration::get('C_P_WIDTH'),
'C_P_CLASS' => $cpClass,
'C_P_BACKGROUND_COLOR' => Configuration::get('C_P_BACKGROUND_COLOR'),
'C_P_FONT_COLOR' => Configuration::get('C_P_FONT_COLOR'),
'C_P_DISPLAY_TITLE' => Configuration::get('C_P_DISPLAY_TITLE'),
'C_P_TITLE' => Configuration::get('C_P_TITLE', $idLang),
'C_P_JS' => Configuration::get('C_P_JS'),
'C_P_TEXT_BASIC' => Configuration::get('C_P_TEXT_BASIC', $idLang),
'C_P_TEXT_REQUIRED' => Configuration::get('C_P_TEXT_REQUIRED', $idLang),
'C_P_TEXT_3RDPARTY' => Configuration::get('C_P_TEXT_3RDPARTY', $idLang),
'C_P_CMS_PAGE' => Configuration::get('C_P_CMS_PAGE'),
'C_P_BUTTON_POSITION' => Configuration::get('C_P_BUTTON_POSITION'),
'C_P_ACCEPT_DISPLAY' => Configuration::get('C_P_ACCEPT_DISPLAY'),
'C_P_ACCEPT_BACKGROUND_COLOR' => Configuration::get('C_P_ACCEPT_BACKGROUND_COLOR'),
'C_P_ACCEPT_BORDER_COLOR' => Configuration::get('C_P_ACCEPT_BORDER_COLOR'),
'C_P_ACCEPT_FONT_COLOR' => Configuration::get('C_P_ACCEPT_FONT_COLOR'),
'C_P_ACCEPT_FONT_SIZE' => Configuration::get('C_P_ACCEPT_FONT_SIZE'),
'C_P_ACCEPT_PADDING' => Configuration::get('C_P_ACCEPT_PADDING'),
'C_P_MORE_INFO_DISPLAY' => Configuration::get('C_P_MORE_INFO_DISPLAY'),
'C_P_MORE_INFO_BACKGROUND_COLOR' => Configuration::get('C_P_MORE_INFO_BACKGROUND_COLOR'),
'C_P_MORE_INFO_BORDER_COLOR' => Configuration::get('C_P_MORE_INFO_BORDER_COLOR'),
'C_P_MORE_INFO_FONT_COLOR' => Configuration::get('C_P_MORE_INFO_FONT_COLOR'),
'C_P_MORE_INFO_FONT_SIZE' => Configuration::get('C_P_MORE_INFO_FONT_SIZE'),
'C_P_MORE_INFO_PADDING' => Configuration::get('C_P_MORE_INFO_PADDING'),
'C_P_REJECT_DISPLAY' => Configuration::get('C_P_REJECT_DISPLAY'),
'C_P_REJECT_BACKGROUND_COLOR' => Configuration::get('C_P_REJECT_BACKGROUND_COLOR'),
'C_P_REJECT_BORDER_COLOR' => Configuration::get('C_P_REJECT_BORDER_COLOR'),
'C_P_REJECT_FONT_COLOR' => Configuration::get('C_P_REJECT_FONT_COLOR'),
'C_P_REJECT_FONT_SIZE' => Configuration::get('C_P_REJECT_FONT_SIZE'),
'C_P_REJECT_PADDING' => Configuration::get('C_P_REJECT_PADDING'),
'C_P_SAVE_BACKGROUND_COLOR' => Configuration::get('C_P_SAVE_BACKGROUND_COLOR'),
'C_P_SAVE_BORDER_COLOR' => Configuration::get('C_P_SAVE_BORDER_COLOR'),
'C_P_SAVE_FONT_COLOR' => Configuration::get('C_P_SAVE_FONT_COLOR'),
'C_P_SAVE_FONT_SIZE' => Configuration::get('C_P_SAVE_FONT_SIZE'),
'C_P_SAVE_PADDING' => Configuration::get('C_P_SAVE_PADDING'),
'C_P_MATERIAL_ICONS_LIBRARY' => Configuration::get('C_P_MATERIAL_ICONS_LIBRARY'),
'C_P_FINALITIES' => $cookiesPlusFinalities,
'C_P_ICONS' => Configuration::get('C_P_ICONS'),
'C_P_TAB_ENABLED' => Configuration::get('C_P_TAB_ENABLED'),
'C_P_TAB_POSITION' => Configuration::get('C_P_TAB_POSITION'),
'C_P_TAB_BACKGROUND_COLOR' => Configuration::get('C_P_TAB_BACKGROUND_COLOR'),
'C_P_TAB_FONT_COLOR' => Configuration::get('C_P_TAB_FONT_COLOR'),
'C_P_SAVE_CONSENT' => (int) Configuration::get('C_P_SAVE_CONSENT'),
'C_P_CONSENT_HASH' => (Configuration::get('C_P_SAVE_CONSENT') && isset($cookiesPlusPreferences['consent_hash'])) ? $cookiesPlusPreferences['consent_hash'] : '',
'C_P_CONSENT_DATE' => isset($cookiesPlusPreferences['consent_date']) ? $cookiesPlusPreferences['consent_date'] : '',
'C_P_REVOKE_CONSENT' => Tools::displayDate(date('Y-m-d', strtotime(Configuration::get('C_P_REVOKE_CONSENT'))), null, false),
'C_P_DISPLAY_DATE' => Configuration::get('C_P_DISPLAY_DATE'),
'C_P_DEFAULT_CONSENT' => Configuration::get('C_P_DEFAULT_CONSENT'),
'download_link' => isset($cookiesPlusPreferences['consent_hash']) ? $this->context->link->getModuleLink('cookiesplus', 'front') . '?hash=' . $cookiesPlusPreferences['consent_hash'] . '&getPdf' : '',
]);
$html .= $this->display(__FILE__, 'cookies-notice.tpl');
return $html;
}
public function hookDisplayMobileHeader()
{
return $this->hookDisplayHeader();
}
public function hookDisplayFooterLinks()
{
return $this->hookFooter();
}
public function hookDisplayBeforeBodyClosingTag()
{
return $this->hookFooter();
}
public function hookTmMegaLayoutFooter()
{
return $this->hookFooter();
}
public function hookBlockFooter1()
{
return $this->hookFooter();
}
public function hookDisplayFooterBefore()
{
return $this->hookFooter();
}
public function hookDisplayFooterAfter()
{
return $this->hookFooter();
}
public function hookDisplaySidebar()
{
return $this->hookFooter();
}
public function hookDisplayFooterNovOne()
{
return $this->hookFooter();
}
public function hookDisplayFooterNovTwo()
{
return $this->hookFooter();
}
public function hookDisplayBanner()
{
return $this->hookFooter();
}
public function hookDisplayCookies()
{
return $this->hookFooter();
}
public function hookDisplayMyAccountBlock()
{
if (!self::executeModule()) {
return;
}
if (!self::getGeo()) {
return;
}
if (version_compare(_PS_VERSION_, '1.7', '>=')) {
return $this->hookDisplayMyAccountBlockFooter();
}
}
public function hookDisplayMyAccountBlockFooter()
{
if (!self::executeModule()) {
return;
}
if (!self::getGeo()) {
return;
}
if (Configuration::get('C_P_ENABLE')) {
if (version_compare(_PS_VERSION_, '1.6', '<')) {
return $this->display(__FILE__, 'my-account-block-footer-15.tpl');
}
return $this->context->smarty->fetch($this->local_path . 'views/templates/hook/my-account-block-footer-17.tpl');
}
}
public function hookDisplayCustomerAccount()
{
if (!self::executeModule()) {
return;
}
if (!self::getGeo()) {
return;
}
if (Configuration::get('C_P_ENABLE')) {
if (version_compare(_PS_VERSION_, '1.6', '<')) {
return $this->display(__FILE__, 'customer_account_15.tpl');
}
if (version_compare(_PS_VERSION_, '1.7', '<')) {
return $this->display(__FILE__, 'customer_account_16.tpl');
}
$this->context->smarty->assign([
'C_P_MATERIAL_ICONS_LIBRARY' => Configuration::get('C_P_MATERIAL_ICONS_LIBRARY'),
]);
return $this->display(__FILE__, 'customer_account_17.tpl');
}
return false;
}
public function hookDisplayNav()
{
if (!self::executeModule()) {
return;
}
if (!self::getGeo()) {
return;
}
if (Configuration::get('C_P_ENABLE')) {
if (version_compare(_PS_VERSION_, '1.6', '<')) {
return $this->display(__FILE__, 'nav_16.tpl');
}
if (version_compare(_PS_VERSION_, '1.7', '<')) {
return $this->display(__FILE__, 'nav_16.tpl');
}
return $this->display(__FILE__, 'nav_17.tpl');
}
return false;
}
public function hookDisplayNav2()
{
if (!self::executeModule()) {
return;
}
if (!self::getGeo()) {
return;
}
return $this->hookDisplayNav();
}
public function hookDisplayTop()
{
return $this->hookFooter();
}
public function hookDisplayBackOfficeHeader()
{
if (version_compare(_PS_VERSION_, '1.7', '<')
&& method_exists($this->context->controller, 'addCSS')) {
$this->context->controller->addCSS($this->_path . 'views/css/menuTabIcon.css');
}
// Remove expired CookiesPlusUserConsent
$expiredCookiesPlusUserConsents = CookiesPlusUserConsent::getCookiesPlusUserConsentExpired($this->context->shop->id);
foreach ($expiredCookiesPlusUserConsents as $expiredCookiesPlusUserConsent) {
$expiredCookiesPlusUserConsent = new CookiesPlusUserConsent((int) $expiredCookiesPlusUserConsent['id_cookiesplus_user_consent']);
$expiredCookiesPlusUserConsent->delete();
}
}
public function hookActionHtaccessCreate()
{
$path = _PS_ROOT_DIR_ . '/.htaccess';
$specific_before = $specific_after = '';
if (file_exists($path)) {
$content = Tools::file_get_contents($path);
if (preg_match('#^(.*)\# ~~startcookiesplus~~.*\# ~~endcookiesplus~~[^\n]*(.*)$#s', $content, $m)) {
$specific_before = $m[1];
$specific_after = $m[2];
} else {
$specific_before = $content;
}
}
// Write .htaccess data
if (!$write_fd = @fopen($path, 'w')) {
return false;
}
if (method_exists('Module', 'resetStaticCache')) {
Module::resetStaticCache();
}
if (self::isEnabled($this->name)) {
// https://www.imd.guru/sistemas/html/evitar_que_enlacen_directamente_a_imagenes_en_tu_web-Hotlinking.html
fwrite($write_fd, "# ~~startcookiesplus~~ Cookies Plus module - Do not remove this comment\n");
fwrite($write_fd, "<IfModule LiteSpeed>\n");
fwrite($write_fd, "RewriteRule .* - [E=Cache-Vary:cookiesplus]\n");
fwrite($write_fd, "</IfModule>\n");
fwrite($write_fd, "# ~~endcookiesplus~~ Cookies Plus module - Do not remove this comment\n\n");
}
if ($specific_before) {
fwrite($write_fd, trim($specific_before) . "\n\n");
}
if ($specific_after) {
fwrite($write_fd, "\n\n" . trim($specific_after));
}
fclose($write_fd);
return true;
}
/**
* empty listener for registerGDPRConsent hook
*/
public function hookRegisterGDPRConsent()
{
/* registerGDPRConsent is a special kind of hook that doesn't need a listener, see :
https://build.prestashop.com/howtos/module/how-to-make-your-module-compliant-with-prestashop-official-gdpr-compliance-module/
However since Prestashop 1.7.8, modules must implement a listener for all the hooks they register: a check is made
at module installation.
*/
}
public function hookActionShopDataDuplication($params)
{
$cookiesPlusCookies = Db::getInstance()->executeS(
'SELECT * FROM ' . _DB_PREFIX_ . 'cookiesplus_cookie
WHERE id_shop = ' . (int) $params['old_id_shop']
);
foreach ($cookiesPlusCookies as $id => $cookiesPlusCookie) {
Db::getInstance()->execute('
INSERT IGNORE INTO ' . _DB_PREFIX_ . 'cookiesplus_cookie (id_cookiesplus_cookie, id_shop, active, id_cookiesplus_finality, name, provider, provider_url, date_add, date_upd)
VALUES (null, ' . (int) $params['new_id_shop'] . ', ' . (int) $cookiesPlusCookie['active'] . ', ' . (int) $cookiesPlusCookie['id_cookiesplus_finality'] . ', \'' . pSQL($cookiesPlusCookie['name']) . '\', \'' . pSQL($cookiesPlusCookie['provider']) . '\', \'' . pSQL($cookiesPlusCookie['provider_url']) . '\', \'' . date('Y-m-d H:i:s') . '\', \'' . date('Y-m-d H:i:s') . '\')');
$cookiesPlusCookies[$id]['new_id_cookiesplus_cookie'] = Db::getInstance()->Insert_ID();
}
foreach ($cookiesPlusCookies as $cookiesPlusCookie) {
$languages = Db::getInstance()->executeS('
SELECT id_lang, purpose, expiry
FROM ' . _DB_PREFIX_ . 'cookiesplus_cookie_lang
WHERE id_cookiesplus_cookie = ' . (int) $cookiesPlusCookie['id_cookiesplus_cookie']);
foreach ($languages as $language) {
Db::getInstance()->execute('
INSERT IGNORE INTO ' . _DB_PREFIX_ . 'cookiesplus_cookie_lang (id_cookiesplus_cookie, id_lang, purpose, expiry)
VALUES (' . (int) $cookiesPlusCookie['new_id_cookiesplus_cookie'] . ', ' . (int) $language['id_lang'] . ', \'' . pSQL($language['purpose']) . '\', \'' . pSQL($language['expiry']) . '\')');
}
}
$cookiesPlusFinalities = Db::getInstance()->executeS(
'SELECT * FROM ' . _DB_PREFIX_ . 'cookiesplus_finality
WHERE id_shop = ' . (int) $params['old_id_shop']
);
foreach ($cookiesPlusFinalities as $id => $cookiesPlusFinality) {
Db::getInstance()->execute('
INSERT IGNORE INTO ' . _DB_PREFIX_ . 'cookiesplus_finality (id_cookiesplus_finality, id_shop, active, technical, modules, js_script, js_not_script, position, date_add, date_upd)
VALUES (null, ' . (int) $params['new_id_shop'] . ', ' . (int) $cookiesPlusFinality['active'] . ', ' . (int) $cookiesPlusFinality['technical'] . ', \'' . pSQL($cookiesPlusFinality['modules']) . '\', \'' . pSQL($cookiesPlusFinality['js_script']) . '\', \'' . pSQL($cookiesPlusFinality['js_not_script']) . '\', ' . (int) $cookiesPlusFinality['position'] . ', \'' . date('Y-m-d H:i:s') . '\', \'' . date('Y-m-d H:i:s') . '\')');
$cookiesPlusFinalities[$id]['new_id_cookiesplus_finality'] = Db::getInstance()->Insert_ID();
}
foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
$languages = Db::getInstance()->executeS('
SELECT id_lang, name, description
FROM ' . _DB_PREFIX_ . 'cookiesplus_finality_lang
WHERE id_cookiesplus_finality = ' . (int) $cookiesPlusFinality['id_cookiesplus_finality']);
foreach ($languages as $language) {
Db::getInstance()->execute('
INSERT IGNORE INTO ' . _DB_PREFIX_ . 'cookiesplus_finality_lang (id_cookiesplus_finality, id_lang, name, description)
VALUES (' . (int) $cookiesPlusFinality['new_id_cookiesplus_finality'] . ', ' . (int) $language['id_lang'] . ', \'' . pSQL($language['name']) . '\', \'' . pSQL($language['description']) . '\')');
}
}
}
public function hookActionOutputHTMLBefore($params)
{
if (!self::executeModule()) {
return;
}
if (Configuration::get('C_P_FB_ENABLE')) {
$cookiesPlusCookiePreferences = self::getCookiesPlusCookiePreferences();
$fbConsents = json_decode(Configuration::get('C_P_FB_CONSENT'), true) ?: [];
$fbAllConsent = true;
foreach (array_keys($fbConsents) as $fbConsent) {
$key = 'cookiesplus-finality-' . (int) $fbConsent;
if (!isset($cookiesPlusCookiePreferences[$key])
|| $cookiesPlusCookiePreferences[$key] !== 'on') {
$fbAllConsent = false;
break;
}
}
$position = strpos($params['html'], "fbq('init'");
if ($position) {
if ($fbAllConsent) {
$params['html'] = substr_replace($params['html'], "fbq('consent', 'grant');", $position, 0);
} else {
$params['html'] = substr_replace($params['html'], "fbq('consent', 'revoke');", $position, 0);
}
}
}
if (Configuration::get('C_P_YT_ENABLE')) {
$cookiesPlusCookiePreferences = self::getCookiesPlusCookiePreferences();
$ytConsents = json_decode(Configuration::get('C_P_YT_CONSENT'), true) ?: [];
$ytAllConsent = true;
foreach (array_keys($ytConsents) as $ytConsents) {
$key = 'cookiesplus-finality-' . (int) $ytConsents;
if (!isset($cookiesPlusCookiePreferences[$key])
|| $cookiesPlusCookiePreferences[$key] !== 'on') {
$ytAllConsent = false;
break;
}
}
if (!$ytAllConsent) {
$params['html'] = str_replace('youtube.com/embed/', 'youtube-nocookie.com/embed/', $params['html']);
// Elementor
$params['html'] = str_replace('data-video-id=', 'data-video-id-blocked=', $params['html']);
}
}
}
/* Module functions */
/* Backward compatibility */
public static function updateCookie($modules)
{
return self::filterHookModuleExecList($modules);
}
public static function filterHookModuleExecList($modules, $hook_name = null)
{
// return $modules;
if (!self::executeModule()) {
return $modules;
}
if (!self::getGeo()) {
return $modules;
}
// Exclude admin calls
/*
if (defined('_PS_ADMIN_DIR_')) {
return $modules;
}
*/
if (is_object(Context::getContext()->controller)
&& isset(Context::getContext()->controller->controller_type)
&& Context::getContext()->controller->controller_type === 'admin') {
return $modules;
}
// Exclude .map extensions
$url = parse_url("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
if (isset($url['path']) && pathinfo($url['path'], PATHINFO_EXTENSION) === 'map') {
return $modules;
}
$url = parse_url("https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
if (isset($url['path']) && pathinfo($url['path'], PATHINFO_EXTENSION) === 'map') {
return $modules;
}
$cookiesPlusPreferences = self::getCookiesPlusCookiePreferences();
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities(null, true);
foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
if (!$cookiesPlusFinality['technical']
&& (!isset($cookiesPlusPreferences['cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']])
|| (isset($cookiesPlusPreferences['cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']])
&& $cookiesPlusPreferences['cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']] !== 'on'))) {
$blockedModulesId = json_decode($cookiesPlusFinality['modules'], true) ?: [];
if (is_array($modules) && is_array($blockedModulesId)) {
foreach ($modules as $key => $module) {
// Cookiesplus module can not be blocked
if ($module['module'] === 'cookiesplus') {
continue;
}
if (in_array($module['id_module'], $blockedModulesId)) {
unset($modules[$key]);
}
}
}
}
}
return $modules;
}
public function blockModuleCode($params)
{
// Recursive call
if (!self::executeModule()) {
return;
}
if (!self::getGeo()) {
return;
}
// Exclude admin calls
/*
if (defined('_PS_ADMIN_DIR_')) {
return $modules;
}
*/
$context = Context::getContext();
if (!$context->controller) {
return;
}
if (is_object($context->controller)
&& isset($context->controller->controller_type)
&& ($context->controller->controller_type === 'admin'
|| $context->controller->controller_type === 'moduleadmin')) {
return;
}
// Exclude .map extensions
$url = parse_url("http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
if (isset($url['path']) && pathinfo($url['path'], PATHINFO_EXTENSION) === 'map') {
return;
}
$url = parse_url("https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]");
if (isset($url['path']) && pathinfo($url['path'], PATHINFO_EXTENSION) === 'map') {
return;
}
$blockedModulesByFinality = self::getBlockedModulesByFinality();
if (version_compare(_PS_VERSION_, '1.6.1', '>=')) {
return $this->blockModuleCode17($params, $context, $blockedModulesByFinality);
}
return $this->blockModuleCode15($params, $context, $blockedModulesByFinality);
}
public function getBlockedModulesByFinality()
{
$cacheKey = 'CookiesPlus::blockModuleCode';
if (!Cache::isStored($cacheKey)) {
$cookiesPlusPreferences = self::getCookiesPlusCookiePreferences();
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities(null, true);
$blockedModulesByFinality = [];
foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
$index = 'cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality'];
if (!$cookiesPlusFinality['technical']
&& (!isset($cookiesPlusPreferences[$index])
|| (isset($cookiesPlusPreferences[$index])
&& $cookiesPlusPreferences[$index] !== 'on'))
) {
$blockedModulesId = json_decode($cookiesPlusFinality['modules'], true) ?: [];
if (is_array($blockedModulesId)) {
foreach ($blockedModulesId as $module) {
// Cookiesplus module can not be blocked
if ($module === $this->id) {
continue;
}
$blockedModulesByFinality[(int) $module]['finalities'][] = (int) $cookiesPlusFinality['id_cookiesplus_finality'];
}
}
}
}
Cache::store($cacheKey, $blockedModulesByFinality);
}
return Cache::retrieve($cacheKey);
}
public function blockModuleCode17($params, $context, $blockedModulesByFinality)
{
if (isset($blockedModulesByFinality[$params['module']->id])) {
// Remove JS and CSS files from blocked modules
$js_files = [];
$css_files = [];
if (version_compare(_PS_VERSION_, '1.7', '<')) {
$jsFileList = $context->controller->js_files;
foreach ($jsFileList as $jsFile) {
if (strpos($jsFile, '/modules/' . $params['module']->name) !== false) {
$js_files[] = $jsFile;
$context->controller->removeJs($jsFile);
}
}
$cssFileList = $context->controller->css_files;
foreach ($cssFileList as $cssFile) {
if (strpos($cssFile, '/modules/' . $params['module']->name) !== false) {
$css_files[] = $cssFile;
$context->controller->removeJs($cssFile);
}
}
} else {
$jsFileList = $context->controller->getJavascript();
foreach ($jsFileList as $jsFileListPart) {
foreach ($jsFileListPart as $jsFileListPartContainer) {
foreach ($jsFileListPartContainer as $jsFileListPartContainerFile) {
if (strpos($jsFileListPartContainerFile['path'], '/modules/' . $params['module']->name) !== false) {
$js_files[] = $jsFileListPartContainerFile['path'];
$context->controller->removeJs($jsFileListPartContainerFile['path']);
$context->controller->unregisterJavascript($jsFileListPartContainerFile['id']);
}
}
}
}
$cssFileList = $context->controller->getStylesheets();
foreach ($cssFileList as $cssFileListPartContainer) {
foreach ($cssFileListPartContainer as $cssFileListPartContainerFile) {
if (strpos($cssFileListPartContainerFile['path'], '/modules/' . $params['module']->name) !== false) {
$css_files[] = $cssFileListPartContainerFile['path'];
$context->controller->removeCSS($cssFileListPartContainerFile['path']);
$context->controller->unregisterStylesheet($jsFileListPartContainerFile['id']);
}
}
}
}
// Remove cookies
if (isset($params['headersBeforeExecution']) && $params['headersBeforeExecution']) {
// Remove the original headers
header_remove();
// Set old headers
foreach ($params['headersBeforeExecution'] as $header) {
header($header, false);
}
}
if (Configuration::get('C_P_REFRESH')) {
// The module is blocked but with refresh. Don't display any content
$params['display'] = '';
} else {
if ($params['display']) {
$originalReturn = $params['display'];
$random = Tools::substr(md5(microtime()), 0, 10);
$divName = $params['hookName'] . '_' . $params['module']->id . '_' . $random;
$this->context->smarty->assign([
'divName' => $divName,
'id_module' => $params['module']->id,
'finalities' => implode(',', $blockedModulesByFinality[$params['module']->id]['finalities']),
'script' => json_encode($originalReturn),
'js' => empty($js_files) ? '[]' : json_encode($js_files),
'css' => empty($css_files) ? '[]' : json_encode($css_files),
]);
$params['display'] = $this->context->smarty->fetch($this->local_path . 'views/templates/hook/hookmoduledata.tpl');
}
}
}
}
public function blockModuleCode15($params, $context, $blockedModulesByFinality)
{
if (!is_array($params['return'])) {
return;
}
foreach (array_keys($params['return']) as $module) {
$module = Module::getInstanceByName($module);
if (isset($blockedModulesByFinality[$module->id])) {
// Remove JS and CSS files from blocked modules
$js_files = [];
$css_files = [];
if (version_compare(_PS_VERSION_, '1.7', '<')) {
$jsFileList = $context->controller->js_files;
foreach ($jsFileList as $jsFile) {
if (strpos($jsFile, '/modules/' . $module->name) !== false) {
$js_files[] = $jsFile;
$context->controller->removeJs($jsFile);
}
}
$cssFileList = $context->controller->css_files;
foreach ($cssFileList as $cssFile) {
if (strpos($cssFile, '/modules/' . $module->name) !== false) {
$css_files[] = $cssFile;
$context->controller->removeJs($cssFile);
}
}
} else {
$jsFileList = $context->controller->getJavascript();
foreach ($jsFileList as $jsFileListPart) {
foreach ($jsFileListPart as $jsFileListPartContainer) {
foreach ($jsFileListPartContainer as $jsFileListPartContainerFile) {
if (strpos($jsFileListPartContainerFile['path'], '/modules/' . $module->name) !== false) {
$js_files[] = $jsFileListPartContainerFile['path'];
$context->controller->removeJs($jsFileListPartContainerFile['path']);
}
}
}
}
$cssFileList = $context->controller->getStylesheets();
foreach ($cssFileList as $cssFileListPartContainer) {
foreach ($cssFileListPartContainer as $cssFileListPartContainerFile) {
if (strpos($cssFileListPartContainerFile['path'], '/modules/' . $module->name) !== false) {
$css_files[] = $cssFileListPartContainerFile['path'];
$context->controller->removeCSS($cssFileListPartContainerFile['path']);
}
}
}
}
if (Configuration::get('C_P_REFRESH')) {
$params['return'][$module->name] = '';
} else {
$originalReturn = $params['return'][$module->name];
$random = Tools::substr(md5(microtime()), 0, 10);
$divName = $params['hookName'] . '_' . $module->id . '_' . $random;
$this->context->smarty->assign([
'divName' => $divName,
'id_module' => $module->id,
'finalities' => implode(',', $blockedModulesByFinality[$module->id]['finalities']),
'script' => json_encode($originalReturn),
'js' => empty($js_files) ? '[]' : json_encode($js_files),
'css' => empty($css_files) ? '[]' : json_encode($css_files),
]);
$params['return'][$module->name] = $this->context->smarty->fetch($this->local_path . 'views/templates/hook/hookmoduledata.tpl');
}
}
}
}
public function blockModuleCache($modulesToInvoke, $hookName)
{
if (empty($modulesToInvoke)) {
return false;
}
// Don't filter in BO
$context = Context::getContext();
if (isset($context->controller->controller_type) && $context->controller->controller_type === 'admin') {
return $modulesToInvoke;
}
if (!Configuration::get('C_P_REFRESH')) {
return $modulesToInvoke;
}
$cookiesPlusPreferences = self::getCookiesPlusCookiePreferences();
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities(null, true);
$blockedModulesByFinality = [];
foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
$index = 'cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality'];
if (!$cookiesPlusFinality['technical']
&& (!isset($cookiesPlusPreferences[$index])
|| (isset($cookiesPlusPreferences[$index])
&& $cookiesPlusPreferences[$index] !== 'on'))
) {
$blockedModulesId = json_decode($cookiesPlusFinality['modules'], true) ?: [];
if (is_array($blockedModulesId)) {
foreach ($blockedModulesId as $module) {
// Cookiesplus module can not be blocked
if ($module === $this->id) {
continue;
}
$blockedModulesByFinality[(int) $module]['finalities'][] = (int) $cookiesPlusFinality['id_cookiesplus_finality'];
}
}
}
}
if (null === $hookName) {
foreach ($modulesToInvoke as $modulesToInvokeByHook) {
foreach ($modulesToInvokeByHook as $moduleToInvokeKey => $moduleToInvoke) {
if (in_array($moduleToInvoke['id_module'], array_keys($blockedModulesByFinality))) {
unset($modulesToInvoke[$moduleToInvokeKey]);
}
}
}
} else {
foreach ($modulesToInvoke as $moduleToInvokeKey => $moduleToInvoke) {
if (in_array($moduleToInvoke['id_module'], array_keys($blockedModulesByFinality))) {
unset($modulesToInvoke[$moduleToInvokeKey]);
}
}
}
return $modulesToInvoke;
}
public function resetCookiesPlusPreferences()
{
$cookieExpiryTime = time() + Configuration::get('C_P_EXPIRY') * 86400;
$result = setcookie('cookiesplus', json_encode([]), $cookieExpiryTime, '/');
return true;
}
public function saveCookiesPlusPreferences()
{
// $cookiesPlusFinalityValue = self::getCookiesPlusCookiePreferences();
$cookiesPlusFinalityValue = [];
// $cookiesPlusFinalityValue['C_P_DISPLAY_MODAL'] = false;
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
/*foreach ($cookiesPlusFinalities as $cookiesPlusFinality) {
$cookiesPlusFinalityValue['cookiesplus-finality-' . (int)$cookiesPlusFinality['id_cookiesplus_finality']] = Tools::getValue('cookiesplus-finality-' . (int)$cookiesPlusFinality['id_cookiesplus_finality']);
}*/
// $cookieExpiryTime = time() + Configuration::get('C_P_EXPIRY') * 86400;
// $cookiesPlusFinalityValue['expiry'] = time() + Configuration::get('C_P_EXPIRY') * 86400;
// $cookiesPlusFinalityValue['consent_date'] = date('Y-m-d H:i:s', time());
// $result = setcookie('cookiesplus', json_encode($cookiesPlusFinalityValue), $cookieExpiryTime, '/');
// $cookiesPlusFinalityValue['cookie'] = json_encode($cookiesPlusFinalityValue);
// Generate PDF consent
if (Configuration::get('C_P_SAVE_CONSENT')) {
do {
$consentHash = md5(openssl_random_pseudo_bytes(20)) . '-' . Tools::substr(md5(openssl_random_pseudo_bytes(20)), 0, 8);
} while (!$consentHash);
$cookiesPlusFinalityValue['consent_hash'] = $consentHash;
$consentDate = date('Y-m-d H:i', time());
$data = [];
$data['cookiesPlus']['info']['last_update'] = Tools::displayDate(date('Y-m-d', strtotime(Configuration::get('C_P_REVOKE_CONSENT'))), null, false);
$data['cookiesPlus']['info']['consent_hash'] = $cookiesPlusFinalityValue['consent_hash'];
$data['cookiesPlus']['info']['consent_date'] = $consentDate;
$data['cookiesPlus']['info']['consent_ip'] = $ip;
$cookiesPlusFinalities = CookiesPlusFinality::getCookiesPlusFinalities((int) $this->context->language->id, true);
foreach ($cookiesPlusFinalities as &$cookiesPlusFinality) {
$cookiesPlusFinality['cookies'] = CookiesPlusCookie::getCookiesPlusCookies($cookiesPlusFinality['id_cookiesplus_finality'], (int) $this->context->language->id, true, $this->context->shop->id);
if (Tools::getValue('cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']) !== 'na'
&& Tools::getValue('cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']) !== 'on'
&& Tools::getValue('cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']) !== 'off'
) {
$_POST['cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']] = 'na';
}
$cookiesPlusFinality['cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']] = Tools::getValue('cookiesplus-finality-' . (int) $cookiesPlusFinality['id_cookiesplus_finality']);
}
unset($cookiesPlusFinality);
$data['cookiesPlus']['cookiesPlusFinalities'] = $cookiesPlusFinalities;
// Send an email to admin because of an error
/*if (!$result) {
Configuration::updateValue('C_P_SAVE_CONSENT', 0);
}*/
// Save consent
$cookiesPlusUserConsent = new CookiesPlusUserConsent();
$cookiesPlusUserConsent->data = json_encode($data);
$cookiesPlusUserConsent->hash = $cookiesPlusFinalityValue['consent_hash'];
$cookiesPlusUserConsent->date = $consentDate;
$cookiesPlusUserConsent->ip = $ip;
$cookiesPlusUserConsent->save();
}
return $cookiesPlusFinalityValue;
}
public static function getCookiesPlusCookiePreferences()
{
if (isset($_COOKIE['cookiesplus'])) {
return json_decode($_COOKIE['cookiesplus'], true);
}
return [];
}
public static function isCookiesPlusFinalityAccepted($id_cookiesplus_finality)
{
$cookiesPlusCookiePreferences = self::getCookiesPlusCookiePreferences();
$index = 'cookiesplus-finality-' . (int) $id_cookiesplus_finality;
if (isset($cookiesPlusCookiePreferences[$index])
&& $cookiesPlusCookiePreferences[$index] === 'on') {
return true;
}
return false;
}
public function copyOverrideFolder()
{
if (Module::isInstalled('pagecache')) {
return true;
}
if (!is_writable(_PS_MODULE_DIR_ . $this->name)) {
return false;
}
$override_folder_name = 'override';
if (version_compare(_PS_VERSION_, '1.6.1', '>=')) {
$psVersion = '17';
} elseif (version_compare(_PS_VERSION_, '1.6', '>=')) {
$psVersion = '16';
} else {
$psVersion = '15';
}
$version_override_folder = _PS_MODULE_DIR_ . $this->name . '/' . $override_folder_name . '_' . $psVersion;
$override_folder = _PS_MODULE_DIR_ . $this->name . '/' . $override_folder_name;
if (file_exists($override_folder) && is_dir($override_folder)) {
$this->recursiveRmdir($override_folder);
}
if (is_dir($version_override_folder)) {
$this->copyDir($version_override_folder, $override_folder);
}
return true;
}
public function copyDir($src, $dst)
{
if (is_dir($src)) {
$dir = opendir($src);
if (!mkdir($dst) && !is_dir($dst)) {
throw new RuntimeException(sprintf('Directory "%s" was not created', $dst));
}
while (false !== ($file = readdir($dir))) {
if (($file !== '.') && ($file !== '..')) {
if (is_dir($src . '/' . $file)) {
$this->copyDir($src . '/' . $file, $dst . '/' . $file);
} else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
}
public function recursiveRmdir($dir)
{
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object !== '.' && $object !== '..') {
if (filetype($dir . '/' . $object) === 'dir') {
$this->recursiveRmdir($dir . '/' . $object);
} else {
unlink($dir . '/' . $object);
}
}
}
reset($objects);
rmdir($dir);
}
}
public static function sanitizeJson($json)
{
$escapers = ['\\', '/', '"', "\n", "\r", "\t", "\x08", "\x0c", "\'"];
$replacements = ['\\\\', '\\/', '\\"', '\\n', '\\r', '\\t', '\\f', '\\b', "\\\'"];
return str_replace($escapers, $replacements, $json);
}
public function getDatabaseVersion()
{
$query = 'SELECT `version`
FROM `' . _DB_PREFIX_ . 'module`
WHERE `name` = \'' . $this->name . '\';';
return Db::getInstance()->getValue($query);
}
}