2.1 Commerce 子模块:Commerce Price
货币数据处理,是电子商务系统的首要任务。 Drupal Commerce 提供了一个独立的子模块 Commerce Price 来解决这个任务。
Commerce Price 模块是一个相对独立的模块,它除了依赖根模块 Commerce 之外,不依赖任何其他模块。 这个模块主要定义了存储货币数据的数据结构,用于编辑货币数据的 UI 组件,以及用于货币运算的工具。 所以即使你正在做的项目并不是一个电子商务系统,你其实也可以使用这个子模块的功能来处理你的项目中与货币相关的业务。
下面我们来详细看看,这个模块都具体提供了些什么东西。
配置实体 ConfigEntityType
commerce_currency 用于定义货币类型。
该配置实体有以下字段:
- currencyCode 货币字符代码,参考 ISO_4217,如:人民币是 CNY。
- numbericCode 货币的数字代码,参考 ISO_4217,如:人民币是 156。
- symbol 货币符号,如:美元的$,人民币的¥。
- fractionDigits 小数位数,如:人民币是2位,0.01元是人民币的最小单位。
- name 货币名称,如:用于管理后台显示的货币名称,如:人民币,美元。
配置实体自然都会有一个 id 字段,commerce_currency 的意义在于定义系统所需要处理的货币类型。
事实上,该实体的编辑表单已经预置了几乎全球的货币类型数据,管理员只需要在管理后台选择需要使用的货币类型,就可以轻松创建货币类型数据。 详见源码中的 commerce/modules/price/src/Form/CurrencyImportForm.php 类。
如果预置的货币类型无法满足你的项目需要,你可以自定义一个货币类型,也就是按自己的意愿去填写 commerce_currency 配置实体的字段数据。
表单元素 FormElement
commerce_number 支持特定语言化的货币数字编辑。
由于在不同的语言中,数字的写法是不同的,比如有些用 .
作为小数符号,有些用 ,
作为小数符号, 因此这个 FormElement 的主要作用是把不同的语言化数字写法,在内部处理数据时转换为统一的常规写法, 比如统一用 .
作为小数符号。
commerce_price 用于编辑一个金额数据。
一个金额数据包含两部分:货币类型,货币数量。
此 FormElement 内部使用 commerce_number 来编辑金额的货币数量,另外再增加了一个下拉控件来选择货币类型。
字段类型 FieldType
commerce_price 用于保存一个金额数据。
该字段有两个属性:currency_code 货币代码,number 货币数量。这两个属性会对应数据库表中的两个列。
该字段默认提供了以下 FieldWidget 用于编辑该类型的字段数据:
-
commerce_price_default :简单地调用 commerce_price 这个FormElement 来进行编辑。
-
commerce_list_price :同样是调用 commerce_price 这个FormElement,但是提供了一个可选值的控制功能。 需要特别说明一下 List Price 的概念,一般来说,每个产品都会有多个规格,往往不同规格是卖不同价格的, 当在一个列表中列出几个产品时,这个产品的价格到底显示哪一个规格的价格呢? 所以系统让每个产品规格可以选填一个 List Price ,当产品显示价格时,会显示这个 List Price , 如果单个产品存在多个规格都提供了 List Price 的情况,那么取第一个规格提供的数据。
该字段默认提供了以下 FieldFormatter 用于格式化显示该类型的字段数据:
- commerce_price_default :根据当前语言,把金额字段的数据显示成不同本地语言的格式。
- commerce_price_plain :直接按 “货币数量 + 货币代码” 的格式显示字段数据。
- commerce_price_calculated :此格式化器使用 commerce_price.chain_price_resolver 服务动态计算并显示当前的上下文价格。
服务:Services
本模块还提供了一些用于计算和显示货币金额数据的一些工具,非常有用。
-
commerce_price.rounder :把一个用户输入的货币金额,作四舍五入到符合它所规定的小数位数,比如人民币是2位的。
-
commerce_price.currency_formatter :使用 commerceguys/intl Composer包来格式化显示一个货币金额。
重要的类
Drupal\commerce_price\Price 此类提供了对一个货币金额进行各种数学运算的功能,包括加、减、乘、除, 按汇率在不同货币类型之间转换,还有各种把两个金额比较的功能。