案例说明
ECStore系统中在加入购物车的时候可以看到商品,赠品,礼包,等类型。现在如果有一个购物车项类型为:商品组合促销
商品组合促销:
用户可以根据商家给出的选择区域,选择对应的商品。进行搭配购买,从而进行优惠促销。
案例分析
1.以什么形式开发(app形式)
在ECStore中开发可以使用二次开发模式进行改造添加新功能,也可以以app的形式进行添加新功能,作为一个相对独立的新功能呢推荐使用以app的形式进行扩展
2.如果要扩展一个新的商品类型需要扩展那些?
- 后台设置添加商品组合促销商品和规则(新建,编辑,查看,删除等)。
- 在前台进行商品的展示,可提用户选择商品,加入购物车。
- 在购物车中显示,(新商品类型购物车数据项展示,添加购买数量,数据统计)
- 购物车中的新购物车项类型在下单后的库存冻结
- 下单后记录购买该商品组合促销信息
- 订单中心的订单详情中新购物车类型项的数据显示
- 后台订单查看的商品信息中的新购物车项类型的数据显示
案例实现步骤
通过上面的分析,那么就可以一步一步的来实现扩展一个新的购物车项类型(商品组合促销)
新建app:assorted
后台设置
在后台设置商品组合促销规则,设置的规则是为以后在商品展示使用,实现主要是后台finder方法的使用。
商品在前台展示
前台商品展示,主要需要实现的功能是可以,根据商品组合促销显示对应的商品,可以选择商品进行促销优惠后在加入购物车。
assored app 测试 测试加入购物车,前台路径:index.php/assorted-lists.html
//因为assorted没有做前台,所以在测试的时候需要找到assorted/controller/site/assorted.php中的add_cart方法,根据自己的数据修改对应的商品ID和货品ID,这个数据是由前台POST过来的数据,在组织好的数据格式
$data = array(
'assorted_id'=>15,
'num'=>1,
'buy_price'=>246,//这个表示购买一个组合单价,需前台post过来
'discount_amount'=>30,//当前购买单元的优惠价格
'pid_478'=>array('name'=>'faw',array('goods_id'=>97,'product_id'=>478,'num'=>1)),
'pid_463_454'=>array('name'=>'B区',
array('goods_id'=>92,'product_id'=>463,'num'=>1),
array('goods_id'=>64,'product_id'=>454,'num'=>1)),
);
加入购物车,购物车显示
用户在前台将商品选择好以后,需要将信息加入到购物车。
1.[ 加入购物车]注册加入购物车扩展serivce
<service id="b2c_cart_object_apps">
<class>assorted_cart_object_assorted</class>
</service>
2.[ 加入购物车]在assorted_cart_object_assorted中加入function add方法
add 方法功能是将组织好的数据加入到购物车中
1 把前台POST过来的数据,组织成购物车中的数据格式的数据
2 获取当前用户的已加入到购物车的数据
3 对比当前加入购物车的数据是否在购物车中已经存在,存在则追加
4 检查当前加入购物车的数据是否合法
5 调用b2c中的cart_objects model中的save方法保存数据;
//$data 由assorted/controller/site/assorted.php中的add_cart方法传过来的值
//$data 包含的是加入购物车的商品信息
function add($data){}
/* add 方法中存入到购物车的数据格式
$aSave = array(
'obj_ident' => $objIdent, //存入购物车的唯一标识
'member_ident' => $this->member_ident, //用户的session ID 用来标识用户
'obj_type' => 'assorted',
'params' => $data,
'quantity' => floatval(($data['num']?$data['num']:1))
);
*/
3.[ 加入购物车]在assorted_cart_object_assorted中加入function count()
方法
function count(){
return true;
}
现在即可测试加入购物车,count方法留给购物车显示的时候使用;
4.[购物车显示]获取到购物车中的数据
在assorted_cart_object_assorted类中添加getAll方法
购物车显示会默认通过注册的service b2c_cart_object_apps 的getAll方法来获取到购物车中的数据 getAll方法作用
public function getAll($rich = false) {
当getAll参数为false时
返回的只是存储到购物车中的基本数据,在加入购物车的add方法中用于
判断加入购物车的数据是否在购物车中已存在(已存在,追加即可)
当getAll参数为true时
getAll方法返回的数据是根据新增购物车类型项所需信息
1 购物车显示使用(该购物车类型项所购买的商品信息)
2 数据统计使用(商品价格,重量,积分等信息)
5.[购物车显示]统计数据
assorted_cart_object_assorted类中的count方法实现统计
// 统计购物车中组合商品促销的数据
public function count(&$aData) {
// 购物车中不存在goods商品
if(empty($aData['object']['assorted'])) return false;
$aResult = array(
'subtotal_weight'=>0, //统计的assorted购买类型的总重量
'subtotal'=>0,
'subtotal_price'=>0, //用于前台的总价格
'subtotal_consume_score'=>0,
'subtotal_gain_score'=>0,
'discount_amount_prefilter'=>0, //优惠价格,购物车显示的优惠数据来源
'discount_amount_order'=>0, //订单优惠的价格
'discount_amount'=>0, //总的优惠价格
'items_quantity'=>0,
'items_count'=>0,
);
.....
6.[购物车显示]显示加入购物车的新增购物车项商品
注册service
<service id="b2c_cart_render_items_apps">
<class>assorted_cart_render_item_assorted</class>
</service>
在assorted_cart_render_item_assorted
中用$file
返回用于显示商品数据的html
<?php
class assorted_cart_render_item_assorted
{
public $app = 'assorted';
public $file = 'site/cart/item/assorted.html';
public $index = 88; // 所处位置(数值越大越排在前面,数值不能和已有的相同)
/**
* 迷你购物车模板配置
*
* @return array
*/
public function _get_minicart_view() {
$arr = array(
'file'=>'site/cart/mini/item/assorted.html',
'index'=>88,
);
return $arr;
}
}
assorted/view/site/cart/item/assorted.html
显示商品
assorted.html可以复制,显示商品的样式基本一样,可以在此基础上自行修改 7.[购物车操作]删除,清空购物车
assorted_cart_object_assorted类中的以下方法
// 删除购物车中指定商品项
public function delete($sIdent = null) {
//$sIdeit 是由前台modify_quantity[<{$assorted.obj_ident}>][quantity]post过来的
if(empty($sIdent)) return $this->deleteAll();
return $this->oCartObjects->delete(array('member_ident'=>$this->member_ident, 'obj_ident'=>$sIdent, 'obj_type'=>'assorted'));
}
// 清空购物车中商品项数据
public function deleteAll() {
return $this->oCartObjects->delete(array('member_ident'=>$this->member_ident, 'obj_type'=>'assorted'));
}
8.[购物车操作]增加,减少购买数量在购物车项显示的/site/cart/item/assorted.html
中
<div class="Numinput ">
<input type="text" class="_x_ipt textcenter" name="modify_quantity[<{$assorted.obj_ident}>][quantity]" size="3" value="<{$assorted.quantity}>" onchange="if(Cart)Cart.ItemNumUpdate(this,this.value,event);"/>
<div class="numadjust-arr">
<span class="numadjust increase"></span>
<span class="numadjust decrease"></span></div>
</div>
在这里会默认调用controller/site/b2c/cart.php
中的updateCart方法input的值会传入
updateCart方法会通过service 根据不同的购物车类型项调用对应的处理购物车的update方法
那么assorted类型则会通过assorted_cart_object_assorted类中的update方法进行更新
下单后的操作
组织订单数据结构,冻结库存
注册services
<service id="order_goodstype_operation">
<class>assorted_order_assorted</class>
</service>
在services 注册类中添加如下方法
/*
*作用:组织订单的数据结构,冻结库存,(具体数据结构可以看对应代码)
* */
function gen_order( $arrObjInfo=array(), &$order_data, &$msg='' ){
//判断冻结库存点,后台可设置是在下单冻结库存还是在支付后冻结库存
$store_mark = app::get('b2c')->getConf('system.goods.freez.time');
}
关联订单
注册services b2c_order.beforecreate订单完成前操作,事务保护
<service id="b2c_order.beforecreate">
<class>assorted_order_beforecreate</class>
</service>
assorted_order_beforecreate,方法存储关联订单信息
public function generate( &$sdf )
订单中心显示
- 订单提交成功,显示订单详细信息
- 会员中心我的订单显示
- 会员中心我的订单,查看订单显示
- 后台订单信息 在assorted_order_assorted类中
//订单详情的显示统一调用方法
public function get_order_object($arr_object=array(), &$order_items, $tml='member_order_detail')
您可以选择一种方式赞助本站
支付宝扫一扫
微信扫一扫