购物车流程
1.创建购物车页面,模型,控制器,数据库
数据表结构如下
CREATE TABLE
cart
(
id
int(11) NOT NULL AUTO_INCREMENT,
goods_id
int(11) NOT NULL,
goods_num
int(11) NOT NULL,
user_id
int(11) NOT NULL,
status
tinyint(1) NOT NULL,
create_time
int(10) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
2.代码流程
首先获取页面传输过来的数据
$data = Yii::$app->request->post();
然后判断用户是否登录
if (Yii::$app->user->isGuest)
如果未登录则将购物车数据保存到cookie当中
//调用此方法将购物数据写入到cookie(在页面显示之前没有真实的写入)
$this->cartToCookie($data);
//从cookie中获取数据在页面显示(刚刚提交的数据并不能获取到)
$cookieCart = Yii::$app->request->cookies->getValue('frontend_cookie');
//1 获取cookie中的所有购物车数据
$carts = unserialize($cookieCart);
//3 将接收数据和cookie中读取的数据合并
if (isset($carts[$data['goods_id']])) {
$carts[$data['goods_id']] += $data['num'];
}else{
$carts[$data['goods_id']] = $data['num'];
}
//2 获取goods_id在购物车中的所有的商品数据
$goodsIdArr = array_keys($carts);
$goods = Goods::findAll($goodsIdArr);
如果用户已经登录,则将购物车数据写入进数据库
//1 查询出购物车中当前用户待支付的购物车数据
$cartGoods = Cart::find()
->where(['goods_id' => $data['goods_id'], 'user_id'=>Yii::$app->user->identity->id, 'status'=>2])
->one();
//2 如果数据库中的待支付数据为空直接写入当前数据
if (empty($cartGoods)) {
$cartModel = new Cart();
$cartModel->goods_id = $data['goods_id'];
$cartModel->goods_num = $data['num'];
$cartModel->user_id = Yii::$app->user->identity->id;
$cartModel->status = 2;
$cartModel->create_time = time();
if ($cartModel->save() === false) {
echo '加入购物车失败';
exit;
}
}else{
//3 如果不为空则将新添加的数据更新到当前商品
$cartGoods->goods_num += $data['num'];
if ($cartGoods->save() === false) {
echo '加入购物车失败';
exit;
}
}
//4 查询出用户所有待支付购物车数据
$mysqlCart = Cart::find()
->where(['user_id'=>Yii::$app->user->identity->id, 'status'=>2])
->asArray()->all();
$goods = [];
$carts = [];
//5 构造和cookie相同的数据结构
if (!empty($mysqlCart)) {
foreach($mysqlCart as $v){
$carts[$v['goods_id']] = $v['goods_num'];
}
$goods = Goods::findAll(array_keys($carts));
}
}
最后将数据返回到页面当中
return $this->render('cart', [
'goods' => $goods,
'carts' => $carts
]);