2.7 Commerce Promotion 模块:可灵活扩展的促销系统
在前面的章节讲述 Commerce Order
模块的时候,我们介绍了 订单调整
的概念。 Commerce Promotion
模块的基石,就是 订单调整
。
内容实体
-
commerce_promotion
用来保存促销方案数据一个网站中可以添加无数个促销方案,由该实体的字段分析,我们可以看到,一个促销方案主要包含了以下内容:
- 名称
- 能参与该促销的订单类型(可有多种订单类型)
- 能参与该促销的店铺(可有多个店铺)
- 该促销所使用的折扣方式
- 该促销的定向设置(仅面向特定用户或仅面向特定产品,等等)
- 该促销的使用数量限制(仅提供多少个名额)
- 该促销的开始时间和结束时间
- 该促销是否能与其它促销一起使用
- 该促销已发行的优惠券
值得特别提一下的是,在定向设置中,定向条件非常丰富,系统自带多达11种定向条件,具体可以打开该实体类型的编辑表单查看。
除了可以使用自带的定向条件外,开发者还可以自定义定向条件类型,只需要实现一个
@CommerceCondition
插件即可。@CommerceCondition
插件不单可以用在这里,在Drupal Commerce
的其他模块中,其实也是有使用的。 事实上@CommerceCondition
插件本身就不是Commerce Promotion
模块定义的,它是Commerce
主模块中定义的, 而上述所说的11种定向条件,分别是11个@CommerceCondition
插件实现,它们之中,除了order_item_quantity
外, 其他插件都是别的模块实现的。 -
commerce_promotion_coupon
用来保存优惠券数据在
commerce_promotion
实体中,我们看到一个优惠券
字段。一个常规的促销,在用户购物时会自动参与,但当一个促销选择发行优惠券时, 它与普通的促销产生了一点区别,那就是只能在订单结账的过程中输入优惠券码,才能参与促销。一个
促销方案
可以发行多个优惠券,每个优惠券有一个券码,同时可以限定这个码被使用的次数。 我们发现促销方案
本身也有一个数量限制,是的,所有已使用的优惠券的的使用次数加起来,不能超过促销方案
的整体限制, 一旦超过这个限制,即使优惠券本身还有效,在使用的时候也是被判断为无效的。commerce_promotion_coupon
实体的字段比较简单,这里就不再展开细说。
@CommercePromotionOffer
插件
这是本模块最重要的东西,每一个 促销方案
都必须选择一个 折扣方式
。 而这些折扣方式就是通过 @CommercePromotionOffer
插件来实现的。
模块自带了5个插件实现:
order_buy_x_get_y
买x送yorder_percentage_off
订单整体折扣,按百分比order_fixed_amount_off
订单整体折扣,按固定金额order_item_percentage_off
订单项折扣,按百分比order_item_fixed_amount_off
订单项折扣,按固定金额
这些插件都比较好理解,读都可以去测试体验一下,在功能上做得是比较丰富的。
order_processor
订单刷新处理器
本模块对订单的折扣调整是通过 Commerce Order
模块的 Adjustment
机制来完成的。 那么这些 Adjustment
是如何被应用到订单中去的呢,是通过 Commerce Order
模块的另一个重要机制 Order refresh and processing
,对此感到陌生的朋友可以返回前面的章节查阅。
本模块提供了一个专用的刷新处理器,它的服务名是 commerce_promotion.promotion_order_processor
, 详情请参阅代码 Drupal\commerce_promotion\PromotionOrderProcessor
。
优惠券回收面板
在 Commerce Checkout
模块中,我们提及到 @CommerceCheckoutPane
插件,它可以在结账流程中 添加用户交互表单。
本模块实现了一个 @CommerceCheckoutPane
插件,提供了一个让用户输入优惠券的表单。
暂时来讲,优惠券暂时只能通过这样的方式使用,这不太符合中国国情。 但是我们可以去扩展它,使得优惠券可以被用户 领取
,然后在结账过程中,直接选择希望使用的优惠券。 有兴趣的读者可以关注一下开源项目 WeeShop
,我们正在做这件事。