/** * {@inheritdoc} */ public static function onDependencyRemoval(FieldDefinitionInterface $field_definition, array $dependencies) { $changed = parent::onDependencyRemoval($field_definition, $dependencies); $entity_manager = \Drupal::entityManager(); $target_entity_type = $entity_manager->getDefinition($field_definition->getFieldStorageDefinition()->getSetting('target_type')); // Try to update the default value config dependency, if possible. if ($default_value = $field_definition->getDefaultValueLiteral()) { foreach ($default_value as $key => $value) { if (is_array($value) && isset($value['target_uuid'])) { $entity = $entity_manager->loadEntityByUuid($target_entity_type->id(), $value['target_uuid']); // @see \Drupal\Core\Field\EntityReferenceFieldItemList::processDefaultValue() if ($entity && isset($dependencies[$entity->getConfigDependencyKey()][$entity->getConfigDependencyName()])) { unset($default_value[$key]); $changed = TRUE; } } } if ($changed) { $field_definition->setDefaultValue($default_value); } } // Update the 'target_bundles' handler setting if a bundle config dependency // has been removed. $bundles_changed = FALSE; $handler_settings = $field_definition->getSetting('handler_settings'); if (!empty($handler_settings['target_bundles'])) { if ($bundle_entity_type_id = $target_entity_type->getBundleEntityType()) { if ($storage = $entity_manager->getStorage($bundle_entity_type_id)) { foreach ($storage->loadMultiple($handler_settings['target_bundles']) as $bundle) { if (isset($dependencies[$bundle->getConfigDependencyKey()][$bundle->getConfigDependencyName()])) { unset($handler_settings['target_bundles'][$bundle->id()]); // If this bundle is also used in the 'auto_create_bundle' // setting, disable the auto-creation feature completely. $auto_create_bundle = !empty($handler_settings['auto_create_bundle']) ? $handler_settings['auto_create_bundle'] : FALSE; if ($auto_create_bundle && $auto_create_bundle == $bundle->id()) { $handler_settings['auto_create'] = NULL; $handler_settings['auto_create_bundle'] = NULL; } $bundles_changed = TRUE; // In case we deleted the only target bundle allowed by the field // we have to log a critical message because the field will not // function correctly anymore. if ($handler_settings['target_bundles'] === []) { \Drupal::logger('entity_reference')->critical('The %target_bundle bundle (entity type: %target_entity_type) was deleted. As a result, the %field_name entity reference field (entity_type: %entity_type, bundle: %bundle) no longer has any valid bundle it can reference. The field is not working correctly anymore and has to be adjusted.', ['%target_bundle' => $bundle->label(), '%target_entity_type' => $bundle->getEntityType()->getBundleOf(), '%field_name' => $field_definition->getName(), '%entity_type' => $field_definition->getTargetEntityTypeId(), '%bundle' => $field_definition->getTargetBundle()]); } } } } } } if ($bundles_changed) { $field_definition->setSetting('handler_settings', $handler_settings); } $changed |= $bundles_changed; return $changed; }