diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php index c17e7255f6174a679bce9ea9a03ea5175c9f0cc9..31cf07d48fc8a3f7be3cfb5a2f63c2034deb7cfc 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/DecimalItem.php @@ -92,6 +92,25 @@ public function storageSettingsForm(array &$form, FormStateInterface $form_state return $element; } + /** + * {@inheritdoc} + */ + public function getConstraints() { + $constraint_manager = \Drupal::typedDataManager()->getValidationConstraintManager(); + $constraints = parent::getConstraints(); + + $constraints[] = $constraint_manager->create('ComplexData', array( + 'value' => array( + 'Regex' => array( + 'pattern' => '/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/i', + ) + ), + )); + + return $constraints; + } + + /** * {@inheritdoc} */ diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RegexConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RegexConstraint.php new file mode 100644 index 0000000000000000000000000000000000000000..7d476eb5b3458d7a9951289a0f235fd7a120cf8e --- /dev/null +++ b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/RegexConstraint.php @@ -0,0 +1,32 @@ +drupalPostForm(NULL, $edit, t('Save')); $this->assertRaw(t('%name must be lower than or equal to %maximum.', array('%name' => $field_name, '%maximum' => $maximum)), 'Correctly failed to save integer value greater than maximum allowed value.'); + // Try to set a wrong integer value. + $this->drupalGet('entity_test/add'); + $edit = array( + "{$field_name}[0][value]" => '20-40', + ); + $this->drupalPostForm(NULL, $edit, t('Save')); + $this->assertRaw(t('%name must be a number.', array('%name' => $field_name)), 'Correctly failed to save wrong integer value.'); + // Test with valid entries. $valid_entries = array( '-1234', diff --git a/core/modules/field/src/Tests/Number/NumberItemTest.php b/core/modules/field/src/Tests/Number/NumberItemTest.php index 4390449ae7f3870e00898a5b14abb6244f30c8d5..e7eac30d4ba14ae03de581121e900ed09b3a8e1c 100644 --- a/core/modules/field/src/Tests/Number/NumberItemTest.php +++ b/core/modules/field/src/Tests/Number/NumberItemTest.php @@ -53,6 +53,9 @@ public function testNumberItem() { $entity->field_integer = $integer; $float = 3.14; $entity->field_float = $float; + $entity->field_decimal = '20-40'; + $violations = $entity->validate(); + $this->assertIdentical(1, count($violations), 'Wrong decimal value causes validation error'); $decimal = '31.3'; $entity->field_decimal = $decimal; $entity->name->value = $this->randomMachineName();