diff --git a/src/Plugin/Field/FieldWidget/DynamicEntityReferenceWidget.php b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceWidget.php index 7568058..f606aa1 100644 --- a/src/Plugin/Field/FieldWidget/DynamicEntityReferenceWidget.php +++ b/src/Plugin/Field/FieldWidget/DynamicEntityReferenceWidget.php @@ -47,7 +47,7 @@ class DynamicEntityReferenceWidget extends EntityReferenceAutocompleteWidget { $settings = $this->getFieldSettings(); $labels = \Drupal::entityManager()->getEntityTypeLabels(); - $available = DynamicEntityReferenceItem::getTargetTypes($settings); + $available = DynamicEntityReferenceItem::getTargetTypes($settings, TRUE); $cardinality = $items->getFieldDefinition()->getFieldStorageDefinition()->getCardinality(); $target_type = $items->get($delta)->target_type ?: reset($available); diff --git a/tests/src/Functional/DynamicEntityReferenceTest.php b/tests/src/Functional/DynamicEntityReferenceTest.php index c94bd5f..f631b79 100644 --- a/tests/src/Functional/DynamicEntityReferenceTest.php +++ b/tests/src/Functional/DynamicEntityReferenceTest.php @@ -47,6 +47,7 @@ class DynamicEntityReferenceTest extends BrowserTestBase { 'field_ui', 'dynamic_entity_reference', 'entity_test', + 'config_test', ]; /** @@ -466,7 +467,117 @@ class DynamicEntityReferenceTest extends BrowserTestBase { $assert_session->pageTextContains($this->adminUser->label()); $assert_session->pageTextContains('tag'); $assert_session->pageTextContains($term->label()); + } + + /** + * Tests that config entities are autocreated. + */ + public function testAutoCreateConfigEntities() { + $this->drupalLogin($this->adminUser); + + \Drupal::service('module_installer')->install(['taxonomy']); + $vocabulary = Vocabulary::create([ + 'name' => $this->randomMachineName(), + 'vid' => Unicode::strtolower($this->randomMachineName()), + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, + ]); + $vocabulary->save(); + $term = Term::create([ + 'name' => $this->randomMachineName(), + 'vid' => $vocabulary->id(), + 'langcode' => LanguageInterface::LANGCODE_NOT_SPECIFIED, + ]); + $term->save(); + + /** @var \Drupal\field\FieldStorageConfigInterface $storage */ + $storage = $this->container->get('entity_type.manager') + ->getStorage('field_storage_config') + ->create([ + 'field_name' => 'field_foobar', + 'entity_type' => 'entity_test', + 'type' => 'dynamic_entity_reference', + 'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED, + 'settings' => [ + 'exclude_entity_types' => FALSE, + 'entity_type_ids' => [ + 'taxonomy_term', + 'user', + 'config_test', + ], + ], + ]); + $storage->save(); + + /** @var \Drupal\field\FieldConfigInterface $field */ + $field = $this->container->get('entity_type.manager') + ->getStorage('field_config') + ->create([ + 'field_name' => 'field_foobar', + 'entity_type' => 'entity_test', + 'bundle' => 'entity_test', + 'label' => 'Foobar', + 'settings' => [ + 'user' => [ + 'handler' => 'default:user', + 'handler_settings' => [], + ], + 'taxonomy_term' => [ + 'handler' => 'default:taxonomy_term', + 'handler_settings' => [ + 'target_bundles' => [$vocabulary->id() => $vocabulary->id()], + 'sort' => ['field' => '_none'], + 'auto_create' => TRUE, + 'auto_create_bundle' => FALSE, + ], + ], + 'config_test' => [ + 'handler' => 'default:config_test', + 'handler_settings' => [ + 'target_bundles' => ['config_test' => 'config_test'], + 'sort' => ['field' => '_none'], + 'auto_create' => TRUE, + 'auto_create_bundle' => FALSE, + ], + ], + ], + ]); + $field->save(); + + entity_get_form_display('entity_test', 'entity_test', 'default') + ->setComponent('field_foobar', [ + 'type' => 'dynamic_entity_reference_default', + 'settings' => [ + 'match_operator' => 'CONTAINS', + 'size' => 40, + 'placeholder' => '', + ], + ]) + ->save(); + + // Add a non-existent config_test item. + $this->drupalGet('entity_test/add'); + + // Add some extra dynamic entity reference fields. + $this->getSession()->getPage()->findButton('Add another item')->click(); + $this->getSession()->getPage()->findButton('Add another item')->click(); + $edit = [ + 'field_foobar[0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')', + 'field_foobar[0][target_type]' => 'user', + // Add a non-existing term. + 'field_foobar[1][target_id]' => 'tag', + 'field_foobar[1][target_type]' => 'taxonomy_term', + 'field_foobar[2][target_id]' => 'test', + 'field_foobar[2][target_type]' => 'config_test', + 'name[0][value]' => 'Another', + 'user_id[0][target_id]' => $this->adminUser->label() . ' (' . $this->adminUser->id() . ')', + ]; + $this->submitForm($edit, t('Save')); + + $entities = \Drupal::entityTypeManager() + ->getStorage('entity_test') + ->loadByProperties(['name' => 'Another']); + $this->assertCount(1, $entities, 'Entity was saved'); } /**