Ecshop ajax应用讨论

2016-07-07 15:00 来源:www.chinab4c.com 作者:ecshop专家



一年多来根据我对ecshop ajax应用的了解 总结如下:

例:就我个人实现点击购物按钮后立即更新购物车数量方案

1、比如我们category.dwt 里有
  1. <a href='flow.php'><SPAN id='cart_count_all'>{insert name='cart_info'}</SPAN></A>
复制代码

同时此页面有
  1. <a onclick="javascript:addToCart_xaphp({$goods.goods_id});" style="cursor: pointer;">添加购物车</a
复制代码

我们现在需要实现点击按钮后页面不刷新去更新上面购物车数量
2、首先我们需要调入系统
  1. {insert_scripts files='transport.js,utils.js'}
复制代码

这俩个js文件 是有关ajax实现效果的类问题我们大可不去管 只需要调入 下来我们打开系统的common.js文件
进行添加我们自己的添加购物车函数
  1. function addToCart_xaphp(goodsId, parentId)
  2. {
  3. var goods = new Object();
  4. var spec_arr = new Array();
  5. var fittings_arr = new Array();
  6. var number = 1;
  7. var formBuy = document.forms['ECS_FORMBUY'];
  8. var quick = 0;

  9. // 检查是否有商品规格

  10. goods.quick = quick;
  11. goods.spec = spec_arr;
  12. goods.goods_id = goodsId;
  13. goods.number = number;
  14. //goods.guige = guige;
  15. goods.parent = (typeof(parentId) == "undefined") ? 0 : parseInt(parentId);

  16. Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse_xaphp, 'POST', 'JSON');
  17. }
复制代码

解释;a.点击按钮首先执行这个函数 获取我们的数据

b. Ajax.call('flow.php?step=add_to_cart', 'goods=' + goods.toJSONString(), addToCartResponse_xaphp, 'POST', 'JSON'); 这是局部执行 也就是无刷新执行flow.php?step=add_to+cart 同时把数据通过POST提交,有关json具体原理想研究的朋友可以去网上找资料。

c、addToCartResponse_xaphp回调函数很重要.

3、以上系统内部访问flow.php 那么我们当然要去flow.php
打开flow.php 我们找到 if($_REQUEST['step'] == 'add_to_cart' ){添加购物车的程序 }

解释:a、我们通过POST传递了数据 在.php文件当然需要接收。首先我们要调入json处理数据文件 include_once('includes/cls_json.php');这个文件很重要 即 js 和php 直接通过一种方式俩者进行数据交互

b、$result = array('error' => 0, 'message' => '', 'content' => '', 'goods_id' => ''); 这个也是我们常用的 默认定义数组。

c、$json= new JSON;声明json类

d、$goods = $json->decode($_POST['goods']); 数据接收给$goods

4、 比如我们添加购物车成功 我们可以数组里定义 $result['error']=0;就是把我们用到的数据放入$result数组
形象点 个人理解就是 通过die($json->encode($result));数据传递给我们刚才的回调函数

下来我看回调函数的写法

  1. function addToCartResponse_xaphp(result)
  2. {
  3. if (result.error > 0)
  4. {
  5. // 如果需要缺货登记,跳转
  6. if (result.error == 2)
  7. {
  8. if (confirm(result.message))
  9. {
  10. location.href = 'user.php?act=add_booking&id=' + result.goods_id;
  11. }
  12. }
  13. // 没选规格,弹出属性选择框
  14. else if (result.error == 6)
  15. {
  16. openSpeDiv(result.message, result.goods_id, result.parent);
  17. }
  18. else
  19. {
  20. alert(result.message);
  21. }
  22. }
  23. else
  24. {

  25. getCartNumber();
  26. }

  27. }
  28. function getCartNumber(){
  29. Ajax.call('transport.php?act=cart_number', '', getCartNumberResponse, 'GET', 'JSON');
  30. }
复制代码


解释:回调函数里我们又调用 getCartNumber()函数 在这个函数里我们又一次利用ajax查询购物车数量
transport.php代码
  1. if($_REQUEST['act'] =='cart_number')
  2. {
  3. include_once('includes/cls_json.php');
  4. //$_POST['goods'] = json_str_iconv($_GET['goods_id']);

  5. $sql = 'SELECT SUM(goods_number) AS number, SUM(goods_price * goods_number) AS amount' .
  6. ' FROM ' . $GLOBALS['ecs']->table('cart') .
  7. " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
  8. $row = $GLOBALS['db']->GetRow($sql);

  9. if ($row)
  10. {
  11. $number = intval($row['number']);
  12. $amount = floatval($row['amount']);
  13. }
  14. else
  15. {
  16. $number = 0;
  17. $amount = 0;
  18. }


  19. $json = new JSON;
  20. $result['content'] = $number;
  21. die($json->encode($result));
  22. }
复制代码
然后在传回回调函数

  1. function getCartNumberResponse(result){
  2. //alert(result.content);
  3. var message = '('+result.content+')';
  4. document.getElementById('cart_count_all').innerHTML = message;
  5. }
复制代码
好 我们接收数据库查询到的数量 然后通过innerHTML写入到 cart_count_all层搞定。


以上俩次应用了 ajax ,只要大家看完例子我相信对ec ajax的功能定可以掌握,以便我们可以轻松应用。
排版不是很整齐夜深了 等有时间在调一下。

回答:
对新手很有帮助!支持!

顶一下,齐老师

不是很明白。transport.php这个文件没有,是新增加的吗?

绝对技术层面,谢谢齐老师

支持!齐老师发帖 每次都来支持下

谢谢齐老师哦

好东西,好好研究下

支持一直对EC的 AJAX不太理解 终于豁然开朗了!~支持齐老师!~

强人帖子里留名!支持

不知道是故意调用两次ajax让人家容易明白ajax原理还是.....
实现点击购物按钮后立即更新购物车数量方案中把getCartNumber();
改成
  1. var cartInfo = document.getElementById('ECS_CARTINFO');
  2. if (cartInfo)
  3. {
  4. alert("商品已经添加到购物车");
  5. cartInfo.innerHTML = result.content;
  6. }
复制代码

不是更简单~不必调用2次ajax

齐老师

可以帮你分析一下,订单列表页载入订单商品 的ajax 如何调用吗?
小弟非常需要此功能用来扩展,就是看不懂希望齐老师抽出宝贵的时间指点一二。 谢谢!

支持,谢谢!

齐老师,我想请教您,如何获取N个商品ID,然后同时放入购物车中呢? 也就是组合购买。

比如 复选,post过去是数组 你用foreach循环在循环里 你把加入购物车代码放入,这个代码在group_buy.php你看看 有类似的