虚位以待(AD)
虚位以待(AD)
首页 > CMS教程 > Ecshop > ecshop 二次开发的组合属性插件功能

ecshop 二次开发的组合属性插件功能
类别:Ecshop   作者:码皇   来源:互联网   点击:

一、修改的原因最近有一个ecshop项目涉及到商品规格的联动变价。客户是做珠宝的,其中有珍珠这个产品,而珍珠这个产品的价格因素有大小和颜色,不同大小及颜色的珍珠自然价格自然不同。而ecshop本身的单一属性价格 ,魔客吧

ecshop 组合属性插件的二次开发

一、修改的原因

最近有一个ecshop项目涉及到商品规格的联动变价。客户是做珠宝的,其中有珍珠这个产品,而珍珠这个产品的价格因素有大小和颜色,不同大小及颜色的珍珠自然价格自然不同。而ecshop本身的单一属性价格增减明显不能满足这个需求。
例:
比如大小属性有8mm 、10mm 的选择,颜色有南洋金珍珠耳环、黄色的选择。组合起来就有 南洋金珍珠耳环8mm、南洋金珍珠耳环10mm、大溪地黑珍珠耳环8mm、大溪地黑珍珠耳环10mm。四种珍珠是不同的价格,分别是1000元、1500元、1200元及1800元,如下表:

颜色 大小 价格
南洋金珍珠耳环 8mm 1000
南洋金珍珠耳环 10mm 1500
大溪地黑珍珠耳环 8mm 1200
大溪地黑珍珠耳环 10mm 1800

如果按照ecshop原有的单一属性增减价格,如果基本价格定为 1000元 ,南洋金珍珠耳环 加价0元,大溪地黑珍珠耳环加价200元,8mm 加价0元,10mm加价500元,那么最后得出的价格为:

颜色 大小 价格
南洋金珍珠耳环 8mm 1000
南洋金珍珠耳环 10mm 1500
大溪地黑珍珠耳环 8mm 1200
大溪地黑珍珠耳环 10mm 1700

可以看到 最后 大溪地黑珍珠耳环的价格 与需求要求的价格不同。那么就只有对每一款产品进行单独定价(而不是针对规格)。

二、开发方向

那么要实现这个需要二次开发的地方有:

1、数据库products表 ,新增product_price 字段

  1. Product_id mediumint(8) 否 货品id
  2. Goods_id mediumint(8) 否 关联的商品的id
  3. Goods_attr varchar(50) 是 商品的属性id 以| 分隔
  4. Product_sn varchar(50) 是 货品 sn
  5. Product_number smallint(5) 是 货品库存
  6. product_price decimal(10,2) 是 货品价格(增减值)

2、计算商品规格价格函数 spec_price

  1. /**
  2. * 获得指定的规格的价格
  3. *
  4. * @access public
  5. * @param mix $spec 规格ID的数组或者逗号分隔的字符串
  6. * @return void
  7. */
  8. function spec_price($spec)
  9. {
  10. if (!empty($spec))
  11. {
  12. if(is_array($spec))
  13. {
  14. foreach($spec as $key=>$val)
  15. {
  16. $spec[$key]=addslashes($val);
  17. }
  18. }
  19. else
  20. {
  21. $spec=addslashes($spec);
  22. }
  23. $where = db_create_in($spec);
  24. $goods_attr_id=sort_goods_attr_id_array($spec);
  25. //新增计算货品价格-start
  26. $price=0;
  27. if(!empty($goods_attr_id)){
  28. $goods_attr=implode("|",$goods_attr_id['sort']);
  29. $sql='SELECT product_price FROM '.$GLOBALS['ecs']->table('products') ."WHERE goods_attr = '$goods_attr' ";
  30. $price = floatval($GLOBALS['db']->getOne($sql));
  31. }
  32. //新增计算货品价格-end
  33. $sql = 'SELECT SUM(attr_price) AS attr_price FROM ' . $GLOBALS['ecs']->table('goods_attr')
  34. . " WHERE goods_attr_id $where";
  35. $price = $price+floatval($GLOBALS['db']->getOne($sql));
  36. }
  37. else
  38. {
  39. $price = 0;
  40. }
  41. return $price;
  42. }

3、后台需要修改界面 ,在添加商品属性的时候自动生成货品列表 ,核心函数如下

  1. /*
  2. * 二维数组之间排列组合
  3. * */
  4. function attr_combine ($arr, &$re = array(), $value = array(), $index = 0) {
  5. $c = count ($arr);
  6. if ($index < $c - 1) {
  7. foreach ($arr[$index] as $v) {
  8. $tem = $value;
  9. $tem[] = $v;
  10. attr_combine ($arr, $re, $tem, $index + 1);
  11. }
  12. }
  13. else {
  14. foreach ($arr[$index] as $v) {
  15. $tem = $value;
  16. $tem[] = $v;
  17. $re[] = $tem;
  18. }
  19. }
  20. }

调用该函数,批量生成 单选属性之间的组合 ,然后插入products数据表。

4、修改后台操作界面

ecshop 属性分类后台效果


属性分类 前台效果


5、app接口需要修改 goods 接口 返回products表的信息

接口名称:商品
接口地址:goods
请求方式:post
接口参数:

参数名 默认值 举例 是否必须 说明
goods_id 0 10 商品的id
  1. "specification": [
  2. {
  3. "attr_type": "1",
  4. "name": "u5927u5c0f",
  5. "value": [
  6. {
  7. "label": "7.5-8mm",
  8. "price": "0",
  9. "format_price": "uffe50.00u5143",
  10. "id": "137"
  11. }
  12. ]
  13. },
  14. {
  15. "attr_type": "1", //属性类型 0 唯一属性,1:单选属性,2:复选属性
  16. "name": "u989cu8272",//属性名称
  17. "value": [
  18. {
  19. "label": "u91d1u9ec4u8272",//属性值标签
  20. "price": "0",//价格增减量 attr_type=1 时忽略次值
  21. "format_price": "uffe50.00u5143",
  22. "id": "138" //属性id (对应goods_attr 表中的 goods_attr_id)
  23. }
  24. ]
  25. }
  26. ],
  27. "goods_attr_combine_price": [
  28. {
  29. "product_sn": "YS02HS464g_p06", //货品的sn编码
  30. "goods_attr": "137|138", // 商品属性表的id( 对应specification[0].value[0].id)组合
  31. "product_number": "2",// 货品的库存
  32. "product_price": "0.00"// 该规格 ("goods_attr": "137|138")的价格(增减量),计算价格是 是用商品的 shop_price +product_price
  33. }
  34. ]
相关热词搜索: ecshop 二次开发的组合属性插件功能