Physical Fields
Proporciona tipos de campo para almacenar y manipular medidas físicas con soporte para múltiples unidades, conversiones automáticas y aritmética de precisión.
physical
Install
composer require 'drupal/physical:8.x-1.5'
composer require 'drupal/physical:8.x-1.1'
Overview
Physical Fields es un módulo completo de Drupal que proporciona tipos de campo robustos para almacenar medidas físicas y sus unidades de medida asociadas. Soporta seis tipos distintos de medición: Área, Longitud, Temperatura, Volumen, Peso y Presión, cada uno con múltiples unidades y capacidades de conversión automática.
El módulo ofrece dos tipos principales de campo: Measurement (para valores únicos como peso o temperatura) y Dimensions (para mediciones tridimensionales como embalaje de productos). Todas las operaciones numéricas utilizan aritmética basada en bcmath para prevenir la pérdida de precisión de punto flotante, haciéndolo adecuado para aplicaciones de comercio electrónico y científicas.
Una característica clave es la entrada y visualización de números específica por idioma, permitiendo a los usuarios ingresar números usando el separador decimal de su configuración regional (por ejemplo, coma en español) mientras almacena los datos en un formato estandarizado. El módulo proporciona una API completa con objetos de valor que soportan operaciones aritméticas, comparaciones y conversiones de unidades programáticamente.
Features
- Seis tipos de medición: Área, Longitud, Temperatura, Volumen, Peso y Presión con soporte completo de unidades
- Dos tipos de campo: Measurement (valor único + unidad) y Dimensions (largo × ancho × alto + unidad)
- Conversión automática de unidades con aritmética precisa basada en bcmath para prevenir errores de punto flotante
- Entrada y formato de números específicos por idioma usando la extensión PHP intl
- Objetos de valor inmutables con operaciones aritméticas (sumar, restar, multiplicar, dividir)
- Métodos de comparación para medidas (equals, greaterThan, lessThan, compareTo)
- Configuración de widget ajustable para unidad predeterminada, permiso de cambio de unidad y unidades disponibles
- Formateador con conversión de unidad de salida para mostrar medidas en unidades preferidas
- Elementos de formulario personalizados para entrada de medidas y dimensiones
- Soporte de migración para campos de peso de Drupal 7
- Integración con Field UI con opciones preconfiguradas para cada tipo de medición
Use Cases
Peso y dimensiones de productos de comercio electrónico
Almacenar peso de productos y dimensiones de envío para aplicaciones de comercio. El módulo se integra bien con Drupal Commerce, proporcionando cálculos de peso precisos para la determinación de tarifas de envío. Configurar campos de peso para productos y campos de dimensiones para tamaños de paquetes. Usar la configuración output_unit del formateador para mostrar pesos en las unidades preferidas del cliente.
Recolección de datos científicos
Registrar mediciones con alta precisión para aplicaciones científicas. La aritmética basada en bcmath asegura que no se acumulen errores de punto flotante durante los cálculos. Los campos de temperatura soportan Kelvin, Celsius y Fahrenheit con fórmulas de conversión precisas.
Mediciones de propiedades inmobiliarias
Almacenar dimensiones de propiedades, tamaños de habitaciones y áreas de terreno. Usar campos de Area para tamaños de lotes (soportando hectáreas, metros cuadrados, pies cuadrados) y campos de Dimensions para mediciones de habitaciones. Los formateadores pueden convertir entre unidades métricas e imperiales para listados internacionales.
Manufactura e inventario
Rastrear especificaciones físicas de productos manufacturados o artículos de inventario. Almacenar dimensiones de productos para gestión de almacén, peso para logística de envío y volumen para optimización de empaque en contenedores.
Aplicaciones de recetas y nutrición
Almacenar cantidades de ingredientes con mediciones de volumen (ml, l, tazas) o peso (g, kg, oz). Las capacidades de conversión permiten que las recetas se muestren en unidades métricas o imperiales según la preferencia del usuario.
Sistemas de monitoreo de presión
Registrar mediciones de presión de sensores o equipos en varias unidades (psi, bar, Pa, atm). Convertir entre unidades para diferentes estándares regionales o especificaciones de equipos.
Tips
- Usar las constantes de MeasurementType (MeasurementType::WEIGHT, etc.) cuando se trabaje con tipos de medición programáticamente
- Siempre pasar números como strings a la clase Calculator y objetos de valor para mantener la precisión
- La clase Temperature usa fórmulas de conversión personalizadas en lugar de simples factores de multiplicación debido a la naturaleza no lineal de las escalas de temperatura
- Instalar la extensión PHP intl para formato de números apropiado según la configuración regional; sin ella, los usuarios deben usar punto como separador decimal
- Los objetos de valor son inmutables - las operaciones aritméticas retornan nuevas instancias en lugar de modificar la original
- Usar el método toMeasurement() en los items de campo MeasurementItem para obtener un objeto de valor para manipulación programática
- El elemento de formulario physical_number muestra automáticamente un placeholder indicando el formato decimal esperado para la configuración regional actual
- Al migrar desde Drupal 7, usar el plugin de proceso de migración physical_weight para transformar los valores del campo
Technical Details
Troubleshooting 4
Instalar la extensión PHP intl. Sin ella, el NumberFormatter recurre a funcionalidad básica sin separadores decimales específicos por configuración regional.
Asegurarse de usar la clase Calculator o los métodos de objeto de valor para aritmética. Nunca usar la aritmética de punto flotante nativa de PHP con valores de medición.
La conversión de temperatura usa fórmulas especiales (no multiplicación simple). La clase Temperature sobrescribe el método convert() para manejar las conversiones Kelvin/Celsius/Fahrenheit correctamente.
El elemento physical_number maneja el análisis de configuración regional automáticamente. Asegurarse de usar los elementos de formulario physical_measurement o physical_dimensions en lugar de campos de texto simples.