°

tp5开发的商城购物车计算问题分析

PHP实战视频教程大全

tp5第四季开发的B2C商城中购物车的知识点是非常多的,我们还是要拿出这个图:

我们在点击左侧的复选框的时候,如果加入购物车的是不同的商品,商品价格的计算是没有没问题的,但是如果我们选择同一个商品的不同的属性添加到购物车两次以上就会发现问题了,因为我们使用的模板中,每次当我们点击复选框的时候ajax会自动把剩下的处于选定状态的商品的id发送到服务器,进而计算商品价格等信息,但是如果我们加的是同一件商品到购物车中就会出现以下问题:

1、前端页面出错

在我们点击左侧复选框的时候商品的id是有参与进去的,如果两个商品的id相同,那么肯定就会产生影响进而导致错误

2、服务端计算剩余购物车中的商品价格的时候会出错

因为两件商品的id相同,即便你取消了一个,另一个也会发送,相当于没有取消,那么就会继续计算,导致结果出错

所以我们想到的解决办法是,即便是同一个商品,也要让他们的id不同,怎么不同呢?

将该商品的商品属性的id也放到id里面即可解决,即:

原来id的格式为:id=”1″

修改后的id的格式为:id=”1-12,13″    id-商品属性1的id,商品属性2的id

这样如果再有重复的,就不会分两条展示了,而是在后面的数量中加1了,这样我们的问题就解决了,最后看看我们的核心代码:

[php]
//购物车数据改动时,计算选中的商品的总价格、节省价格、总数
//$recId为选中的商品的id字符串:1,2,3
public function ajaxCartGoodsAmount($recId){
//$recId格式:rec_id:15-68,69@16-72,75@16-73,76
$goods=model(‘goods’);
$_cart[‘subtotal_number’]=0;//商品总数
$_cart[‘goods_amount’]=0;//商品会员价总金额
$_cart[‘save_total_amount’]=0;//优惠节省总金额
$_cart[‘shop_total’]=0;//商品本店价总金额
$recIdArr=explode(‘@’, $recId);
$cart=isset($_COOKIE[‘cart’]) ? unserialize($_COOKIE[‘cart’]) : array();
//删除未选定的购物车中的商品
foreach ($cart as $k => $v) {
//$arr=explode(‘-‘, $k);//$arr[0]就是商品id,如果存在第二个元素的话$arr[1]代表商品单选属性id字符串
if(!in_array($k, $recIdArr)){
unset($cart[$k]);
}
}
//开始计算商品信息
foreach ($cart as $k => $v) {
//计算商品总数
$_cart[‘subtotal_number’]+=$v;
//计算商品总会员价(含属性价格)
$arr=explode(‘-‘, $k);//$arr[0]就是商品id,如果存在第二个元素的话$arr[1]代表商品单选属性id字符串
$memberPrice=$goods->getMemberPrice($arr[0]);
//计算商品总本店价(含属性价格)
$shopPrice=$goods->getShopPrice($arr[0]);
if($arr[1]){
$goodsAttrPrice=0;
$goodsAttrRes=db(‘goods_attr’)->field(‘attr_price’)->where(‘id’,’in’,$arr[1])->select();
foreach ($goodsAttrRes as $k1 => $v1) {
$goodsAttrPrice+=$v1[‘attr_price’];
}
$memberPrice+=$goodsAttrPrice;
$shopPrice+=$goodsAttrPrice;
}
$_cart[‘goods_amount’]+=$memberPrice*$v;
$_cart[‘shop_total’]+=$shopPrice*$v;
}
//计算商品总节省
$_cart[‘save_total_amount’]=$_cart[‘shop_total’]-$_cart[‘goods_amount’];
return $_cart;
}
[/php]

打赏
  喜欢