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

更新时间:2016-01-14 点击量:1618

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

一、修改的原因

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

颜色大小价格
南洋金珍珠耳环8mm1000
南洋金珍珠耳环10mm1500
大溪地黑珍珠耳环8mm1200
大溪地黑珍珠耳环10mm1800

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

颜色大小价格
南洋金珍珠耳环8mm1000
南洋金珍珠耳环10mm1500
大溪地黑珍珠耳环8mm1200
大溪地黑珍珠耳环10mm1700

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

二、开发方向

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

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、修改后台操作界面

ecshop 属性分类后台效果


属性分类 前台效果


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

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

参数名默认值举例是否必须说明
goods_id010商品的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
      }
    ]
支付宝扫码打赏 微信打赏

如果文章对您有帮助,就打赏一个吧

在线客服

客户服务

热线电话:

13128985956 服务时间:

周一到周六:9:00-18:00

在线QQ客服

在线微信客服

关于我们 常见问题

支付方式 加盟合作

提交需求
优惠红包 购物车0 反馈留言 返回顶部