购物车能不能做持久化处理?

问题咨询 · successgo · 于 5年前 发布 · 2872 次阅读

使用这么多天以来,我发现,购物车里的东西,隔一段时间商品都没了。估计是有效期过了吧。能不能作持久化处理呢?让购物车不过期。

本文由 supercent 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。

共收到 11 条回复
successgo#15年前 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;
    }
Fecmall#25年前 0 个赞

目前的实现就是永久购物车, 参看代码:

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()方法是可以取到数据的,你这种修改方式是错误的。

大致步骤如下:

1.用户在几天前注册账户并且登陆,作为Register用户,并把产品加入了购物车,但是没有下单,因此购物车数据存在,并且没有被清空。(下单支付后会清空购物车),购物车数据标记为A

2.今天用户换了一个电脑,没有登陆用户,作为Guest(游客)用户然后将某些产品加入购物车,这些产品标记为B

3.如果用户现在登陆1步骤的账户,那么,用户之前加入购物车的产品(Register用户)和当前作为Guest用户的购物车产品就会合并

4.你继续换一个电脑,然后登陆用户,你会发现购物车数据是存在的

5.你不要进行上面的修改,上面的修改是有问题的,你的购物车数据的清空可能是其他原因导致的,譬如下单清空购物车,等等其他

successgo#35年前 1 个赞

因为 session 过期后,再从 session 中获取 cart_id,这时是获取不到的。获取不到的情况下,又会重新创建购物车,因为并不是同一个购物车了。这么一来,结果就是登录的用户会存在多个购物车。

同时还有另外一个问题,不同设备上的购物车没有同步。 问题不存在的。

Fecmall#45年前 0 个赞

session 过期后,登陆用户就会变成Guest,重新登陆用户,购物车数据就有了。

Axin#55年前 0 个赞

我这边开发也会出现上述问题。一个用户出现多个购物车。没去看代码,先放一放。

Fecmall#65年前 0 个赞

@Axin #5楼 一个用户多个购物车是什么意思?

Axin#75年前 0 个赞

@Fecshop #6楼 就是跟3楼说的一样,获取不到的情况,就会在cart表中新建一个购物车记录。就出现了一个用户购物车有多个。

successgo#85年前 0 个赞

@Axin 经过上面我的代码的修改,一个人出现多个购物车的问题就修复掉了,而 @Fecshop 说我这样修改会出现问题,也没有发现会有什么问题呀。

Fecmall#95年前 0 个赞

@successgdc [#8楼](#comment8)

我细看了一下,恩,提交过来pr吧。

successgo#105年前 1 个赞

@Fecshop 好的,我整理一下,发个 PR. 感谢您的认同。

successgo#115年前 0 个赞

@Axin 我发了 PR 提交到仓库了。见 https://github.com/fecshop/yii2_fecshop/pull/47

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics