当用户购买产品时,可能有时候不仅仅买一件商品,那么当客户购买多个当前产品时如果能同时显示总价,那么无疑将增加我们网站的亲和度!实现这个办法并不难,就是增加一个即时计算商品总价的js代码,这个网络有一篇文章“ECSHOP选择商品属性购买商品数量增加商品总价”介绍了这个方法,他这个标题实在难理解,所以百蔬君修改为“ECSHOP产品详情页修改商品购买数量并实时更新商品总价的实现与优化”。

它的代码是这样实现的。

修改的主要页面是:模板下面的goods.dwt

 
  1. <form action="javascript:addToCart({$goods.goods_id})" method="post" name="ECS_FORMBUY" id="ECS_FORMBUY" >
  2. <!-- {* 开始循环所有可选属性 *} -->
  3. <!-- {foreach from=$specification item=spec key=spec_key} -->
  4. <li class="padd loop">
  5. <strong>{$spec.name}:</strong><br />
  6. <!-- {* 判断属性是复选还是单选 *} -->
  7. <!-- {if $spec.attr_type eq 1} -->
  8. <!-- {if $cfg.goodsattr_style eq 1} -->
  9. <!-- {foreach from=$spec.values item=value key=key} -->
  10. <label for="spec_value_{$value.id}">
  11. <input type="radio" name="spec_{$spec_key}" value="{$value.id}" id="spec_value_{$value.id}" {if $key eq 0}checked{/if} onclick="changePrice()" />
  12. {$value.label} [{if $value.price gt 0}{$lang.plus}{elseif $value.price lt 0}{$lang.minus}{/if} {$value.format_price|abs}] </label><br />
  13. <!-- {/foreach} -->
  14. <input type="hidden" name="spec_list" value="{$key}" />
  15. <!-- {else} -->
  16. <select name="spec_{$spec_key}" onchange="changePrice()">
  17. <!-- {foreach from=$spec.values item=value key=key} -->
  18. <option label="{$value.label}" value="{$value.id}">{$value.label} {if $value.price gt 0}{$lang.plus}{elseif $value.price lt 0}{$lang.minus}{/if}{if $value.price neq 0}{$value.format_price}{/if}</option>
  19. <!-- {/foreach} -->
  20. </select>
  21. <input type="hidden" name="spec_list" value="{$key}" />
  22. <!-- {/if} -->
  23. <!-- {else} -->
  24. <!-- {foreach from=$spec.values item=value key=key} -->
  25. <label for="spec_value_{$value.id}">
  26. <input type="checkbox" name="spec_{$spec_key}" value="{$value.id}" id="spec_value_{$value.id}" onclick="changePrice()" />
  27. {$value.label} [{if $value.price gt 0}{$lang.plus}{elseif $value.price lt 0}{$lang.minus}{/if} {$value.format_price|abs}] </label><br />
  28. <!-- {/foreach} -->
  29. <input type="hidden" name="spec_list" value="{$key}" />
  30. <!-- {/if} -->
  31. </li>
  32. <!-- {/foreach} -->
  33. <!-- {* 结束循环可选属性 *} -->

在下面增加代码

 
  1. <!-- 商品总价-->
  2. {$lang.amount}:<span id="ECS_GOODS_AMOUNT" class="shop"></span>
  3. <!-- 商品总价结束-->

如果要隐藏商品总价写成:

 
  1. <span id="ECS_GOODS_AMOUNT" style="display: none;"></span>

然后修改我们的input输入框的代码

 
  1. <!-- 购买商品数量选择-->
  2. {$lang.number}:
  3. <input name="number" type="text" id="number" value="1" size="4" onblur="changePrice()" style="border:1px solid #ccc; "/>
  4. <!-- 购买商品数量结束-->
  5. </form>

这个就是填加一个失焦事件onblur="changePrice()",当购买数量输入后,鼠标离开的时候就会激发ja的changePrice函数来计算总价。

然后在 </body> 后面 加上下面这段JS代码

 
  1. <script type="text/javascript">// <![CDATA[
  2. var goods_id = {$goods_id};
  3. var goodsattr_style = {$cfg.goodsattr_style|default:1};
  4. var gmt_end_time = {$promote_end_time|default:0};
  5. {foreach from=$lang.goods_js item=item key=key}
  6. var {$key} = "{$item}";
  7. {/foreach}
  8. var goodsId = {$goods_id};
  9. var now_time = {$now_time};
  10. <!-- {literal} -->
  11. onload = function(){
  12. changePrice();
  13. fixpng();
  14. try { onload_leftTime(); }
  15. catch (e) {}
  16. }
  17. /**
  18. * 点选可选属性或改变数量时修改商品价格的函数
  19. */
  20. function changePrice()
  21. {
  22. var attr = getSelectedAttributes(document.forms['ECS_FORMBUY']);
  23. var qty = document.forms['ECS_FORMBUY'].elements['number'].value;
  24. Ajax.call('goods.php', 'act=price&id=' + goodsId + '&attr=' + attr + '&number=' + qty, changePriceResponse, 'GET', 'JSON');
  25. }
  26. /**
  27. * 接收返回的信息
  28. */
  29. function changePriceResponse(res)
  30. {
  31. if (res.err_msg.length > 0)
  32. {
  33. alert(res.err_msg);
  34. }
  35. else
  36. {
  37. document.forms['ECS_FORMBUY'].elements['number'].value = res.qty;
  38. if (document.getElementById('ECS_GOODS_AMOUNT'))
  39. document.getElementById('ECS_GOODS_AMOUNT').innerHTML = res.result;
  40. }
  41. }
  42. <!-- {/literal}
  43. // ]]></script>

