Last active
January 3, 2024 16:44
-
-
Save Katia-Kovtun/7234c96c9639158d10af4c4b6888a280 to your computer and use it in GitHub Desktop.
Yandex Metrika для Opencart 2.3
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Также необходимо внести правки в catalog/view/javascript/common.js | |
найти функцию cart.add | |
после if (json['success']) { | |
добавить sendYandexEcommerce(json, "add"); | |
найти функцию cart.remove после success: function(json) { | |
добавить sendYandexEcommerce(json, "remove"); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<modification> | |
<name>Yandex Metrika Ecommerce</name> | |
<code>yandex_metrika_ecommerce</code> | |
<version>1.5</version> | |
<author>Katerik</author> | |
<file path="catalog/controller/product/product.php"> | |
<operation> | |
<search><![CDATA[$data['header'] = $this->load->controller('common/header');]]></search> | |
<add position="after"> | |
<![CDATA[ | |
if(isset($data['product_id'])) | |
{ | |
$data["metrika_product_id"] = $data['product_id']; | |
$data["metrika_product_name"] = $product_info['name']; | |
if((float)$product_info['special']) | |
{ | |
$data["metrika_product_price"] = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')),$this->session->data['currency']); | |
} | |
else | |
{ | |
$data["metrika_product_price"] = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']); | |
} | |
$data["metrika_product_manufacturer"] = $product_info['manufacturer']; | |
$data["metrika_product_category"] = ""; | |
if(isset($category_info) && $category_info) | |
$data["metrika_product_category"] = $category_info['name']; | |
else | |
$data["metrika_product_category"] = ""; | |
} | |
]]> | |
</add> | |
</operation> | |
</file> | |
<file path="catalog/view/theme/*/template/product/product.tpl"> | |
<operation> | |
<search><![CDATA[$(document).ready(function() {]]></search> | |
<add position="after"> | |
<![CDATA[ | |
if(typeof dataLayer != 'undefined') { | |
dataLayer.push({ | |
"ecommerce": { | |
"detail": { | |
"products": [ | |
{ | |
"id": "<?php echo $metrika_product_id; ?>", | |
"name" : "<?php echo $metrika_product_name; ?>", | |
"price": <?php echo str_replace(' р.', '', $metrika_product_price); ?>, | |
"brand": "<?php echo $metrika_product_manufacturer; ?>", | |
"category": "<?php echo $metrika_product_category;?>" | |
} | |
] | |
} | |
} | |
}); | |
} | |
]]> | |
</add> | |
</operation> | |
<operation> | |
<search><![CDATA[$('#cart > ul').load('index.php?route=common/cart/info ul li');]]></search> | |
<add position="after"> | |
<![CDATA[ | |
sendYandexEcommerce(json, "add"); | |
]]> | |
</add> | |
</operation> | |
</file> | |
<file path="catalog/controller/checkout/success.php"> | |
<operation> | |
<search><![CDATA[if (isset($this->session->data['order_id'])) {]]></search> | |
<add position="before"> | |
<![CDATA[ | |
$data['metrika_order_products'] = array(); | |
$data['metrika_order_id'] = false; | |
]]> | |
</add> | |
</operation> | |
<operation> | |
<search><![CDATA[if (isset($this->session->data['order_id'])) {]]></search> | |
<add position="after"> | |
<![CDATA[ | |
$data['metrika_order_id'] = $this->session->data['order_id']; | |
$this->load->model('account/order'); | |
$this->load->model('catalog/category'); | |
$this->load->model('catalog/product'); | |
$order_products = $this->model_account_order->getOrderProducts($data['metrika_order_id']); | |
foreach($order_products as $order_product) | |
{ | |
$product_info = $this->model_catalog_product->getProduct($order_product["product_id"]); | |
$categories_product = $this->model_catalog_product->getCategories($order_product["product_id"]); | |
if($product_info) | |
{ | |
$metrika_product_category = ""; | |
if(count($categories_product) > 0) | |
{ | |
$category = array_pop($categories_product); | |
$category_info = $this->model_catalog_category->getCategory($category['category_id']); | |
if ($category_info) | |
$metrika_product_category = $category_info['name']; | |
} | |
$data['metrika_order_products'][] = array( | |
"metrika_product_id" => $order_product["product_id"], | |
"metrika_product_name" => $order_product["name"], | |
"metrika_product_price" => str_replace(' р.', '', $this->currency->format($order_product["price"]+$order_product['tax'], $this->session->data['currency'])) , | |
"metrika_product_quantity" => $order_product["quantity"], | |
"metrika_product_manufacturer" => $product_info['manufacturer'], | |
"metrika_product_category" => $metrika_product_category, | |
); | |
} | |
} | |
]]> | |
</add> | |
</operation> | |
</file> | |
<file path="catalog/view/theme/*/template/checkout/success.tpl"> | |
<operation> | |
<search><![CDATA[<?php echo $footer; ?>]]></search> | |
<add position="before"> | |
<![CDATA[ | |
<?php if(isset($metrika_order_id) && $metrika_order_id) { ?> | |
<script type="text/javascript"> | |
if(typeof dataLayer != 'undefined') { | |
dataLayer.push({ | |
"ecommerce": { | |
"purchase": { | |
"actionField": { | |
"id" : "<?php echo $metrika_order_id; ?>" | |
}, | |
"products": [ | |
<?php foreach($metrika_order_products as $product) { ?> | |
{ | |
"id": "<?php echo $product["metrika_product_id"]; ?>", | |
"name": "<?php echo $product["metrika_product_name"]; ?>", | |
"price": <?php echo str_replace(' р.', '', $product["metrika_product_price"]); ?>, | |
"quantity": <?php echo $product["metrika_product_quantity"]; ?>, | |
"brand": "<?php echo $product["metrika_product_manufacturer"]; ?>", | |
"category": "<?php echo $product["metrika_product_category"];?>" | |
}, | |
<?php } ?> | |
] | |
} | |
} | |
}); | |
} | |
</script> | |
<?php } ?> | |
]]> | |
</add> | |
</operation> | |
</file> | |
<file path="catalog/controller/checkout/cart.php"> | |
<operation> | |
<search><![CDATA[$json['success'] = sprintf]]></search> | |
<add position="after"> | |
<![CDATA[ | |
$json["metrika_product_id"] = $product_info["product_id"]; | |
$json["metrika_product_name"] = $product_info["name"]; | |
if((float)$product_info['special']) | |
{ | |
$json["metrika_product_price"] = str_replace(' р.', '', $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'])); | |
} | |
else | |
{ | |
$json["metrika_product_price"] = str_replace(' р.', '', $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency'])); | |
} | |
$json["metrika_product_manufacturer"] = $product_info["manufacturer"]; | |
$json["metrika_product_quantity"] = $quantity; | |
$this->load->model('catalog/product'); | |
$this->load->model('catalog/category'); | |
$categories_product = $this->model_catalog_product->getCategories($product_info["product_id"]); | |
if(count($categories_product) > 0) | |
{ | |
$category = array_pop($categories_product); | |
$category_info = $this->model_catalog_category->getCategory($category['category_id']); | |
if ($category_info) | |
$json["metrika_product_category"] = $category_info['name']; | |
else | |
$json["metrika_product_category"] = ""; | |
} | |
else | |
$json["metrika_product_category"] = ""; | |
]]> | |
</add> | |
</operation> | |
<operation> | |
<search><![CDATA[$this->cart->remove($this->request->post['key']);]]></search> | |
<add position="before"> | |
<![CDATA[ | |
$cart_products = $this->cart->getProducts(); | |
foreach($cart_products as $cart_product) | |
{ | |
if($cart_product["cart_id"]==$this->request->post['key']) | |
{ | |
$json["metrika_product_id"] = $cart_product['product_id']; | |
$json["metrika_product_name"] = $cart_product['name']; | |
$json["metrika_product_price"] = str_replace(' р.', '', $cart_product["price"]); | |
break; | |
} | |
} | |
]]> | |
</add> | |
</operation> | |
</file> | |
<file path="catalog/view/theme/*/template/common/header.tpl"> | |
<operation> | |
<search><![CDATA[</head>]]></search> | |
<add position="before"> | |
<![CDATA[ | |
<script type="text/javascript">window.dataLayer = window.dataLayer || [];</script> | |
]]> | |
</add> | |
</operation> | |
</file> | |
<file path="catalog/view/theme/*/template/common/footer.tpl"> | |
<operation> | |
<search><![CDATA[</body>]]></search> | |
<add position="before"> | |
<![CDATA[ | |
<script type="text/javascript"> | |
function sendYandexEcommerce(array, action) { | |
if(typeof dataLayer == 'undefined') | |
return false; | |
if(action=="remove") { | |
var product = [{ | |
"id": array['metrika_product_id'], | |
"name": array['metrika_product_name'], | |
"price": array['metrika_product_price'] | |
}]; | |
} else { | |
var product = [{ | |
"id": array['metrika_product_id'], | |
"name": array['metrika_product_name'], | |
"price": array['metrika_product_price'], | |
"brand": array['metrika_product_manufacturer'], | |
"category": array['metrika_product_category'], | |
"quantity": array['metrika_product_quantity'] | |
}]; | |
} | |
if(action=="remove") | |
dataLayer.push({"ecommerce": {"remove": {"products": product}}}); | |
else | |
dataLayer.push({"ecommerce": {"add": {"products": product}}}); | |
} | |
</script> | |
]]> | |
</add> | |
</operation> | |
</file> | |
</modification> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment