一、修改的原因
最近有一个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 字段
- Product_id mediumint(8) 否 货品id
- Goods_id mediumint(8) 否 关联的商品的id
- Goods_attr varchar(50) 是 商品的属性id 以| 分隔
- Product_sn varchar(50) 是 货品 sn
- Product_number smallint(5) 是 货品库存
- product_price decimal(10,2) 是 货品价格(增减值)
2、计算商品规格价格函数 spec_price
- /**
- * 获得指定的规格的价格
- *
- * @access public
- * @param mix $spec 规格ID的数组或者逗号分隔的字符串
- * @return void
- */
- function spec_price($spec)
- {
- if (!empty($spec))
- {
- if(is_array($spec))
- {
- foreach($spec as $key=>$val)
- {
- $spec[$key]=addslashes($val);
- }
- }
- else
- {
- $spec=addslashes($spec);
- }
- $where = db_create_in($spec);
- $goods_attr_id=sort_goods_attr_id_array($spec);
- //新增计算货品价格-start
- $price=0;
- if(!empty($goods_attr_id)){
- $goods_attr=implode("|",$goods_attr_id['sort']);
- $sql='SELECT product_price FROM '.$GLOBALS['ecs']->table('products') ."WHERE goods_attr = '$goods_attr' ";
- $price = floatval($GLOBALS['db']->getOne($sql));
- }
- //新增计算货品价格-end
- $sql = 'SELECT SUM(attr_price) AS attr_price FROM ' . $GLOBALS['ecs']->table('goods_attr')
- . " WHERE goods_attr_id $where";
- $price = $price+floatval($GLOBALS['db']->getOne($sql));
- }
- else
- {
- $price = 0;
- }
- return $price;
- }
3、后台需要修改界面 ,在添加商品属性的时候自动生成货品列表 ,核心函数如下
- /*
- * 二维数组之间排列组合
- * */
- function attr_combine ($arr, &$re = array(), $value = array(), $index = 0) {
- $c = count ($arr);
- if ($index < $c - 1) {
- foreach ($arr[$index] as $v) {
- $tem = $value;
- $tem[] = $v;
- attr_combine ($arr, $re, $tem, $index + 1);
- }
- }
- else {
- foreach ($arr[$index] as $v) {
- $tem = $value;
- $tem[] = $v;
- $re[] = $tem;
- }
- }
- }
调用该函数,批量生成 单选属性之间的组合 ,然后插入products数据表。
4、修改后台操作界面
5、app接口需要修改 goods 接口 返回products表的信息
接口名称:商品
接口地址:goods
请求方式:post
接口参数:
参数名 | 默认值 | 举例 | 是否必须 | 说明 |
---|---|---|---|---|
goods_id | 0 | 10 | 是 | 商品的id |
- "specification": [
- {
- "attr_type": "1",
- "name": "u5927u5c0f",
- "value": [
- {
- "label": "7.5-8mm",
- "price": "0",
- "format_price": "uffe50.00u5143",
- "id": "137"
- }
- ]
- },
- {
- "attr_type": "1", //属性类型 0 唯一属性,1:单选属性,2:复选属性
- "name": "u989cu8272",//属性名称
- "value": [
- {
- "label": "u91d1u9ec4u8272",//属性值标签
- "price": "0",//价格增减量 attr_type=1 时忽略次值
- "format_price": "uffe50.00u5143",
- "id": "138" //属性id (对应goods_attr 表中的 goods_attr_id)
- }
- ]
- }
- ],
- "goods_attr_combine_price": [
- {
- "product_sn": "YS02HS464g_p06", //货品的sn编码
- "goods_attr": "137|138", // 商品属性表的id( 对应specification[0].value[0].id)组合
- "product_number": "2",// 货品的库存
- "product_price": "0.00"// 该规格 ("goods_attr": "137|138")的价格(增减量),计算价格是 是用商品的 shop_price +product_price
- }
- ]