可以看到这段代码是利用ajax的json来动态交互,查询我们的商品单价,同时求得商品购买数,从而计算出总价,最后利用document.getElementById的innerHTML将计算结果输出到网页上,从而实现即时显示当前商品的总价!ajax json的强大让人由衷的佩服。

这段代码是可以使用的,百蔬君也使用了较长一段时间,但总感觉打开商品页有时候非常卡,前段时间终于下定决心要搞明白是怎么一回事,经过无数次的测试和检查,最后终于确定就是这段代码导致我的商品页的加载缓慢。百蔬君认为基本上每一个二次开发的ecshop基本上都有这个显示当前商品总价的功能,由于这段代码严重拖慢商品详情页的打开速度,需要进行优化调整。经过一些修改与优化,最后找到了问题的症结,那么下面我们来分享怎样来优化这段代码。
拖慢商品详情页打开速度缓慢的最主要的问题就是我们最后加载在后面的即时执行函数。

 
  1. <!-- {literal} -->
  2. onload = function(){
  3. changePrice();
  4. fixpng();
  5. try { onload_leftTime(); }
  6. catch (e) {}
  7. }

从这段代码可以看出,当页面执行完成后就会加载这个函数,那么马上就要执行一次changePrice();,而就是因为这个函数的执行影响了整个页面的加载,因为在页面加载完之后他还要去检查一次数量和商品的单价,计算出总价显示。很多时候我看页面都是卡在这里,等到这个价格计算显示完之后页面才能加载完成。
那么我们优化修改的地方也就是在这里。由于这个地方的changePrice()的执行是第一个,也就是说他的数量和单价都是默认的,那么我们完全可以在lib_goods.php中就计算好这个总价,然后直接输出就好了。
好了,优化分为3步:
1,themes/模板名/goods.dwt
注释掉上面代码中的changePrice();

2,直接显示第一次的价格和数量。
打开includes/lib_goods.php
函数function get_goods_info($goods_id)

 
  1. if ($row['promote_price'] > 0)
  2. {
  3. $promote_price = bargain_price($row['promote_price'], $row['promote_start_date'], $row['promote_end_date']);
  4. }
  5. else
  6. {
  7. $promote_price = 0;
  8. }

下面添加

 
  1. /*初始化商品起始总价*/
  2. if ($promote_price != 0)
  3. {
  4. $temp_price=$row['promote_price'];
  5. }
  6. else
  7. {
  8. $temp_price=$row['shop_price'];
  9. }
  10. if ($row['min_buynum'] <1) { $row['min_buynum']=1;} //保证$row['min_buynum'不为零
  11. $row['shop_price_formatednew'] = price_format($temp_price * $row['min_buynum']);

$promote_price变量经过bargain_price函数判断之后,如果商品在促销期内,并且设置了促销价格话,那么将返回促销价格,总价将以促销价格为准。如果为零,则说明没有促销,那么商品总价就以标准的零售价来计算。这里的$promote_price判断相当重要,否则将导致过了促销期,仍然显示促销价格的问题,百蔬君也是在一个偶然的机会发现,没有判断促销时间,只是判断了促销价是否为0。结果促销期过了之后还是显示促销价格。

