Skip to content

Commit aa541c7

Browse files
authored
Add CookieBot compatibility. (#37)
* Add CookieBot compatibility. * Use strict comparison for command type check.
1 parent 0778f43 commit aa541c7

File tree

10 files changed

+221
-81
lines changed

10 files changed

+221
-81
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0"?>
22
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
3-
<module name="Ometria_AbandonedCarts" setup_version="2.3.2"/>
3+
<module name="Ometria_AbandonedCarts" setup_version="2.4.0"/>
44
</config>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0"?>
22
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
3-
<module name="Ometria_Api" setup_version="2.3.2"/>
3+
<module name="Ometria_Api" setup_version="2.4.0"/>
44
</config>

app/code/Ometria/Core/Block/Head.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,22 @@ public function isDatalayerEnabled()
109109
);
110110
}
111111

112+
/**
113+
* @return bool
114+
*/
115+
public function isCookiebotEnabled()
116+
{
117+
return (bool) $this->scopeConfig->isSetFlag('ometria/advanced/enable_cookiebot');
118+
}
119+
120+
/**
121+
* @return string
122+
*/
123+
public function getCookiebotClass()
124+
{
125+
return (string) $this->scopeConfig->getValue('ometria/advanced/cookiebot_classification');
126+
}
127+
112128
/**
113129
* @return bool
114130
*/

