getFieldMapByFieldType('dynamic_entity_reference'); $ids = []; foreach ($map as $type => $info) { foreach ($info as $name => $data) { foreach ($data['bundles'] as $bundle_name) { $ids[] = "$type.$bundle_name.$name"; } } } // Update the 'target_bundles' handler setting if needed. foreach (FieldConfig::loadMultiple($ids) as $field_config) { $settings = $field_config->getSettings(); $target_types = DynamicEntityReferenceItem::getTargetTypes($settings); if (in_array($entity_type_id, $target_types, TRUE) && isset($settings[$entity_type_id]['handler_settings'])) { $handler_settings = $settings[$entity_type_id]['handler_settings']; if (isset($handler_settings['target_bundles'][$bundle])) { unset($handler_settings['target_bundles'][$bundle]); $settings[$entity_type_id]['handler_settings'] = $handler_settings; $field_config->setSettings($settings); $field_config->save(); // 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('dynamic_entity_reference')->critical('The %target_bundle bundle (entity type: %target_entity_type) was deleted. As a result, the %field_name dynamic 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, '%target_entity_type' => $entity_type_id, '%field_name' => $field_config->getName(), '%entity_type' => $field_config->getTargetEntityTypeId(), '%bundle' => $field_config->getTargetBundle(), ]); } } } } } /** * Implements hook_ENTITY_TYPE_presave() for 'field_config'. * * @todo Clean this up once field_field_config_save is more accommodating. */ function dynamic_entity_reference_field_config_presave(FieldConfigInterface $field) { // Don't change anything during a configuration sync. if ($field->isSyncing()) { return; } $field_type_manager = \Drupal::service('plugin.manager.field.field_type'); $er_item_class = EntityReferenceItem::class; $class = $field_type_manager->getPluginClass($field->getType()); if ($class !== $er_item_class && !is_subclass_of($class, $er_item_class)) { return; } $der_item_class = DynamicEntityReferenceItem::class; if ($class === $der_item_class || is_subclass_of($class, $der_item_class)) { // DER needs to be handled differently. return; } // Just a normal ER item, do the things field_field_config_presave() would // have done before we removed it in // dynamic_entity_reference_module_implements_alter(). $selection_manager = \Drupal::service('plugin.manager.entity_reference_selection'); $target_type = $field->getFieldStorageDefinition()->getSetting('target_type'); [$current_handler] = explode(':', $field->getSetting('handler'), 2); $field->setSetting('handler', $selection_manager->getPluginId($target_type, $current_handler)); } /** * Implements hook_module_implements_alter(). */ function dynamic_entity_reference_module_implements_alter(&$implementations, $hook) { if ($hook == 'field_config_presave') { // We have to go after field_field_config_presave(). $group = $implementations['dynamic_entity_reference']; unset($implementations['dynamic_entity_reference']); // Remove the field implementation, we have a fallback in our hook. unset($implementations['field']); $implementations['dynamic_entity_reference'] = $group; } } /** * Implements hook_form_FORM_ID_alter() for 'field_ui_field_storage_add_form'. */ function dynamic_entity_reference_form_field_ui_field_storage_add_form_alter(array &$form) { if (version_compare(\Drupal::VERSION, '10.1.999', '<')) { $optgroup = (string) t('Dynamic entity reference'); // Move the "Dynamic entity reference" option to the end of the list and // rename it to "Other". unset($form['add']['new_storage_type']['#options'][$optgroup]['dynamic_entity_reference']); $form['add']['new_storage_type']['#options'][$optgroup]['dynamic_entity_reference'] = t('Other…'); } } /** * Implements hook_field_info_alter(). */ function dynamic_entity_reference_field_info_alter(&$info) { if (version_compare(\Drupal::VERSION, '10.1.999', '<')) { $info['dynamic_entity_reference']['category'] = t('Dynamic Reference'); } }