Числа
Оба числовых типа данных (number и slider) хранятся в базе данных как число в столбце типа DOUBLE.
Для установки числового значения в соответствующий сеттер нужно передавать число. Поля отличаются только виджетом ввода в интерфейсе и тем, что у слайдера есть минимальное/максимальное значение и шаг, а у обычного числового поля — нет.
Numeric (Числовое)
Числовое поле можно настроить с значением по умолчанию. В интерфейсе оно отображается как поле со спиннером.

Numeric Range (Диапазон чисел)
Поле numericRange состоит из двух полей numeric (минимум и максимум) и потому настраивается аналогично. Программно значения представлены объектом NumericRange.
Slider (Слайдер)
В интерфейсе слайдер можно использовать горизонтально или вертикально. Его нужно настроить с указанием минимального и максимального значений, шага инкремента и десятичной точности.

Quantity Value (Количественное значение)
Это числовой тип данных, который дополнительно позволяет указывать единицу измерения.
Сначала определите глобальный список известных единиц.

Это можно сделать также программно
$unit = new Pimcore\Model\DataObject\QuantityValue\Unit();
$unit->setAbbreviation("km"); // обязательно
$unit->setLongname("kilometers");
$unit->setGroup("dimension");
$unit->save();
В редакторе класса можно ограничить список допустимых единиц на уровне конкретного поля. Единицы можно импортировать и экспортировать в виде json-файла. Для импорта существует команда: pimcore:definition:import:units

Тогда будут доступны только эти единицы.

В следующем фрагменте кода показано, как установить значение.
use Pimcore\Model\DataObject;
$parent = DataObject::getByPath("/");
$object = new DataObject\Test();
$unit = DataObject\QuantityValue\Unit::getByAbbreviation("km");
$object->setKey("test2");
$object->setParent($parent);
$object->setHeight(new DataObject\Data\QuantityValue(27, $unit->getId()));
$object->save();
Quantity Value Range (Диапазон количественных значений)

Поле quantityValueRange по сути такое же, как quantityValue, но содержит два поля ввода (минимум и максимум). Программно значения представлены объектом QuantityValueRange.
Конвертация единиц для количественных значений
Статическая конвертация единиц
Вы можете конвертировать значения между единицами. Для этого необходимо определить базовые единицы, коэффициенты преобразования и смещения. Все единицы с одинаковой базовой единицей можно конвертировать друг в друга.
Коэффициент и смещение определяют, как преобразовать текущую единицу в базовую.
Пример: У вас есть физические единицы измерения длины метр (m), миллиметр (mm) и дюйм ("). Конфигурация может выглядеть так:
| Название | Аббревиатура | Базовая единица | Коэффициент |
|---|---|---|---|
| Meter | m | ||
| Millimeter | mm | m | 0.001 |
| Inch | " | m | 0.0254 |
Если в поле quantity value стоит 2 m и вы смените единицу на mm, значение автоматически станет 2000.
Также можно вызвать конвертацию программно:
$originalValue = new QuantityValue(3, Unit::getByAbbreviation('m')->getId());
$converter = $this->container->get(\Pimcore\Model\DataObject\QuantityValue\UnitConversionService::class);
$convertedValue = $converter->convert($originalValue, Unit::getByAbbreviation('mm'));
// $convertedValue — QuantityValue со значением 3000 и единицей mm
В качестве альтернативы вы можете использовать
$originalValue = new QuantityValue(3, Unit::getByAbbreviation('m')->getId());
$convertedValue = $originalValue->convertTo(Unit::getByAbbreviation('mm'));
// $convertedValue — QuantityValue со значением 3000 и единицей mm
или
$originalValue = new QuantityValue(3, Unit::getByAbbreviation('m')->getId());
$convertedValue = $originalValue->convertTo('mm');
// $convertedValue — QuantityValue со значением 3000 и единицей mm
Единицы без указанной базовой единицы считаются базовыми сами по себе. Поэтому в примере метр не имеет базовой единицы — это нормально, хотя можно явно указать базу как метр.
В конфигурации единиц для quantity value также есть колонка "offset" (смещение). Она нужна для конверсий, где требуется сложение/вычитание. Пример
| Название | Аббревиатура | Базовая единица | Коэффициент | Смещение |
|---|---|---|---|---|
| Degrees Celcius | °C | 1.8 | -32 | |
| Degrees Fahrenheit | °F | °C |
Параметры конверсии соответствуют формуле °F = °C * 1.8 + 32
Формула, используемая для конвертации, выглядит так: $convertedValue = ($quantityValue->getValue() * $fromUnit->getFactor() - $fromUnit->getConversionOffset()) / $toUnit->getFactor() + $toUnit->getConversionOffset();
Динамическая конвертация единиц
Если коэффициенты/смещения меняются со временем (например, валюты) или вы хотите использовать внешний API, есть два варианта::
- Периодически обновлять коэффициенты/смещения в конфигурации единиц
- Создать сервис-конвертер
Для второго варианта нужно реализовать класс, который имплементирует интерфейс \Pimcore\Model\DataObject\QuantityValue\QuantityValueConverterInterface и зарегистрировать этот класс как сервис в services.yaml. Имя сервиса затем можно указать в колонке "Converter service" в конфигурации единиц для соответствующей базовой единицы.
Input Quantity Value (Количественное значение ввода)
Input Quantity Value очень похож на Quantity Value, за исключением того, что допускаются текстовые значения вместо строгого ограничения только на числовые значения.
Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.