Skip to content

Commit 05f16fd

Browse files
committed
ACP2E-4045: Product Views Report Incorrect - Lower Count Compared to GA
1 parent b28144a commit 05f16fd

File tree

6 files changed

+148
-0
lines changed

6 files changed

+148
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php
2+
/**
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Reports\Controller\Report\Product;
9+
10+
use Magento\Backend\App\Action\Context;
11+
use Magento\Customer\Model\Session;
12+
use Magento\Customer\Model\Visitor;
13+
use Magento\Framework\App\Action\HttpPostActionInterface;
14+
use Magento\Framework\App\RequestInterface;
15+
use Magento\Framework\Controller\Result\JsonFactory;
16+
use Magento\Reports\Model\Event;
17+
use Magento\Reports\Model\Product\Index\ViewedFactory;
18+
use Magento\Reports\Model\ReportStatus;
19+
use Magento\Reports\Observer\EventSaver;
20+
use Magento\Store\Model\StoreManagerInterface;
21+
22+
/**
23+
* Report Action
24+
*/
25+
class View implements HttpPostActionInterface
26+
{
27+
/**
28+
* @var RequestInterface
29+
*/
30+
private $request;
31+
32+
/**
33+
* @param Context $context
34+
* @param JsonFactory $resultJsonFactory
35+
* @param ReportStatus $reportStatus
36+
* @param StoreManagerInterface $storeManager
37+
* @param Session $customerSession
38+
* @param Visitor $customerVisitor
39+
* @param ViewedFactory $productIndexFactory
40+
* @param EventSaver $eventSaver
41+
*/
42+
public function __construct(
43+
private readonly Context $context,
44+
private readonly JsonFactory $resultJsonFactory,
45+
private readonly ReportStatus $reportStatus,
46+
private readonly StoreManagerInterface $storeManager,
47+
private readonly Session $customerSession,
48+
private readonly Visitor $customerVisitor,
49+
private readonly ViewedFactory $productIndexFactory,
50+
private readonly EventSaver $eventSaver
51+
) {
52+
$this->request = $context->getRequest();
53+
}
54+
55+
/**
56+
* @inheritdoc
57+
*/
58+
public function execute()
59+
{
60+
$result = $this->resultJsonFactory->create();
61+
62+
if ($this->reportStatus->isReportEnabled((string)Event::EVENT_PRODUCT_VIEW)) {
63+
$productId = $this->request->getParam('product_id');
64+
65+
$viewData['product_id'] = $productId;
66+
$viewData['store_id'] = $this->storeManager->getStore()->getId();
67+
if ($this->customerSession->isLoggedIn()) {
68+
$viewData['customer_id'] = $this->customerSession->getCustomerId();
69+
} else {
70+
$viewData['visitor_id'] = $this->customerVisitor->getId();
71+
}
72+
$this->productIndexFactory->create()->setData($viewData)->save()->calculate();
73+
$this->eventSaver->save(Event::EVENT_PRODUCT_VIEW, $productId);
74+
}
75+
76+
return $result->setData([]);
77+
}
78+
}

app/code/Magento/Reports/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"magento/module-store": "*",
2323
"magento/module-tax": "*",
2424
"magento/module-widget": "*",
25+
"magento/module-theme": "*",
2526
"magento/module-wishlist": "*"
2627
},
2728
"type": "magento2-module",
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright 2025 Adobe
5+
* All Rights Reserved.
6+
*/
7+
-->
8+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
9+
<router id="standard">
10+
<route id="reports" frontName="reports">
11+
<module name="Magento_Reports" />
12+
</route>
13+
</router>
14+
</config>
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
/**
4+
* Copyright 2025 Adobe
5+
* All Rights Reserved.
6+
*/
7+
-->
8+
9+
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
10+
<body>
11+
<referenceContainer name="product.info.main">
12+
<block name="report.product.view.container" template="Magento_Theme::template.phtml" ifconfig="reports/options/enabled" after="-">
13+
<block class="Magento\Catalog\Block\Product\View" name="report.product.view" template="Magento_Reports::product/report_viewed_product.phtml" ifconfig="reports/options/product_view_enabled"/>
14+
</block>
15+
</referenceContainer>
16+
</body>
17+
</page>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
/**
3+
* Copyright 2025 Adobe
4+
* All Rights Reserved.
5+
*/
6+
7+
/** @var \Magento\Reports\Block\Product\ViewedProduct $block */
8+
/** @var \Magento\Framework\Escaper $escaper */
9+
/** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
10+
?>
11+
<script type="text/x-magento-init">
12+
{
13+
"*": {
14+
"Magento_Reports/js/product-viewed": {
15+
"product_id": "<?= $escaper->escapeJs($block->getProduct()->getId()) ?>"
16+
}
17+
}
18+
}
19+
</script>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* Copyright 2025 Adobe
3+
* All Rights Reserved.
4+
*/
5+
6+
define([
7+
'jquery'
8+
], function ($) {
9+
'use strict';
10+
11+
return function (data) {
12+
$.ajax({
13+
url: 'reports/report_product/view',
14+
type: 'POST',
15+
data: {'product_id': data.product_id },
16+
dataType: 'json'
17+
});
18+
};
19+
});

0 commit comments

Comments
 (0)