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 ProductProductVariation
: 产品规格ProductVariationType
: 产品规格类型 Bundle of ProductVariationProductAttribute
: 产品属性 Bundle of ProductAttributeValueProductAttributeValue
: 属性值
具体的字段结构,请自行阅读模块的代码。
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数据结构,该模块还有一些其它细节,但都不是主要的, 读者可以进一步阅读代码进行了解。