Skip to content

Instantly share code, notes, and snippets.

@Shoora
Forked from Katia-Kovtun/readme.txt
Created January 3, 2024 16:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Shoora/6d51556d1671b70434373cfb03c51763 to your computer and use it in GitHub Desktop.
Save Shoora/6d51556d1671b70434373cfb03c51763 to your computer and use it in GitHub Desktop.
Yandex Metrika для Opencart 2.3
Также необходимо внести правки в catalog/view/javascript/common.js
найти функцию cart.add
после if (json['success']) {
добавить sendYandexEcommerce(json, "add");
найти функцию cart.remove после success: function(json) {
добавить sendYandexEcommerce(json, "remove");
<?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