$row['min_buynum'在这里是因为我们做了最小起订量的优化,那么保证$row['min_buynum'的值不为零就好了,如果是0,就表示没有启动最低购买量的显示,那么最低商品数就是1。

这样就获得了正确的最少购买商品数和当时的商品销售价格,把计算结果赋值给$row['shop_price_formatednew'],留给模板页调用。

3,最后在模板中输出我们计算好的总价shop_price_formatednew就好了
themes/模板名//goods.dwt

 
  1. <strong>{$lang.amount}:</strong><span id="ECS_GOODS_AMOUNT" class="shop_1"></span>

修改为

 
  1. <strong>{$lang.amount}:</strong><span id="ECS_GOODS_AMOUNT" class="shop_1">{$goods.shop_price_formatednew} </span>

文章转载于: http://www.baishujun.com/archives/819.html

ECSHOP产品详情页修改商品购买数量并实时更新商品总价的实现与优化相关推荐

  1. 方维分享系统模板修改,产品详情页note修改

    方维分享系统模板修改,产品详情页note修改 note.htm, 一般是用的note_img.htm: --------------------------------评论-------------- ...

  2. 如何优化详情页快速促成转化[淘宝 ID 获取商品接口]

    大家好,我是小编v兔.平台提供订单旗帜接口,备注接口,打单接口,发货接口.商品上架接口,下架接口,发布商品接口(支持多个电商平台)淘宝,抖音,拼多多,快手,等等. 我们都知道如何计算一个店铺的销售额, ...

  3. 商城商品购买数量增减的完美JS效果

    商城商品购买数量增减的完美JS效果 近期在开发一个地方O2O租书项目,使用ASP.NET MVC技术,其中在图书详情页,用户可以输入借阅的数量,这里使用了js来控制数量的增减和校验. 数量一定是数字 ...

  4. vue实战-产品详情页(轮播图、放大镜)

    vue实战-产品详情页(轮播图.放大镜) 1.添加产品详情页的静态组件 因为它是路由组件,将其放入pages文件夹下. 注册路由组件 1)router中添加Detail的路由. {path:'/det ...

  5. 亚马逊跨境电商如何编辑产品详情页 亚马逊产品listing优化

    产品详情页是买家了解产品的重要途径.也是影响产品转化率的重要因素.今天海熹跨境人才网给大家分享一下关于亚马逊跨境电商产品详情页的优化,亚马逊产品listing优化.一起来了解一下吧. 1:售前关联营销 ...

  6. 我是如何实现前端H5第一个产品详情页实现的思路及步骤。

    今天公司讨论了,接下来,我们为我们的单品网的工作具体任务安排. 由老马来组织召开了三人的简单会议. 会议就在整个开放的大办公室里(40-50人)进行,我,老马,老卢,坐在一个小圆桌上,开始了我们的会议 ...

  7. 电商详情页系统实战(2) -小型电商网站商品详情页的页面静态化架构及缺陷

    商品详情页的系统架构 => 缓存架构 => 高并发 => 高可用 电商网站里,大概可以说分成两种 小型电商 简单的一种架构方案,页面静态化的方案 大型电商 复杂的一套架构,大电商,国 ...

  8. cms自动更新php文件,织梦cms内容页修改或者删除文章之后自动更新上下篇或者首页...

    织梦CMS后台修改.删除文章后自动更新首页和相应列表页.织梦后台只能开启发布后更新主页,列表,和上下页.有时候我们需要在编辑时也能更新想要的,这样不用每次去生成. 使用织梦CMS建站时我们通常会需要删 ...

  9. 淘宝产品详情页 上拉加载图片详情 效果实现

    希望有建议可以一起交流. 不累赘多余语言,看效果图: 代码如下 #import "ViewController.h" #import "UIView+Category.h ...

最新文章

  1. IM云将给在线教育带来哪些变革?
  2. 教你阿里云企业版服务器配置到底怎么选?阿里云ECS相关术语汇总
  3. Vue.js入门教程-组件注册
  4. VS2005+ACCESS WEB程序出错数据访问权限错误的解决方法
  5. AngularJS之中级Route【二】(七)
  6. 使用docker连接远程仓库反复出现密码错误
  7. Joomla css类后缀
  8. C语言中动态数组的分配
  9. 如何在Linux下编译Openwrt的ipk(编译Dogcom为例)
  10. 汽车洒水器的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  11. 活化脂修饰NOTA,NOTA-NHS ester,CAS:1338231-09-6
  12. 广义表的存储结构及其基本运算
  13. CPU 与 GPU 渲染:如何选择及原因?
  14. 异星工厂 自动机器人_异星工厂自动科研系统建造技巧_图文攻略
  15. UID_PS_01_大师之路
  16. 阿里云团队畅谈图片服务架构演进
  17. 轻量级开源php源码,YzmCMS轻量级开源CMS v6.0
  18. bzoj4424 Cf19E Fairy 树形dp
  19. 微信试行松绑外链:点对点聊天可直接访问,群聊试开放电商类外链
  20. 消除计算机上的静电有哪些方法,电脑静电如何消除详解【图文介绍】

热门文章

  1. 探访上汽通用武汉奥特能超级工厂
  2. #define宏的妙用!实现你以为的函数offsetof等
  3. Promise.all()、Promise.allSettled()、Promise.any()、Promise.race()用法与区别
  4. Word标题设置快捷键
  5. SQLServer数据库出现“无法访问数据库XXX(object问题修复
  6. vue中$refs的三种用法
  7. 0xC0000005: 读取位置 0x00000001 时发生访问冲突
  8. call和calling的用法_英语词汇call的短语及用法
  9. 我最爱用的一款 Redis 可视化管理工具——Another Redis Desktop Manager
  10. linux库怎么安装路径设置,Linux libtins 库安装教程