ecshop 组合属性插件的二次开发
更新时间:2016-01-14 点击量:1618

一、修改的原因
最近有一个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": "\u5927\u5c0f",
"value": [
{
"label": "7.5-8mm",
"price": "0",
"format_price": "\uffe50.00\u5143",
"id": "137"
}
]
},
{
"attr_type": "1", //属性类型 0 唯一属性,1:单选属性,2:复选属性
"name": "\u989c\u8272",//属性名称
"value": [
{
"label": "\u91d1\u9ec4\u8272",//属性值标签
"price": "0",//价格增减量 attr_type=1 时忽略次值
"format_price": "\uffe50.00\u5143",
"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
}
]
如果文章对您有帮助,就打赏一个吧
«上一篇:小京东/ECSMART最新版JSAPI微信支付V3安装帮助手册 下一篇:ecmobile PHP接口说明文档之购物车(cart/create|list|detele|update)»