我目前正在编写一个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请求?域是相同的,因此不存在跨域问题。
如有任何帮助,我们将不胜感激。
更新
我开始认为这不是一个magento 2的问题,它更像是一个普通的会话/AAJAX问题。
我决定测试一个理论,关掉SessionManager
,使用PHP的$_SESSION
全局变量。这导致了相同的问题,所以问题不是处理程序。
进一步的测试得出结论,相同的会话ID已通过并正确使用。在使用SessionManager
时,我直接在set方法之前调用了isSessionExists()
。此方法返回true,它不仅检查有效的会话ID,还确认标头尚未发送。
我看不出为什么这可以直接在浏览器中工作,但不能通过AJAX。我会继续调查,除非有人发帖回答我可以试试。
第二次更新
在几次尝试让这个功能发挥作用失败后,我决定放弃这个功能,尝试不同的实现。在我的模块中,我没有在客户端使用cookie来记录产品视图,然后用PHP读取cookie。这非常有效。
我希望我在这里的调查能对将来的人有所帮助。