我目前正在编写一个Magento 2模块,要求我记录产品视图等客户操作。需要为登录的客户和访客客户添加此操作。我的解决方案是在会话中为所有产品ID的客户使用自定义变量(数组)。
为了解决整页缓存问题,我实现了一个前端ajax请求来记录产品视图。
我有一个控制器,访问时会在会话中保存产品ID。当我直接访问URL时,这可以正常工作,但是,当它通过AJAX请求访问时,保存会话变量不起作用。
我花了好几个小时试图调试它,我一直在输出会话变量的内容,当用AJAX访问时我可以看到内容,它只是从未更新。
```
public function setGuestCustomerProductView($productId)
{
$guestProductViews = $this->_sessionManager->getGuestProductViews();
$guestProductViews[] = $productId;
$this->_sessionManager->setGuestProductViews($guestProductViews);
return $guestProductViews;
}
```
AJAX请求将始终返回会话变量的内容(加上您正在查看的产品ID)但从不设置变量。如果我直接在同一浏览器中访问URL,则会显示内容并更新会话变量。
进一步的AJAX请求显示来自直接URL请求的新会话变量数据。
我是否误解了有关会话和AJAX请求的内容?域名是相同的,因此没有跨域问题。
任何帮助都将不胜感激。
答案 0 :(得分:1)
<强>更新强>
我开始认为这不是一个magento 2问题,它更像是一般会话/ AJAX问题。
我决定测试一个理论并转出SessionManager
并使用PHP的$_SESSION
全局变量。这导致了同样的问题,因此问题的处理程序不是问题所在。
进一步测试得出结论,正确传递和使用了相同的会话ID。使用SessionManager
我在set方法之前直接调用了isSessionExists()
。此方法返回true,不仅检查有效的会话ID,还确认尚未发送标头。
我认为没有理由直接在浏览器中使用,而不是通过AJAX。除非有人发帖回答,否则我会继续调查。
第二次更新
在几次尝试使此功能失效后,我决定放弃该功能并尝试不同的实现。因为它在我的模块中,我不是在客户端使用cookie来记录产品视图,然后在PHP中读取cookie。这非常有效。
我希望我的调查可以帮助将来的人。