diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml index f76c907..7c0ad53 100644 --- a/core/config/schema/core.data_types.schema.yml +++ b/core/config/schema/core.data_types.schema.yml @@ -566,7 +566,7 @@ field.field_settings.entity_reference: type: string label: 'Reference method' handler_settings: - type: entity_reference_selection.[plugin_id] + type: entity_reference_selection.[%parent.handler] label: 'Entity reference selection settings' field.value.entity_reference: @@ -757,9 +757,6 @@ entity_reference_selection: type: mapping label: 'View handler settings' mapping: - plugin_id: - type: string - label: 'Entity reference selection plugin ID' target_bundles: type: sequence label: 'types' diff --git a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginManager.php b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginManager.php index 59aa5cd..9918a58 100644 --- a/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginManager.php +++ b/core/lib/Drupal/Core/Entity/EntityReferenceSelection/SelectionPluginManager.php @@ -45,13 +45,11 @@ public function getInstance(array $options) { // Initialize default options. $options += array( - 'handler' => 'default', + 'handler' => $this->getPluginId($options['target_type'], 'default'), 'handler_settings' => array(), ); - $plugin_id = isset($options['handler_settings']['plugin_id']) ? $options['handler_settings']['plugin_id'] : $this->getPluginId($options['target_type'], $options['handler']); - - return $this->createInstance($plugin_id, $options); + return $this->createInstance($options['handler'], $options); } /** @@ -95,7 +93,7 @@ public function getSelectionHandler(FieldDefinitionInterface $field_definition, $options = array( 'target_type' => $field_definition->getFieldStorageDefinition()->getSetting('target_type'), 'handler' => $field_definition->getSetting('handler'), - 'handler_settings' => $field_definition->getSetting('handler_settings'), + 'handler_settings' => $field_definition->getSetting('handler_settings') ?: array(), 'entity' => $entity, ); return $this->getInstance($options); 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 17e26b6..81664ba 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php @@ -59,7 +59,7 @@ public static function defaultStorageSettings() { */ public static function defaultFieldSettings() { return array( - 'handler' => 'default', + 'handler' => 'default:' . (\Drupal::moduleHandler()->moduleExists('node') ? 'node' : 'user'), 'handler_settings' => array(), ) + parent::defaultFieldSettings(); } diff --git a/core/modules/entity_reference/entity_reference.module b/core/modules/entity_reference/entity_reference.module index 1f9f5d1..6e63c08 100644 --- a/core/modules/entity_reference/entity_reference.module +++ b/core/modules/entity_reference/entity_reference.module @@ -87,6 +87,8 @@ function entity_reference_field_storage_config_update(FieldStorageConfigInterfac foreach ($field_storage->getBundles() as $bundle) { $field = FieldConfig::loadByName($field_storage->getTargetEntityTypeId(), $bundle, $field_storage->getName()); + list($current_handler) = explode(':', $field->settings['handler'], 2); + $field->settings['handler'] = \Drupal::service('plugin.manager.entity_reference_selection')->getPluginId($field_storage->getSetting('target_type'), $current_handler); $field->settings['handler_settings'] = array(); $field->save(); } @@ -95,7 +97,7 @@ function entity_reference_field_storage_config_update(FieldStorageConfigInterfac /** * Implements hook_ENTITY_TYPE_presave() for 'field_config'. * - * Recalculate the 'plugin_id' handler setting when the handler is changed. + * Determine the selection hander plugin ID for an entity reference field. */ function entity_reference_field_config_presave(FieldConfigInterface $field) { if ($field->getType() != 'entity_reference') { @@ -110,7 +112,8 @@ function entity_reference_field_config_presave(FieldConfigInterface $field) { $target_type = $field->getFieldStorageDefinition()->getSetting('target_type'); $selection_manager = \Drupal::service('plugin.manager.entity_reference_selection'); - $field->settings['handler_settings']['plugin_id'] = $selection_manager->getPluginId($target_type, $field->getSetting('handler')); + list($current_handler) = explode(':', $field->getSetting('handler'), 2); + $field->settings['handler'] = $selection_manager->getPluginId($target_type, $current_handler); } /** diff --git a/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php b/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php index c475a7b..2299351 100644 --- a/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php +++ b/core/modules/entity_reference/src/ConfigurableEntityReferenceItem.php @@ -141,7 +141,7 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) { } elseif (array_key_exists($selection_group_id . ':' . $this->getSetting('target_type'), $selection_plugins[$selection_group_id])) { $selection_group_plugin = $selection_group_id . ':' . $this->getSetting('target_type'); - $handlers_options[$selection_group_id] = String::checkPlain($selection_plugins[$selection_group_id][$selection_group_plugin]['base_plugin_label']); + $handlers_options[$selection_group_plugin] = String::checkPlain($selection_plugins[$selection_group_id][$selection_group_plugin]['base_plugin_label']); } } diff --git a/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php b/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php index 19ef644..e3fcc16 100644 --- a/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php +++ b/core/modules/entity_reference/src/Tests/EntityReferenceAdminTest.php @@ -78,7 +78,7 @@ public function testFieldAdminHandler() { $this->drupalPostForm(NULL, array(), t('Save field settings')); // The base handler should be selected by default. - $this->assertFieldByName('field[settings][handler]', 'default'); + $this->assertFieldByName('field[settings][handler]', 'default:node'); // The base handler settings should be displayed. $entity_type_id = 'node'; diff --git a/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php b/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php index 8c1ba50..6c0b4a8 100644 --- a/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php +++ b/core/modules/field/src/Tests/EntityReference/EntityReferenceItemTest.php @@ -217,7 +217,7 @@ public function testEntitySaveOrder() { } /** - * Tests that the 'plugin_id' selection setting. + * Tests that the 'handler' field setting stores the proper plugin ID. */ public function testSelectionHandlerSettings() { $field_name = Unicode::strtolower($this->randomMachineName()); @@ -231,22 +231,21 @@ public function testSelectionHandlerSettings() { )); $field_storage->save(); + // Do not specify any value for the 'handler' setting in order to verify + // that the default value is properly used. $field = FieldConfig::create(array( 'field_storage' => $field_storage, 'bundle' => 'entity_test', - 'settings' => array( - 'handler' => 'default', - ), )); $field->save(); $field = FieldConfig::load($field->id()); - $this->assertTrue($field->getSetting('handler_settings')['plugin_id'] == 'default:entity_test'); + $this->assertTrue($field->getSetting('handler') == 'default:entity_test'); $field->settings['handler'] = 'views'; $field->save(); $field = FieldConfig::load($field->id()); - $this->assertTrue($field->getSetting('handler_settings')['plugin_id'] == 'views'); + $this->assertTrue($field->getSetting('handler') == 'views'); } } diff --git a/core/modules/file/config/schema/file.schema.yml b/core/modules/file/config/schema/file.schema.yml index b6195d2..bbf4048 100644 --- a/core/modules/file/config/schema/file.schema.yml +++ b/core/modules/file/config/schema/file.schema.yml @@ -47,7 +47,7 @@ base_file_field_field_settings: type: string label: 'Reference method' handler_settings: - type: entity_reference_selection.[plugin_id] + type: entity_reference_selection.[%parent.handler] label: 'Entity reference selection settings' file_directory: type: string diff --git a/core/modules/taxonomy/config/schema/taxonomy.schema.yml b/core/modules/taxonomy/config/schema/taxonomy.schema.yml index ed6a28c..25124f7 100644 --- a/core/modules/taxonomy/config/schema/taxonomy.schema.yml +++ b/core/modules/taxonomy/config/schema/taxonomy.schema.yml @@ -63,7 +63,7 @@ field.field_settings.taxonomy_term_reference: type: string label: 'Reference method' handler_settings: - type: entity_reference_selection.[plugin_id] + type: entity_reference_selection.[%parent.handler] label: 'Entity reference selection settings' field.value.taxonomy_term_reference: diff --git a/core/modules/views/config/schema/views.entity_reference.schema.yml b/core/modules/views/config/schema/views.entity_reference.schema.yml index a484871..027c62f 100644 --- a/core/modules/views/config/schema/views.entity_reference.schema.yml +++ b/core/modules/views/config/schema/views.entity_reference.schema.yml @@ -4,9 +4,6 @@ entity_reference_selection.views: type: mapping label: 'View handler settings' mapping: - plugin_id: - type: string - label: 'Entity reference selection plugin ID' view: type: mapping label: 'View used to select the entities'