diff --git a/core/lib/Drupal/Core/Config/ConfigManager.php b/core/lib/Drupal/Core/Config/ConfigManager.php index c7796c4..81d3861 100644 --- a/core/lib/Drupal/Core/Config/ConfigManager.php +++ b/core/lib/Drupal/Core/Config/ConfigManager.php @@ -416,8 +416,9 @@ protected function callOnDependencyRemoval(ConfigEntityInterface $entity, array return $this->loadConfigEntityByName($name); } else { - list($entity_type_id) = explode(':', $name); - return $this->entityManager->loadEntityByConfigTarget($entity_type_id, $name); + // Ignore the bundle. + list($entity_type_id,, $uuid) = explode(':', $name); + return $this->entityManager->loadEntityByConfigTarget($entity_type_id, $uuid); } }, $affected_dependencies[$type]); } @@ -433,6 +434,14 @@ protected function callOnDependencyRemoval(ConfigEntityInterface $entity, array } } + // Key the entity arrays by config dependency name to make searching easy. + foreach (['config', 'content'] as $dependency_type) { + $affected_dependencies[$dependency_type] = array_combine( + array_map(function ($entity) { return $entity->getConfigDependencyName();}, $affected_dependencies[$dependency_type]), + $affected_dependencies[$dependency_type] + ); + } + // Inform the entity. return $entity->onDependencyRemoval($affected_dependencies); } diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php index 10497ad..5844cf9 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php @@ -291,15 +291,14 @@ public static function calculateDependencies(FieldDefinitionInterface $field_def */ public static function onDependencyRemoval(FieldDefinitionInterface $field_definition, array $dependencies) { $changed = FALSE; - if (is_array($field_definition->default_value) && count($field_definition->default_value)) { + if (!empty($field_definition->default_value)) { $target_entity_type = \Drupal::entityManager()->getDefinition($field_definition->getFieldStorageDefinition()->getSetting('target_type')); - foreach ($field_definition->default_value as $default_value) { + foreach ($field_definition->default_value as $key => $default_value) { if (is_array($default_value) && isset($default_value['target_uuid'])) { $entity = \Drupal::entityManager()->loadEntityByUuid($target_entity_type->id(), $default_value['target_uuid']); - // If the entity does not exist do not create the dependency. // @see \Drupal\Core\Field\EntityReferenceFieldItemList::processDefaultValue() - if ($entity && in_array($entity, $dependencies[$target_entity_type->getConfigDependencyKey()])) { - $field_definition->default_value = []; + if ($entity && isset($dependencies[$entity->getConfigDependencyKey()][$entity->getConfigDependencyName()])) { + unset($field_definition->default_value[$key]); $changed = TRUE; } } diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php b/core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php index 38bc069..e002ac2 100644 --- a/core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php +++ b/core/modules/entity_reference/src/Tests/EntityReferenceFieldDefaultValueTest.php @@ -105,4 +105,50 @@ function testEntityReferenceDefaultValue() { $this->assertConfigSchema(\Drupal::service('config.typed'), $field_storage_config->getName(), $field_storage_config->get()); } + /** + * Tests that dependencies due to default values can be removed. + * + * @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::onDependencyRemoval() + */ + function testEntityReferenceDefaultConfigValue() { + // Create a node to be referenced. + $referenced_node_type = $this->drupalCreateContentType(array('type' => 'referenced_config')); + + $field_name = Unicode::strtolower($this->randomMachineName()); + $field_storage = entity_create('field_storage_config', array( + 'field_name' => $field_name, + 'entity_type' => 'node', + 'type' => 'entity_reference', + 'settings' => array('target_type' => 'node_type'), + )); + $field_storage->save(); + $field = entity_create('field_config', array( + 'field_storage' => $field_storage, + 'bundle' => 'reference_content', + 'settings' => array( + 'handler' => 'default', + 'handler_settings' => array( + 'sort' => array('field' => '_none'), + ), + ), + )); + $field->save(); + + // Set created node as default_value. + $field_edit = array( + 'default_value_input[' . $field_name . '][0][target_id]' => $referenced_node_type->label() . ' (' .$referenced_node_type->id() . ')', + ); + $this->drupalPostForm('admin/structure/types/manage/reference_content/fields/node.reference_content.' . $field_name, $field_edit, t('Save settings')); + + // Check that the field has a dependency on the default value. + $config_entity = $this->config('field.field.node.reference_content.' . $field_name)->get(); + $this->assertTrue(in_array($referenced_node_type->getConfigDependencyName(), $config_entity['dependencies']['config'], TRUE), 'The node type is a dependency of the field.'); + + // Check that the field does not have a dependency on the default value + // after deleting the node type. + $referenced_node_type->delete(); + \Drupal::configFactory()->reset('field.field.node.reference_content.' . $field_name); + $this->assertTrue(in_array($referenced_node_type->getConfigDependencyName(), $config_entity['dependencies']['config'], TRUE), 'The node type is a dependency of the field.'); + } + }