Ecstore开发之购物车模块-扩展购物车项类型案例

案例说明

ECStore系统中在加入购物车的时候可以看到商品,赠品,礼包,等类型。现在如果有一个购物车项类型为:商品组合促销

商品组合促销:

用户可以根据商家给出的选择区域,选择对应的商品。进行搭配购买,从而进行优惠促销。

案例分析

1.以什么形式开发(app形式)

在ECStore中开发可以使用二次开发模式进行改造添加新功能,也可以以app的形式进行添加新功能,作为一个相对独立的新功能呢推荐使用以app的形式进行扩展

2.如果要扩展一个新的商品类型需要扩展那些?

  1. 后台设置添加商品组合促销商品和规则(新建,编辑,查看,删除等)。
  2. 在前台进行商品的展示,可提用户选择商品,加入购物车。
  3. 在购物车中显示,(新商品类型购物车数据项展示,添加购买数量,数据统计)
  4. 购物车中的新购物车项类型在下单后的库存冻结
  5. 下单后记录购买该商品组合促销信息
  6. 订单中心的订单详情中新购物车类型项的数据显示
  7. 后台订单查看的商品信息中的新购物车项类型的数据显示
案例实现步骤

通过上面的分析,那么就可以一步一步的来实现扩展一个新的购物车项类型(商品组合促销)

新建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 )

订单中心显示
  1. 订单提交成功,显示订单详细信息
  2. 会员中心我的订单显示
  3. 会员中心我的订单,查看订单显示
  4. 后台订单信息 在assorted_order_assorted类中
//订单详情的显示统一调用方法
public function get_order_object($arr_object=array(), &$order_items, $tml='member_order_detail')

评论

评论正在提交中...请稍后
评论提交成功...