Перейти к основному содержимому

Числа

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

Numeric (Числовое)​

поле Numeric

Числовое поле можно настроить с значением по умолчанию. В интерфейсе оно отображается как поле со спиннером.

конфигурация Numeric

Numeric Range (Диапазон чисел)​

поле Numeric Range

Поле numericRange состоит из двух полей numeric (минимум и максимум) и потому настраивается аналогично. Программно значения представлены объектом NumericRange.

Slider (Слайдер)​

В интерфейсе слайдер можно использовать горизонтально или вертикально. Его нужно настроить с указанием минимального и максимального значений, шага инкремента и десятичной точности.

конфигурация Slider

Quantity Value (Количественное значение)​

Это числовой тип данных, который дополнительно позволяет указывать единицу измерения.

Сначала определите глобальный список известных единиц.

конфигурация 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

конфигурация Quantity Value

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

поле Quantity Value

В следующем фрагменте кода показано, как установить значение.

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 (Диапазон количественных значений)​

поле Quantity Value Range

Поле quantityValueRange по сути такое же, как quantityValue, но содержит два поля ввода (минимум и максимум). Программно значения представлены объектом QuantityValueRange.

Конвертация единиц для количественных значений​

Статическая конвертация единиц​

Вы можете конвертировать значения между единицами. Для этого необходимо определить базовые единицы, коэффициенты преобразования и смещения. Все единицы с одинаковой базовой единицей можно конвертировать друг в друга.

Коэффициент и смещение определяют, как преобразовать текущую единицу в базовую.

Пример: У вас есть физические единицы измерения длины метр (m), миллиметр (mm) и дюйм ("). Конфигурация может выглядеть так:

НазваниеАббревиатураБазовая единицаКоэффициент
Meterm
Millimetermmm0.001
Inch"m0.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°C1.8-32
Degrees Fahrenheit°F°C

Параметры конверсии соответствуют формуле °F = °C * 1.8 + 32

Формула, используемая для конвертации, выглядит так: $convertedValue = ($quantityValue->getValue() * $fromUnit->getFactor() - $fromUnit->getConversionOffset()) / $toUnit->getFactor() + $toUnit->getConversionOffset();

Динамическая конвертация единиц​

Если коэффициенты/смещения меняются со временем (например, валюты) или вы хотите использовать внешний API, есть два варианта::

  1. Периодически обновлять коэффициенты/смещения в конфигурации единиц
  2. Создать сервис-конвертер

Для второго варианта нужно реализовать класс, который имплементирует интерфейс \Pimcore\Model\DataObject\QuantityValue\QuantityValueConverterInterface и зарегистрировать этот класс как сервис в services.yaml. Имя сервиса затем можно указать в колонке "Converter service" в конфигурации единиц для соответствующей базовой единицы.

Input Quantity Value (Количественное значение ввода)​

Input Quantity Value очень похож на Quantity Value, за исключением того, что допускаются текстовые значения вместо строгого ограничения только на числовые значения.


Вы можете предложить улучшение документации или задать вопрос в комментариях.
Если вам нужна полноценная консультация — вы можете заказать её на нашем сайте.