使用这么多天以来,我发现,购物车里的东西,隔一段时间商品都没了。估计是有效期过了吧。能不能作持久化处理呢?让购物车不过期。
本文由 supercent 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。
已通过重写 Quote 服务里的 getCartId 方法实现了:登录用户只会有一个购物车。
代码如下:
public function getCartId() { if (!$this->_cart_id) { $cart_id = Yii::$service->session->get(self::SESSION_CART_ID); if (! $cart_id) { if (! Yii::$app->user->isGuest) { $customerId = Yii::$app->user->getId(); $cart = $this->getCartByCustomerId($customerId); if ($cart && $cart['cart_id']) { $this->setCartId($cart['cart_id']); } } } else { $this->_cart_id = $cart_id; } } return $this->_cart_id; }
目前的实现就是永久购物车, 参看代码:
https://github.com/fecshop/yii2_fecshop/blob/master/services/cart/Quote.php
当用户登陆后,会调用方法:https://github.com/fecshop/yii2_fecshop/blob/master/services/cart/Quote.php#L486
public function mergeCartAfterUserLogin()
用户登陆,会将购物车数据合并,然后将合并后的cart_id写入session,因此 getCartId()方法是可以取到数据的,你这种修改方式是错误的。
getCartId()
大致步骤如下:
1.用户在几天前注册账户并且登陆,作为Register用户,并把产品加入了购物车,但是没有下单,因此购物车数据存在,并且没有被清空。(下单支付后会清空购物车),购物车数据标记为A
2.今天用户换了一个电脑,没有登陆用户,作为Guest(游客)用户然后将某些产品加入购物车,这些产品标记为B
3.如果用户现在登陆1步骤的账户,那么,用户之前加入购物车的产品(Register用户)和当前作为Guest用户的购物车产品就会合并
4.你继续换一个电脑,然后登陆用户,你会发现购物车数据是存在的
5.你不要进行上面的修改,上面的修改是有问题的,你的购物车数据的清空可能是其他原因导致的,譬如下单清空购物车,等等其他
因为 session 过期后,再从 session 中获取 cart_id,这时是获取不到的。获取不到的情况下,又会重新创建购物车,因为并不是同一个购物车了。这么一来,结果就是登录的用户会存在多个购物车。
同时还有另外一个问题,不同设备上的购物车没有同步。 问题不存在的。
session 过期后,登陆用户就会变成Guest,重新登陆用户,购物车数据就有了。
我这边开发也会出现上述问题。一个用户出现多个购物车。没去看代码,先放一放。
@Axin #5楼 一个用户多个购物车是什么意思?
@Fecshop #6楼 就是跟3楼说的一样,获取不到的情况,就会在cart表中新建一个购物车记录。就出现了一个用户购物车有多个。
@Axin 经过上面我的代码的修改,一个人出现多个购物车的问题就修复掉了,而 @Fecshop 说我这样修改会出现问题,也没有发现会有什么问题呀。
@successgdc [#8楼](#comment8)
我细看了一下,恩,提交过来pr吧。
@Fecshop 好的,我整理一下,发个 PR. 感谢您的认同。
@Axin 我发了 PR 提交到仓库了。见 https://github.com/fecshop/yii2_fecshop/pull/47