akeneo / measure-bundle
Akeneo Measure Bundle
Requires
- php: >=5.3.3
- symfony/symfony: >=2.1.0
Requires (Dev)
- phpspec/phpspec: 2.5.*
README
Akeneo Measure Bundle : 在家族中管理度量单位,并从单位到另一个单位的转换
允许您
- 将一个值从单位转换为另一个单位
- 向一个家族(度量单位组)添加更多单位
- 创建新的家族
Akeneo PIM
最初是为在Akeneo PIM中使用而编写的。
这个提取的目的是使其在Akeneo PIM项目之外也可用。
请注意,这个过程仍然处于非常实验性的阶段。
我们没有所有的测试和自动化,这可以确保这个组件将在Akeneo PIM完整栈之外顺畅运行。
文档
文档可在docs.akeneo.com找到
一般操作
此捆绑包可从单位转换为另一个单位。一些家族和单位已经定义,但可以添加其他家族和单位以转换任何东西。
转换器将一个值从单位转换为标准单位(类似于参考单位),然后从标准单位转换为所需的单位。这允许仅定义一个操作列表来转换每个单位。
操作定义了从单位到标准单位的转换。转换器使用默认操作顺序转换为标准单位,但反向顺序并执行相反的操作(加法 <=> 减法和乘法 <=> 除法)。我们使用字符串来定义操作。'add'、'sub'、'mul'、'div'是被允许的。
您可以通过扩展捆绑包来添加更多操作。
类和文件
在MeasureBundle
- Convert/ 包含转换器服务。
- DependencyInjection/
- Configuration : 定义如何检查配置度量文件
- AkeneoMeasureExtension : 定义配置的恢复(浏览和合并配置文件)。
- Exception/ 包含转换器中使用的异常类。
- Family/ 包含一系列度量家族接口。每个接口定义一个家族,必须包含一个名为FAMILY的常量。
- Resources/config/
- measure.yml : 定义度量配置,包含一系列家族。每个家族定义一个标准单位度量和一个单位度量列表。该列表中的每个度量由一个常量定义,然后是由单位到标准的转换规则(有序操作列表)和一个用于显示的符号。
- services.yml : 定义度量转换器服务
parameters: akeneo_measure.measures_config: ~ services: akeneo_measure.measure_converter: class: Akeneo\Bundle\MeasureBundle\Convert\MeasureConverter arguments: [%akeneo_measure.measures_config%]
配置文件可在https://github.com/akeneo/MeasureBundle/blob/master/Resources/config/measure.yml查看
安装和运行单元测试
要运行测试
$ php composer.phar update --dev $ phpunit --coverage-html=cov/
转换一个值
定义了一个服务来使用转换器。您必须调用它并定义在转换值之前要使用的家族。在下面的示例中,我们将千米转换为英里。
$converter = $this->container->get('akeneo_measure.measure_converter'); $converter->setFamily(LengthFamilyInterface::FAMILY); $result = $converter->convert(LengthFamilyInterface::KILOMETER, LengthFamilyInterface::MILE, 1);
获取家族和单位的全列表
$this->container->getParameter('akeneo_measure.measures_config');
向现有家族添加单位
要在现有家族中定义新单位,只需在您自己的捆绑包中定义它及其单位的新配置文件(measure.yml)。例如,在我们的演示捆绑包中,我们添加了以下代码
measures_config: Length: standard: METER units: DONG: convert: [{'mul': 7},{'div': 300}] symbol: dong
这里,我们只有一个“东”单位及其转换为标准单位的规则。要将1东转换为米,必须将7乘以结果,然后除以300。还需要一个符号来定义要显示的单位格式。建议但不强制,可以创建一个扩展家族类的新类。它允许使用常量而不是字符串来使用转换器。常量表示配置值。在这里,我们创建了“MyLengthMeasure”新类,它扩展了LengthMeasure来添加“Dong”单位常量。
use Akeneo\Bundle\MeasureBundle\Family\LengthFamilyInterface; /** * Override LengthFamily interface to add Dong measure constant */ class MyLengthFamilyInterface extends LengthFamilyInterface { /** * @staticvar string */ const DONG = 'DONG'; }
然后,您可以像这样调用对新单位的转换
$converter = $this->container->get('akeneo_measure.measure_converter'); $converter->setFamily(LengthFamilyInterface::FAMILY); $result = $converter->convert(LengthFamilyInterface::KILOMETER, MyLengthFamilyInterface::DONG, 1);
创建一个新的家族
要创建一个新的家族,就像向现有的家族添加一个单位一样。需要在您的包的measure.yml文件中添加配置,并可选地定义一个类来定义要使用的常量,而不是字符串。
measures_config: Capacitance: standard: FARAD units: FARAD: convert: [{'mul': 1}] symbol: F KILOFARAD: convert: [{'mul': 1000}] symbol: kF MEGAFARAD: convert: [{'mul': 1000000}] symbol: MF
/** * Capacitance measures constants */ class CapacitanceFamilyInterface { /** * Family measure name * @staticvar string */ const FAMILY = 'Capacitance'; /** * @staticvar string */ const FARAD = 'FARAD'; /** * @staticvar string */ const KILOFARAD = 'KILOFARAD'; /** * @staticvar string */ const MEGAFARAD = 'MEGAFARAD'; }
抛出异常
如果在转换过程中遇到问题,将抛出异常。
- UnknownFamilyMeasureException 如果您尝试使用不存在或未定义的家族。
- UnknownMeasureException 如果您尝试将不存在或未定义的单位转换为使用的家族。
- UnknownOperatorException 如果您尝试使用不存在的操作(允许的操作有加、减、乘和除)。
除以零不会抛出异常,但将被忽略。
扩展转换器
这个包是可扩展的,我们可以想象从数据库或服务中恢复配置或使用转换器进行货币转换等。
问题 & 贡献
这个包是在我们的主仓库中开发的。
如果您遇到任何错误,请在创建新问题之前检查它是否已知。
如果您想贡献(如果您这样做我们会很高兴!),您可以在这个页面上找到更多信息。
关于版本,版本0.6.x是在akeneo/pim-community-dev 1.6.x中开发的。
对于旧版本,
- akeneo/pim-community-dev 1.1.x使用akeneo/measure-bundle 0.1.x
- akeneo/pim-community-dev 1.2.x使用akeneo/measure-bundle 0.2.x
- akeneo/pim-community-dev 1.3.x使用akeneo/measure-bundle 0.3.x
- akeneo/pim-community-dev 1.4.x使用akeneo/measure-bundle 0.4.x
- akeneo/pim-community-dev 1.5.x使用akeneo/measure-bundle 0.5.x
- akeneo/pim-community-dev 1.6.x重新整合了这个包到我们的主仓库
OSL许可证
许可证可以在这里找到。