通过AJAX

时间:2015-12-14 21:12:58

标签: php ajax session magento2

我目前正在编写一个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请求的内容?域名是相同的,因此没有跨域问题。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

<强>更新

我开始认为这不是一个magento 2问题,它更像是一般会话/ AJAX问题。

我决定测试一个理论并转出SessionManager并使用PHP的$_SESSION全局变量。这导致了同样的问题,因此问题的处理程序不是问题所在。

进一步测试得出结论,正确传递和使用了相​​同的会话ID。使用SessionManager我在set方法之前直接调用了isSessionExists()。此方法返回true,不仅检查有效的会话ID,还确认尚未发送标头。

我认为没有理由直接在浏览器中使用,而不是通过AJAX。除非有人发帖回答,否则我会继续调查。

第二次更新

在几次尝试使此功能失效后,我决定放弃该功能并尝试不同的实现。因为它在我的模块中,我不是在客户端使用cookie来记录产品视图,然后在PHP中读取cookie。这非常有效。

我希望我的调查可以帮助将来的人。