2.3 Commerce Product 模块:提供了一个灵活的产品数据结构

为世上所有的产品类型建立数据模型,是一项非常巨大的挑战。 况且,不同的项目工程,对产品的数据模型有不同的要求, 所以Drupal Commerce是无法做到建立一个适合所有开发者需要的产品数据模型的。

既然如此,Drupal Commerce选择了为开发者提供一套方便开发者快速建立产品数据模型的系统, 使得开发者可以方便快速地建立出特定项目所需要的产品数据模型。

基本概念

  • Product 产品
  • Product Variation 产品规格
  • Product Attribute 产品属性

产品

产品是用于营销的基本单元,比如iPhone X 就是一项产品。 产品一般包含产品名称、产品图片等关于产品整体情况的信息。

产品规格

产品规格是由产品概念延申出来实际商品,比如iPhoine X有256G和512G两种规格。 当我们要购买iPhone X这款产品时,必须要进一步指明要购买的是哪一种规格, 才能确定具体的商品。

产品属性

上文中的 256G 和 512G就是一种属性值,它们对应的产品属性被称为 内置储存空间。 产品规格是由不同的属性值组合来定义的,也就是说,一个产品通常可以有多个属性。 比如Iphone X 除了 内置储存空间 这个属性外,还有可以有 机身颜色。 假设有 银色 和 黑色,那么Iphone X可以组合出以下 4 个产品规格:

  • iPhone X, 256G, 银色
  • iPhone X, 256G, 黑色
  • iPhone X, 512G, 银色
  • iPhone X, 512G, 黑色

利用以上3个基本概念,可以建立几乎任意商品的数据模型。

数据结构

Entity

  • Product: 产品
  • ProductType: 产品类型 Bundle of Product
  • ProductVariation: 产品规格
  • ProductVariationType: 产品规格类型 Bundle of ProductVariation
  • ProductAttribute: 产品属性 Bundle of ProductAttributeValue
  • ProductAttributeValue: 属性值

具体的字段结构,请自行阅读模块的代码

PurchasableEntityInterface 可购买实体接口

特别值得注意的是,ProductVariation 实体实现了 Drupal\commerce\PurchasableEntityInterface接口。 这是 Drupal Commerce 中唯一一个实现了该接口的实体。

实现了该接口的实体,意味着可以放到订单中作为一个订单项,创建订单进行购买。

/**
 * Defines the interface for purchasable entities.
 *
 * Lives in Drupal\commerce instead of Drupal\commerce_order so that entity
 * type providing modules such as commerce_product don't need to depend
 * on commerce_order.
 */
interface PurchasableEntityInterface extends ContentEntityInterface {

  /**
   * Gets the stores through which the purchasable entity is sold.
   *
   * @return \Drupal\commerce_store\Entity\StoreInterface[]
   *   The stores.
   */
  public function getStores();

  /**
   * Gets the purchasable entity's order item type ID.
   *
   * Used for finding/creating the appropriate order item when purchasing a
   * product (adding it to an order).
   *
   * @return string
   *   The order item type ID.
   */
  public function getOrderItemTypeId();

  /**
   * Gets the purchasable entity's order item title.
   *
   * Saved in the $order_item->title field to protect the order items of
   * completed orders against changes in the referenced purchased entity.
   *
   * @return string
   *   The order item title.
   */
  public function getOrderItemTitle();

  /**
   * Gets the purchasable entity's price.
   *
   * @return \Drupal\commerce_price\Price|null
   *   The price, or NULL.
   */
  public function getPrice();

}

开发者可以实现自己的可购买实体,但通常情况下,ProductVariation这个实体已经够用了。 这个特性只是为了增加灵活性和扩展性,使得实现更丰富的商品模式成为可能。

总结

Commerce Product 模块主要是为开发者提供了一个可以快速建立产品数据模型的系统, 本文主要是讲述了该模块的Entity数据结构,该模块还有一些其它细节,但都不是主要的, 读者可以进一步阅读代码进行了解。

对文章内容有疑问题的朋友可以加QQ群讨论:747120338

评论 (1)

    • 2019-07-15

    对文章内容有疑问题的朋友可以加QQ群讨论:747120338