app/code/Ometria/Core/Helper/Config.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,4 +106,20 @@ public function getStockPushScope()
106106
{
107107
return (string) $this->coreHelperMageConfig->get('ometria/advanced/stock_push_scope');
108108
}
109+
110+
/**
111+
* @return bool
112+
*/
113+
public function isCookiebotEnabled()
114+
{
115+
return (bool) $this->coreHelperMageConfig->get('ometria/advanced/enable_cookiebot');
116+
}
117+
118+
/**
119+
* @return string
120+
*/
121+
public function getCookiebotClass()
122+
{
123+
return (string) $this->coreHelperMageConfig->get('ometria/advanced/cookiebot_classification');
124+
}
109125
}
Lines changed: 147 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,185 @@
11
<?php
2-
namespace Ometria\Core\Helper;
3-
use Magento\Framework\App\Helper\AbstractHelper;
4-
use Magento\Framework\App\Helper\Context;
5-
class Cookiechannel extends AbstractHelper
6-
{
2+
namespace Ometria\Core\Helper;
3+
4+
use Magento\Framework\App\Helper\AbstractHelper;
5+
use Magento\Framework\App\Helper\Context;
6+
use Ometria\Core\Helper\Is\Frontend as IsFrontend;
77

8-
const COOKIE_NAME = 'ommage';
8+
class Cookiechannel extends AbstractHelper
9+
{
10+
const COOKIE_NAME = 'ommage';
11+
const COOKIEBOT_COOKIE_NAME = 'CookieConsent';
912
const SEPERATOR_BETWEEN_COMMANDS = ';';
10-
const SEPERATOR_IN_COMMANDS = ':';
11-
12-
protected $helperConfig;
13-
14-
protected $frontendAreaChecker;
15-
16-
protected $cookie_did_change = false;
17-
13+
const SEPERATOR_IN_COMMANDS = ':';
14+
15+
/** @var Config */
16+
private $helperConfig;
17+
18+
/** @var IsFrontend */
19+
private $frontendAreaChecker;
20+
21+
/** @var bool */
22+
private $cookieDidChange = false;
23+
24+
/**
25+
* @param Context $context
26+
* @param Config $helperConfig
27+
* @param IsFrontend $frontendAreaChecker
28+
*/
1829
public function __construct(
1930
Context $context,
20-
\Ometria\Core\Helper\Config $helperConfig,
21-
\Ometria\Core\Helper\Is\Frontend $frontendAreaChecker
22-
)
23-
{
24-
$this->helperConfig = $helperConfig;
25-
$this->frontendAreaChecker = $frontendAreaChecker;
31+
Config $helperConfig,
32+
IsFrontend $frontendAreaChecker
33+
) {
34+
$this->helperConfig = $helperConfig;
35+
$this->frontendAreaChecker = $frontendAreaChecker;
36+
2637
return parent::__construct($context);
2738
}
28-
29-
public function addCommand($command, $replace_if_exists=false, $set_cookie=true){
30-
if (!$command || !is_array($command)) return;
3139

40+
/**
41+
* @param $command
42+
* @param bool $replaceIfExists
43+
*/
44+
public function addCommand($command, bool $replaceIfExists = false)
45+
{
46+
if (!$command || !is_array($command)) {
47+
return;
48+
}
3249

3350
// Return if admin area or API call
34-
// if (Mage::app()->getStore()->isAdmin()) return;
35-
// if (Mage::getSingleton('api/server')->getAdapter() != null) return;
36-
if(!$this->frontendAreaChecker->check())
37-
{
51+
if(!$this->frontendAreaChecker->check()) {
52+
return;
53+
}
54+
55+
if (!$this->helperConfig->isConfigured()) {
3856
return;
3957
}
4058

41-
//$ometria_config_helper = Mage::helper('ometria/config');
42-
$ometria_config_helper = $this->helperConfig;
43-
if (!$ometria_config_helper->isConfigured()) return;
44-
if (!$ometria_config_helper->isUnivarEnabled()) return;
59+
if (!$this->helperConfig->isUnivarEnabled()) {
60+
return;
61+
}
62+
63+
if ($command[0] === 'identify') {
64+
$command[1] = '';
65+
}
4566

46-
if ($command[0]=='identify') $command[1] = '';
47-
4867
$str = implode(self::SEPERATOR_IN_COMMANDS, $command);
4968

50-
$this->appendCookieCommand($command[0], $str, $replace_if_exists);
69+
$this->appendCookieCommand($command[0], $str, $replaceIfExists);
5170
}
5271

53-
private function appendCookieCommand($command_name, $str, $replace_if_exists=false, $set_cookie=true){
54-
$existing_cookie = isset($_COOKIE[self::COOKIE_NAME]) ? $_COOKIE[self::COOKIE_NAME] : '';
55-
$commands = explode(self::SEPERATOR_BETWEEN_COMMANDS, $existing_cookie);
56-
$new_cookie = '';
72+
/**
73+
* @param $commandName
74+
* @param $str
75+
* @param bool $replaceIfExists
76+
*/
77+
private function appendCookieCommand($commandName, $str, bool $replaceIfExists = false)
78+
{
79+
$existingCookie = isset($_COOKIE[self::COOKIE_NAME]) ? $_COOKIE[self::COOKIE_NAME] : '';
80+
$commands = explode(self::SEPERATOR_BETWEEN_COMMANDS, $existingCookie);
81+
$newCookie = '';
5782

58-
if ($replace_if_exists && $commands) {
59-
$commands_filtered = array();
83+
if ($replaceIfExists && $commands) {
84+
$commandsFiltered = array();
6085
foreach($commands as $command){
61-
if (strpos($command, $command_name.self::SEPERATOR_IN_COMMANDS)!==0) {
62-
$commands_filtered[] = $command;
86+
if (strpos($command, $commandName . self::SEPERATOR_IN_COMMANDS) !== 0) {
87+
$commandsFiltered[] = $command;
6388
}
6489
}
65-
$commands = $commands_filtered;
90+
$commands = $commandsFiltered;
6691
$commands = array_filter($commands);
6792
}
6893

6994
$commands[] = $str;
70-
if (count($commands)>6) $commands = array_slice($commands, 0, 6);
95+
if (count($commands) > 6) {
96+
$commands = array_slice($commands, 0, 6);
97+
}
7198

7299
$commands = array_unique($commands);
73100
$commands = array_filter($commands);
74101
$commands = array_values($commands);
75102
sort($commands);
76103
$commands = array_values($commands);
77104

78-
$new_cookie = implode(self::SEPERATOR_BETWEEN_COMMANDS, $commands);
79-
if (strlen($new_cookie)>1000) $new_cookie = '';
105+
$newCookie = implode(self::SEPERATOR_BETWEEN_COMMANDS, $commands);
106+
if (strlen($newCookie) > 1000) {
107+
$newCookie = '';
108+
}
80109

81-
if (!headers_sent() && ($new_cookie!=$existing_cookie)) {
82-
$this->cookie_did_change = true;
83-
$_COOKIE[self::COOKIE_NAME] = $new_cookie;
84-
//setcookie(self::COOKIE_NAME, $new_cookie, 0, '/');
85-
//if ($set_cookie) Mage::getModel('core/cookie')
86-
// ->set(self::COOKIE_NAME, $new_cookie, 0, '/');
87-
if ($set_cookie) $this->sendCookie();
110+
if (!headers_sent() && ($newCookie != $existingCookie)) {
111+
$this->cookieDidChange = true;
112+
$_COOKIE[self::COOKIE_NAME] = $newCookie;
113+
114+
$this->sendCookie();
88115
}
89116
}
90-
91-
public function sendCookie(){
92-
if (!$this->cookie_did_change) return;
117+
118+
public function sendCookie()
119+
{
120+
if (!$this->cookieDidChange) {
121+
return;
122+
}
123+
124+
if ($this->helperConfig->isCookiebotEnabled() && $this->cookiebotCookieAllowed() === false) {
125+
return;
126+
}
127+
93128
$cookie = isset($_COOKIE[self::COOKIE_NAME]) ? $_COOKIE[self::COOKIE_NAME] : '';
94129
setcookie(self::COOKIE_NAME, $cookie, 0, '/');
95-
$this->cookie_did_change = false;
96-
}
97-
}
130+
$this->cookieDidChange = false;
131+
}
132+
133+
/**
134+
* @return bool
135+
*/
136+
private function cookiebotCookieAllowed()
137+
{
138+
$cookieAllowed = false;
139+
140+
if (isset($_COOKIE[self::COOKIEBOT_COOKIE_NAME])) {
141+
switch ($_COOKIE[self::COOKIEBOT_COOKIE_NAME]) {
142+
case "-1":
143+
//The user is not within a region that requires consent - all cookies are accepted
144+
$cookieAllowed = true;
145+
break;
146+
147+
default:
148+
// The user must give their consent
149+
$cookieConsent = $this->getCookiebotConsent();
150+
if ($cookieConsent) {
151+
$cookieClass = $this->helperConfig->getCookiebotClass();
152+
// Consent cookie was found
153+
if (isset($cookieConsent[$cookieClass]) && filter_var($cookieConsent[$cookieClass], FILTER_VALIDATE_BOOLEAN)) {
154+
//Current user accepts Ometria cookies
155+
$cookieAllowed = true;
156+
}
157+
}
158+
break;
159+
}
160+
}
161+
162+
return $cookieAllowed;
163+
}
164+
165+
/**
166+
* Read current user consent in encoded JavaScript format from Cookiebot cookie
167+
*
168+
* @see https://www.cookiebot.com/en/developer/
169+
* @return mixed
170+
*/
171+
private function getCookiebotConsent()
172+
{
173+
$json = preg_replace('/\s*:\s*([a-zA-Z0-9_]+?)([}\[,])/',
174+
':"$1"$2',
175+
preg_replace('/([{\[,])\s*([a-zA-Z0-9_]+?):/',
176+
'$1"$2":',
177+
str_replace("'",
178+
'"',
179+
stripslashes($_COOKIE[self::COOKIEBOT_COOKIE_NAME])
180+
)
181+
)
182+
);
183+
return json_decode($json, true);
184+
}
185+
}

app/code/Ometria/Core/etc/adminhtml/system.xml

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,49 +35,60 @@
3535
<label>Include Data Layer</label>
3636
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
3737
</field>
38-
<field id="checkout_tracking_enabled" translate="label" type="select" sortOrder="12" showInDefault="1" showInWebsite="1" showInStore="1">
38+
<field id="checkout_tracking_enabled" translate="label" type="select" sortOrder="20" showInDefault="1" showInWebsite="1" showInStore="1">
3939
<label>Include Data Layer on Checkout</label>
4040
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
4141
<comment>Allow tracking javascript to load from the Ometria CDN on the Magento checkout page.</comment>
4242
</field>
43-
<field id="pageview_on_variant" translate="label comment" type="select" sortOrder="15" showInDefault="1" showInWebsite="0" showInStore="0">
43+
<field id="pageview_on_variant" translate="label comment" type="select" sortOrder="30" showInDefault="1" showInWebsite="0" showInStore="0">
4444
<label>Trigger Ometria Page View on variant selection</label>
4545
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
4646
<comment>This applies to configurable/swatch products, should Ometria record a page view on each variant selection.</comment>
4747
</field>
48-
<field id="ping" translate="label" type="select" sortOrder="20" showInDefault="1" showInWebsite="0" showInStore="0">
48+
<field id="ping" translate="label" type="select" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0">
4949
<label>Ping Ometria on record update</label>
5050
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
5151
</field>
52-
<field id="debug" translate="label" type="select" sortOrder="30" showInDefault="1" showInWebsite="0" showInStore="0">
53-
<label>Debug Mode</label>
54-
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
55-
</field>
56-
<field id="preferred_product_attribute" translate="label" type="select" sortOrder="1120" showInDefault="1" showInWebsite="0" showInStore="0">
52+
<field id="preferred_product_attribute" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="0" showInStore="0">
5753
<label>Preferred Product Attribute</label>
5854
<source_model>Ometria\Core\Model\Config\Source\PreferredProduct</source_model>
5955
<comment>Select the configurable product attribute which defines the SKU of the preferred product variant.</comment>
6056
</field>
61-
<field id="use_configurable_image" translate="label" type="select" sortOrder="1130" showInDefault="1" showInWebsite="0" showInStore="0">
57+
<field id="use_configurable_image" translate="label" type="select" sortOrder="60" showInDefault="1" showInWebsite="0" showInStore="0">
6258
<label>Use Configurable Image</label>
6359
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
6460
<comment>Select "yes" here to override using the preferred product's image if the configurable already has an image set.</comment>
6561
</field>
66-
<field id="unique_id" translate="label" type="Ometria\Core\Data\Form\Element\Text\Disabled" sortOrder="1140" showInDefault="1" showInWebsite="0" showInStore="0">
67-
<label>Unique Magento ID</label>
68-
<comment>This will be auto-generated by the extension. Do not change.</comment>
69-
</field>
70-
<field id="override_memory" translate="label" type="select" sortOrder="40" showInDefault="1" showInWebsite="0" showInStore="0">
62+
<field id="stock_push_scope" translate="label" type="select" sortOrder="70" showInDefault="1" showInWebsite="0" showInStore="0">
63+
<label>Out of stock product push scope</label>
64+
<source_model>Ometria\Core\Model\Config\Source\StockPushScope</source_model>
65+
</field>
66+
<field id="enable_cookiebot" translate="label" type="select" sortOrder="80" showInDefault="1" showInWebsite="0" showInStore="0">
67+
<label>Enable Cookiebot restrictions</label>
68+
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
69+
</field>
70+
<field id="cookiebot_classification" translate="label" type="text" sortOrder="80" showInDefault="1" showInWebsite="0" showInStore="0">
71+
<label>Cookiebot Classification</label>
72+
<depends>
73+
<field id="enable_cookiebot">1</field>
74+
</depends>
75+
<comment>Defines the CookieBot classification Ometria cookies will be allowed by.</comment>
76+
</field>
77+
<field id="override_memory" translate="label" type="select" sortOrder="90" showInDefault="1" showInWebsite="0" showInStore="0">
7178
<label>Override PHP 'memory_limit' value in API</label>
7279
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
7380
</field>
74-
<field id="override_execution" translate="label" type="select" sortOrder="50" showInDefault="1" showInWebsite="0" showInStore="0">
81+
<field id="override_execution" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="0" showInStore="0">
7582
<label>Override PHP 'max_execution_time' value in API</label>
7683
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
7784
</field>
78-
<field id="stock_push_scope" translate="label" type="select" sortOrder="60" showInDefault="1" showInWebsite="0" showInStore="0">
79-
<label>Out of stock product push scope</label>
80-
<source_model>Ometria\Core\Model\Config\Source\StockPushScope</source_model>
85+
<field id="debug" translate="label" type="select" sortOrder="100" showInDefault="1" showInWebsite="0" showInStore="0">
86+
<label>Debug Mode</label>
87+
<source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
88+
</field>
89+
<field id="unique_id" translate="label" type="Ometria\Core\Data\Form\Element\Text\Disabled" sortOrder="110" showInDefault="1" showInWebsite="0" showInStore="0">
90+
<label>Unique Magento ID</label>
91+
<comment>This will be auto-generated by the extension. Do not change.</comment>
8192
</field>
8293
</group>
8394
</section>

app/code/Ometria/Core/etc/config.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
<override_memory>0</override_memory>
2020
<override_execution>0</override_execution>
2121
<stock_push_scope>1</stock_push_scope>
22+
<enable_cookiebot>0</enable_cookiebot>
23+
<cookiebot_classification>marketing</cookiebot_classification>
2224
</advanced>
2325
</ometria>
2426
</default>
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<?xml version="1.0"?>
22
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
3-
<module name="Ometria_Core" setup_version="2.3.2"/>
3+
<module name="Ometria_Core" setup_version="2.4.0"/>
44
</config>

0 commit comments

Comments
 (0)