* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * International Registered Trademark & Property of PrestaShop SA */ namespace PrestaShop\Module\Ps_Googleanalytics\Wrapper; use Configuration; use Context; use Currency; use PrestaShop\Module\Ps_Googleanalytics\Hooks\WrapperInterface; use Product; use Tools; class ProductWrapper implements WrapperInterface { private $context; public function __construct(Context $context) { $this->context = $context; } /** * wrap products to provide a standard products information for google analytics script */ public function wrapProductList($products, $extras = [], $full = false) { $result_products = []; if (!is_array($products)) { return; } $currency = new Currency($this->context->currency->id); $usetax = (Product::getTaxCalculationMethod((int) $this->context->customer->id) != PS_TAX_EXC); if (count($products) > 20) { $full = false; } else { $full = true; } foreach ($products as $index => $product) { if ($product instanceof Product) { $product = (array) $product; } if (!isset($product['price'])) { $product['price'] = (float) Tools::displayPrice(Product::getPriceStatic((int) $product['id_product'], $usetax), $currency); } $result_products[] = $this->wrapProduct($product, $extras, $index, $full); } return $result_products; } /** * wrap product to provide a standard product information for google analytics script */ public function wrapProduct($product, $extras, $index = 0, $full = false) { $ga_product = ''; $variant = null; if (isset($product['attributes_small'])) { $variant = $product['attributes_small']; } elseif (isset($extras['attributes_small'])) { $variant = $extras['attributes_small']; } $product_qty = 1; if (isset($extras['qty'])) { $product_qty = $extras['qty']; } elseif (isset($product['cart_quantity'])) { $product_qty = $product['cart_quantity']; } $product_id = 0; if (!empty($product['id_product'])) { $product_id = $product['id_product']; } elseif (!empty($product['id'])) { $product_id = $product['id']; } if (!empty($product['id_product_attribute'])) { $product_id .= '-' . $product['id_product_attribute']; } $product_type = 'typical'; if (isset($product['pack']) && $product['pack'] == 1) { $product_type = 'pack'; } elseif (isset($product['virtual']) && $product['virtual'] == 1) { $product_type = 'virtual'; } if ($full) { $ga_product = [ 'id' => (int) $product_id, 'name' => (string) $product['name'], 'category' => (string) $product['category'], 'brand' => isset($product['manufacturer_name']) ? (string) $product['manufacturer_name'] : '', 'variant' => (string) $variant, 'type' => (string) $product_type, 'position' => (int) $index ? $index : '0', 'quantity' => (int) $product_qty, 'list' => (string) Tools::getValue('controller'), 'url' => isset($product['link']) ? (string) urlencode($product['link']) : '', 'price' => (float) preg_replace('/[^0-9.]/', '', $product['price']), ]; } else { $ga_product = [ 'id' => (int) $product_id, 'name' => (string) $product['name'], ]; } $isV4Enabled = (bool) Configuration::get('GA_V4_ENABLED'); if (!$isV4Enabled) { foreach ($ga_product as $k => $v) { if (in_array($k, ['name', 'category', 'brand', 'variant', 'brand'])) { $ga_product[$k] = Tools::str2url($v); } } } return $ga_product; } }