public function cartlist() { //取出购物车中商品的信息 $cart_model = new \Model\CartModel(); $list = $cart_model->cartlist(); $this->assign('list', $list); $this->display(); }
public function addresslist() { if (session('username') == "") { $this->redirect('User/login'); } else { $cart = new \Model\CartModel(); $data = $cart->cartlist(); $tp = 0; foreach ($data as $k => $v) { $tp += $v['shop_price'] * $v['goods_num']; } $this->assign('tp', $tp); $this->assign('data', $data); $this->display(); } }
public function flow() { //获取购物车中的全部商品 $cart_model = new \Model\CartModel(); $cartlist = $cart_model->cartlist(); //下单之前要判断库存是否充足 //运用文件锁和事务,防止订单出错 $fp = fopen('./Public/order.lock', 'w'); //开始加锁 if (flock($fp, LOCK_EX)) { foreach ($cartlist as $v) { //取出库存,根据goods_id,goods_attr_id来取出(没有属性的商品则在goods表中取) if (!empty($v['goods_attr_id'])) { $where = "goods_id=" . $v['goods_id'] . " and goods_attr_id='" . $v['goods_attr_id'] . "'"; $kc = M('Product')->where($where)->find(); //返回一个一维数组 } else { $kc = M('Goods')->where("goods_id=" . $v['goods_id'])->find(); } if ($kc['goods_number'] < $v['goods_count']) { $this->error('库存不足,无法下订单'); } } //在checkout.html中表单增加隐藏域,用来获取收货人的信息,也可以用连表 //查询的形式,在订单信息表中就不用收货人信息的几个字段,改成收货人表的 //id字段做关联 $data['user_id'] = $_SESSION['user_id']; //用户登陆的id $data['order_sn'] = 'sn_' . uniqid(); //订单号 $cart_model = new \Model\CartModel(); $total = $cart_model->getTotal(); $data['goods_amount'] = $total['total_price']; //总金额 $data['consignee'] = I('post.consignee'); //收货人名 $data['address'] = I('post.address'); //收货人地址 $data['mobile'] = I('post.mobile'); //收货人手机 $data['payment'] = I('post.payment'); //支付方式 $data['shipping'] = I('post.shipping'); //配送方式 $data['addtime'] = time(); //下单时间 //开启事务 mysql_query("start transaction"); $order_id = M('OrderInfo')->add($data); //添加订单信息,成功返回自增的订单编号 if (!$order_id) { //失败就回滚,并释放文件锁 mysql_query("rollback"); flock($fp, LOCK_UN); // 释放锁定 } //将购物车中的商品全部遍历添加到订单商品关系表中 foreach ($cartlist as $v) { $res_id = M('OrderGoods')->add(array('order_id' => $order_id, 'goods_id' => $v['goods_id'], 'goods_name' => $v['info']['goods_name'], 'goods_attr_id' => $v['goods_attr_id'], 'shop_price' => $v['info']['shop_price'], 'goods_count' => $v['goods_count'])); if (!$res_id) { //失败就回滚,并释放文件锁 mysql_query("rollback"); flock($fp, LOCK_UN); // 释放锁定 } } //下单成功,有一个减少库存的操作 //判断订单商品有没有goods_attr_id,有则在product表中修改,没有则在goods表中修改 foreach ($cartlist as $v) { //取出库存,根据goods_id,goods_attr_id来取出(没有属性的商品则在goods表中取) if (!empty($v['goods_attr_id'])) { $where = "goods_id=" . $v['goods_id'] . " and goods_attr_id='" . $v['goods_attr_id'] . "'"; $rs = M('Product')->where($where)->setDec('goods_number', $v['goods_count']); //还要更改商品表中的库存量 M('Goods')->where("goods_id=" . $v['goods_id'])->setDec('goods_number', $v['goods_count']); if (!$rs) { //失败就回滚,并释放文件锁 mysql_query("rollback"); flock($fp, LOCK_UN); // 释放锁定 } } else { $rs = M('Goods')->where("goods_id=" . $v['goods_id'])->setDec('goods_number', $v['goods_count']); if (!$rs) { //失败就回滚,并释放文件锁 mysql_query("rollback"); flock($fp, LOCK_UN); // 释放锁定 } } } //都成功,提交事务 mysql_query("commit"); flock($fp, LOCK_UN); // 释放锁定 } else { $this->error('系统忙,请稍后下单'); } //订单成功,要清空购物车,跳转到显示订单完成的页面 $cart_model->clearCart(); $this->redirect("Order/done", array('order_sn' => $data['order_sn'])); }