帝国cms商城的购物车功能有个小bug,在360浏览器中商品加入购物车后,购物车产品的数量会翻倍(其他浏览器没问题),后来发现是360浏览器在用submit提交表单时,会出现两次验证,导致表单重复提交。
 
解决的思路:在产品内容模板的加入购物车的表单中添加一个随机数,用于做判断。
然后在购物车的验证页面,建议一个COOKIE缓存字段,每次产品加入购物车,在验证页面中,通过判断COOKIE缓存字段的值是否和get传递过来的随机数相同,来确定表单是否重复提交。
如果相同,该产品则不加入购物车,并将COOKIE缓存字段的值清空。
如果不相同,则将该产品加入购物车,并将COOKIE缓存字段的值设置为get传递过来的随机数。
这样浏览器如果出现重复提交,COOKIE缓存字段的值就会与get传递过来的随机数相同,便可以阻止表单重复提交;
 
解决方法如下:
 
1、在帝国cms产品模板的加入购物车的表单中加入以下代码
<input type="hidden" name="gd_yanzhenghao" value="" id="gd_yanzhenghao">
//建立一个判断用的随机数
 
2、在表单的提交按钮中加入:
onclick="alpj_gongdanhao()"
也就是在 <input name="submit"  type="submit"····> 这一行中加入;
 
3、在产品页加入以下js
----------------------------------------------------------------------------
<script>
function alpj_gongdanhao() {
var prefix = '';
for (var j = 0; j < 12; j++) {
prefix = prefix + Math.floor(Math.random() * 15);
}
var pj_showGD =prefix;
document.getElementById("gd_yanzhenghao").value = pj_showGD;
}
 
//获取文本框的值,若文本框为空则自动生成随机日期
function SJ_PageLoad(){
var neirong_sj = document.getElementById("gd_yanzhenghao").value;
if ( neirong_sj == null || neirong_sj == undefined || neirong_sj=="" ){
console.log( alpj_gongdanhao() );//自动执行上方函数然后自动输入一个随机工单号
 
}
}
</script>
--------------------------------------------------------
 
3、打开\e\ShopSys\class\ShopSysFun.php文件
 
找到以下函数:
//加入购物车
function AddBuycar($classid,$id,$pn=1,$add){
在该函数的结尾加上一个“}”符号
 
然后在该函数中找到以下代码,约在该函数的第五行:
if(empty($classid)||empty($id)||empty($class_r[$classid][tbname]))
 
在其上方加入以下代码:
--------------------------------------------------------------------------------
//判断浏览器是否重复提交了表单
$gd_chongfuPD=$_COOKIE["gd_chongfuPD"];
if($gd_chongfuPD==$_GET['gd_yanzhenghao']){
$gd_chongfuPD='';
// 发送一个缓存cookie用做判断
setcookie("gd_chongfuPD",$gd_chongfuPD);
header("location:/e/ShopSys/buycar/");
}else{
$gd_chongfuPD=$_GET['gd_yanzhenghao'];
// 发送一个缓存cookie用做判断
setcookie("gd_chongfuPD",$gd_chongfuPD);
----------------------------------------------------------------------------
 
结束!点赞!
 
懒鸟飞测试过,可以正常使用。
 
 
还有一种解决方法,不过这方法效果没有第一种方法好。仅供参考。
方法二:
注意:方法2只有在将‘购物车最大商品数’设置为‘1’时才有效,方法1则没有限制!!!
我直接将加入购物车变成立即购买,所以这个方法可以用,但是如果是要购物车有多个产品的,这个方法则没有用!!!

360浏览器购物车表单重复提交导致购物车商品数量翻倍的问题解决办法

打开/e/ShopSys/class/ShopSysFun.php文件,
1、约在147行,找到:
-------------------------------------------------------
$addatt=ShopSys_BuycarInfoAdd($add['addatt']);
将其修改为:
$pro_code = date('Y-m-d H:i:s',time());
$addatt=ShopSys_BuycarInfoAdd($add['addatt'])."<br>提交时间 :".$pro_code;

在商品的附加属性的后方添加一个‘提交时间’或其它的随机数,这样,商品的标题每次提交表单时就会不一样,而因为‘购物车最大商品数’设置为‘1’,所以,表单重复提交时出现前面提交的商品就会自动被清除掉;

购物车最大商品数参数设置方法:进入后台>商城>商城参数设置
将其中的‘购物车最大商品数’设置为‘1’;