* @copyright 2022 ECSoft * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of ECSoft */ require_once dirname(__FILE__) . '/EcsGtmProEcommerce.php'; class EcsGtmProDataLayer { protected $dlManager; public $pageCategory; public $event; public $eventCallback; public $eventTimeout; public $ecommerce; public function __construct($dlManager) { $this->dlManager = $dlManager; $currency = !empty(Context::getContext()->currency->iso_code) ? Context::getContext()->currency->iso_code : null; $this->ecommerce = new EcsGtmProEcommerce($this, $currency); } public function getManager() { return $this->dlManager; } public function addItem($product, $type, $list = null) { if ($this->getManager()->isEE()) { $this->addEEItem($product, $type, $list); } if ($this->getManager()->isGA4()) { $this->addGA4Item($product, $list); } if (empty($this->event)) { $this->event = $type; } } public function addEEItem($product, $type, $list = null) { $dataLayerProduct = new EcsGtmProDataLayerProduct($this->getManager()->module, $product, $list); $dataLayerProduct->removeNull(); if ($type == 'view_item') { if (empty($this->ecommerce->detail)) { $this->ecommerce->detail = new stdClass(); } $this->ecommerce->detail->products = array($dataLayerProduct); } elseif ($type == 'view_item_list' || $type == 'search_results') { if (empty($this->ecommerce->impressions)) { $this->ecommerce->impressions = array(); } $this->ecommerce->impressions[] = $dataLayerProduct; } elseif ($type == 'view_cart') { if (empty($this->ecommerce->checkout)) { $this->ecommerce->checkout = array(); } $this->ecommerce->checkout[] = $dataLayerProduct; } elseif ($type == 'begin_checkout') { if (empty($this->ecommerce->checkout->products)) { $this->ecommerce->checkout = new stdClass(); $this->ecommerce->checkout->products = array(); } $this->ecommerce->checkout->products[] = $dataLayerProduct; } elseif ($type == 'purchase') { if (empty($this->ecommerce->purchase->products)) { $this->ecommerce->purchase = new stdClass(); $this->ecommerce->purchase->products = array(); } $this->ecommerce->purchase->products[] = $dataLayerProduct; } elseif ($type == 'add_to_cart') { if (empty($this->ecommerce->add->products)) { $this->ecommerce->add = new stdClass(); } $this->ecommerce->add->products = array($dataLayerProduct); $this->event = empty($this->event) ? 'addToCart' : $this->event; } elseif ($type == 'remove_from_cart') { if (empty($this->ecommerce->remove->products)) { $this->ecommerce->remove = new stdClass(); } $this->ecommerce->remove->products = array($dataLayerProduct); $this->event = empty($this->event) ? 'removeFromCart' : $this->event; } elseif ($type == 'refund') { if (empty($this->ecommerce->refund->products)) { $this->ecommerce->refund = new stdClass(); $this->ecommerce->refund->products = array(); } $this->ecommerce->refund->products[] = $dataLayerProduct; } } public function getItems() { $items = array(); if ($this->getManager()->isGA4()) { $items = $this->ecommerce->items; } elseif ($this->getManager()->isEE()) { if (!empty($this->ecommerce->detail->products)) { $items = $this->ecommerce->detail->products; } elseif (!empty($this->ecommerce->impressions)) { $items = $this->ecommerce->impressions; } elseif (!empty($this->ecommerce->checkout)) { $items = $this->ecommerce->checkout; } } return $items; } public function addGA4Item($product, $list) { $dataLayerProduct = new EcsGtmProDataLayerItem($this->getManager()->module, $product, $list); $dataLayerProduct->removeNull(); if (empty($this->ecommerce->items)) { $this->ecommerce->items = array(); } $this->ecommerce->items[] = $dataLayerProduct; } public function setSubtotalsFromCart($cart) { if (Validate::isLoadedObject($cart)) { $this->ecommerce->value = (float) round($cart->getOrderTotal(), _ECSGTMPRO_PRICE_DECIMAL_); $this->ecommerce->total_tax_exc = (float) round($cart->getOrderTotal(false), _ECSGTMPRO_PRICE_DECIMAL_); $this->ecommerce->total_products = (float) round($cart->getOrderTotal(true, Cart::ONLY_PRODUCTS), _ECSGTMPRO_PRICE_DECIMAL_); $this->ecommerce->total_shipping = (float) round($cart->getOrderTotal(true, Cart::ONLY_SHIPPING), _ECSGTMPRO_PRICE_DECIMAL_); $this->ecommerce->total_discounts = (float) round($cart->getOrderTotal(true, Cart::ONLY_DISCOUNTS), _ECSGTMPRO_PRICE_DECIMAL_); } } public function toJson() { $js = ''; if (count((array)$this)) { $eventCallback = false; if (!empty($this->eventCallback)) { $this->eventCallback = str_replace('"', '@@', $this->eventCallback); $this->eventCallback = "!##".$this->eventCallback."##!"; $eventCallback = true; if (empty($this->event)) { $this->event = 'eventForCallback'; } if (empty($this->eventTimeout)) { $this->eventTimeout = 2000; } } else { unset($this->eventCallback); unset($this->eventTimeout); } $jsonOptions = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT; $js = json_encode($this, $jsonOptions); if ($eventCallback) { $js = str_replace('##!"', '', str_replace('"!##', '', $js)); $js = str_replace('@@', '"', $js); } } return $js; } }