扩展购物车项类型案例

案例说明

ECStore系统中在加入购物车的时候可以看到商品赠品礼包,等类型。

而现在如果有一个购物车项类型为:商品组合促销

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

案例分析

  • 以什么形式开发(app形式)
    在ECStore中开发可以使用二次开发模式进行改造添加新功能,也可以以app的形式进行添加新功能,
    作为一个相对独立的新功能呢推荐使用以app的形式进行扩展
    
  • 如果要扩展一个新的商品类型需要扩展那些?
    • 后台设置添加商品组合促销商品和规则(新建,编辑,查看,删除等)。
    • 在前台进行商品的展示,可提用户选择商品,加入购物车。
    • 在购物车中显示,(新商品类型购物车数据项展示,添加购买数量,数据统计)
    • 购物车中的新购物车项类型在下单后的库存冻结
    • 下单后记录购买该商品组合促销信息
    • 订单中心的订单详情中新购物车类型项的数据显示
    • 后台订单查看的商品信息中的新购物车项类型的数据显示

案例实现步骤

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

新建app:assorted

assorted代码

svn co https://app.ec-os.net/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)),
);

加入购物车,购物车显示

用户在前台将商品选择好以后,需要将信息加入到购物车。

    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 数据统计使用(商品价格,重量,积分等信息)
        
  1. [购物车显示]统计数据

    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,
   );
.....
  1. [购物车显示]显示加入购物车的新增购物车项商品
    • 注册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;
              }
          }
      
  2. assorted/view/site/cart/item/assorted.html显示商品
        assorted.html可以复制,显示商品的样式基本一样,可以在此基础上自行修改
    
  3. [购物车操作]删除,清空购物车

    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'));
        }
    
  4. [购物车操作]增加,减少购买数量在购物车项显示的/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方法进行更新
    

下单后的操作

  1. 组织订单数据结构,冻结库存
    • 注册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');
          }
      
  2. 关联订单
    • 注册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')