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

Числа

Оба числовых типа данных (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, за исключением того, что допускаются текстовые значения вместо строгого ограничения только на числовые значения.


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