ECStore系统中在加入购物车的时候可以看到商品,赠品,礼包,等类型。
而现在如果有一个购物车项类型为:商品组合促销
商品组合促销: 用户可以根据商家给出的选择区域,选择对应的商品。进行搭配购买,从而进行优惠促销。
在ECStore中开发可以使用二次开发模式进行改造添加新功能,也可以以app的形式进行添加新功能, 作为一个相对独立的新功能呢推荐使用以app的形式进行扩展
通过上面的分析,那么就可以一步一步的来实现扩展一个新的购物车项类型(商品组合促销)
新建app:assorted
assorted代码
svn co https://app.wanxiaohong.cn/svn/assorted/trunk 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)), );
用户在前台将商品选择好以后,需要将信息加入到购物车。
<service id="b2c_cart_object_apps"> <class>assorted_cart_object_assorted</class> </service>
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)) ); */
function count(){ return true; }
现在即可测试加入购物车,count方法留给购物车显示的时候使用;
购物车显示会默认通过注册的service b2c_cart_object_apps 的getAll方法来获取到购物车中的数据
public function getAll($rich = false) { 当getAll参数为false时 返回的只是存储到购物车中的基本数据,在加入购物车的add方法中用于 判断加入购物车的数据是否在购物车中已存在(已存在,追加即可) 当getAll参数为true时 getAll方法返回的数据是根据新增购物车类型项所需信息 1 购物车显示使用(该购物车类型项所购买的商品信息) 2 数据统计使用(商品价格,重量,积分等信息)
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, ); .....
<service id="b2c_cart_render_items_apps"> <class>assorted_cart_render_item_assorted</class> </service>
<?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.html可以复制,显示商品的样式基本一样,可以在此基础上自行修改
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')); }
<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方法进行更新
<service id="order_goodstype_operation"> <class>assorted_order_assorted</class> </service>
/* *作用:组织订单的数据结构,冻结库存,(具体数据结构可以看对应代码) * */ function gen_order( $arrObjInfo=array(), &$order_data, &$msg='' ){ //判断冻结库存点,后台可设置是在下单冻结库存还是在支付后冻结库存 $store_mark = app::get('b2c')->getConf('system.goods.freez.time'); }
<service id="b2c_order.beforecreate"> <class>assorted_order_beforecreate</class> </service>
public function generate( &$sdf )
在assorted_order_assorted类中
//订单详情的显示统一调用方法 public function get_order_object($arr_object=array(), &$order_items, $tml='member_order_detail')