diff options
author | Alex Pott <alex.a.pott@googlemail.com> | 2016-07-05 09:59:22 +0100 |
---|---|---|
committer | Alex Pott <alex.a.pott@googlemail.com> | 2016-07-05 09:59:22 +0100 |
commit | 32801642fc1bc9f4a9942ce90e9b3669e74d16b3 (patch) | |
tree | 39b24804dd0ebaf74747ca5650ea5691aa1cec8a | |
parent | 47df37841e4883c857b64292c4a6405d8c8435af (diff) | |
download | drupal-8.1.4.tar.gz drupal-8.1.4.zip |
Issue #1266748 by swentel, Berdir, jcnventura, arlinsandbulte, yched, droplet, amateescu: Changing cardinality lower than highest existing delta causes data loss upon save8.1.4
-rw-r--r-- | core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php | 17 | ||||
-rw-r--r-- | core/modules/field_ui/src/Tests/ManageFieldsTest.php | 39 |
2 files changed, 56 insertions, 0 deletions
diff --git a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php index 1f4f94a850d4..bbaeb63322d9 100644 --- a/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php +++ b/core/modules/field_ui/src/Form/FieldStorageConfigEditForm.php @@ -148,10 +148,27 @@ class FieldStorageConfigEditForm extends EntityForm { public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); + $field_storage_definitions = \Drupal::service('entity_field.manager')->getFieldStorageDefinitions($this->entity->getTargetEntityTypeId()); + // Validate field cardinality. if ($form_state->getValue('cardinality') === 'number' && !$form_state->getValue('cardinality_number')) { $form_state->setErrorByName('cardinality_number', $this->t('Number of values is required.')); } + // If a specific cardinality is used, validate that there are no entities + // with a higher delta. + elseif (!$this->entity->isNew() && isset($field_storage_definitions[$this->entity->getName()]) && $form_state->getValue('cardinality') != FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED) { + + // Get a count of entities that have a value in a delta higher than the + // one selected. Deltas start with 0, so the selected value does not + // need to be incremented. + $entities_with_higher_delta = \Drupal::entityQuery($this->entity->getTargetEntityTypeId()) + ->condition($this->entity->getName() . '.%delta', $form_state->getValue('cardinality')) + ->count() + ->execute(); + if ($entities_with_higher_delta) { + $form_state->setErrorByName('cardinality_number', $this->formatPlural($entities_with_higher_delta, 'There is @count entity with @delta or more values in this field.', 'There are @count entities with @delta or more values in this field.', ['@delta' => $form_state->getValue('cardinality') + 1])); + } + } } /** diff --git a/core/modules/field_ui/src/Tests/ManageFieldsTest.php b/core/modules/field_ui/src/Tests/ManageFieldsTest.php index 673b7319e4b1..cbe9f53e9f55 100644 --- a/core/modules/field_ui/src/Tests/ManageFieldsTest.php +++ b/core/modules/field_ui/src/Tests/ManageFieldsTest.php @@ -267,6 +267,23 @@ class ManageFieldsTest extends WebTestBase { $this->assertLink(t('Field settings')); $this->assertLinkByHref($field_edit_path); + // Add two entries in the body. + $edit = ['title[0][value]' => 'Cardinality', 'body[0][value]' => 'Body 1', 'body[1][value]' => 'Body 2']; + $this->drupalPostForm('node/add/article', $edit, 'Save'); + + // Assert that you can't set the cardinality to a lower number than the + // highest delta of this field. + $edit = [ + 'cardinality' => 'number', + 'cardinality_number' => 1, + ]; + $this->drupalPostForm($field_edit_path, $edit, t('Save field settings')); + $this->assertRaw(t('There is @count entity with @delta or more values in this field.', ['@count' => 1, '@delta' => 2]), 'Correctly failed to set cardinality lower than highest delta.'); + + // Create a second entity with three values. + $edit = ['title[0][value]' => 'Cardinality 3', 'body[0][value]' => 'Body 1', 'body[1][value]' => 'Body 2', 'body[2][value]' => 'Body 3']; + $this->drupalPostForm('node/add/article', $edit, 'Save'); + // Set to unlimited. $edit = array( 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, @@ -276,6 +293,28 @@ class ManageFieldsTest extends WebTestBase { $this->drupalGet($field_edit_path); $this->assertFieldByXPath("//select[@name='cardinality']", FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED); $this->assertFieldByXPath("//input[@name='cardinality_number']", 1); + + // Assert that you can't set the cardinality to a lower number then the + // highest delta of this field but can set it to the same. + $edit = [ + 'cardinality' => 'number', + 'cardinality_number' => 1, + ]; + $this->drupalPostForm($field_edit_path, $edit, t('Save field settings')); + $this->assertRaw(t('There are @count entities with @delta or more values in this field.', ['@count' => 2, '@delta' => 2]), 'Correctly failed to set cardinality lower than highest delta.'); + + $edit = [ + 'cardinality' => 'number', + 'cardinality_number' => 2, + ]; + $this->drupalPostForm($field_edit_path, $edit, t('Save field settings')); + $this->assertRaw(t('There is @count entity with @delta or more values in this field.', ['@count' => 1, '@delta' => 3]), 'Correctly failed to set cardinality lower than highest delta.'); + + $edit = [ + 'cardinality' => 'number', + 'cardinality_number' => 3, + ]; + $this->drupalPostForm($field_edit_path, $edit, t('Save field settings')); } /** |