diff --git a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php index d71c201..43c2a5a 100644 --- a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php +++ b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php @@ -215,7 +215,7 @@ class DynamicEntityReferenceItem extends EntityReferenceItem { * Returns a form for single target type settings. * * This is same as - * \Drupal\entity_reference\ConfigurableEntityReferenceItem::fieldSettingsForm() + * \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::fieldSettingsForm() * but it uses dynamic_entity_reference_selection plugin manager instead of * entity_reference_selection plugin manager. * @@ -253,8 +253,8 @@ class DynamicEntityReferenceItem extends EntityReferenceItem { $form = array( '#type' => 'container', - '#process' => array(array(get_class($this), 'fieldSettingsAjaxProcess')), - '#element_validate' => array(array(get_class($this), 'fieldSettingsFormValidate')), + '#process' => [[EntityReferenceItem::class, 'fieldSettingsAjaxProcess']], + '#element_validate' => [[DynamicEntityReferenceItem::class, 'fieldSettingsFormValidate']], ); $form['handler'] = array( '#type' => 'details', @@ -303,20 +303,40 @@ class DynamicEntityReferenceItem extends EntityReferenceItem { * The form state of the (entire) configuration form. */ public static function fieldSettingsFormValidate(array $form, FormStateInterface $form_state) { - if ($form_state->hasValue('field')) { - $settings = $form_state->getValue(array('field', 'settings')); - foreach (array_keys($settings) as $target_type) { - $form_state->unsetValue(array( - 'field', + /** @var \Drupal\field\Entity\FieldConfig $field */ + $field = $form_state->getFormObject()->getEntity(); + foreach (static::getTargetTypes($field->getSettings()) as $target_type) { + // If no checkboxes were checked for 'target_bundles', store NULL ("all + // bundles are referenceable") rather than empty array ("no bundle is + // referenceable" - typically happens when all referenceable bundles have + // been deleted). + if ($form_state->getValue([ + 'settings', + $target_type, + 'handler_settings', + 'target_bundles', + ]) === []) { + $form_state->setValue([ 'settings', $target_type, - 'handler_submit', - )); - /** @var \Drupal\Core\Entity\EntityReferenceSelection\SelectionInterface $handler */ - $handler = \Drupal::service('plugin.manager.dynamic_entity_reference_selection')->getSelectionHandler($form_state->get('field'), NULL, $target_type); - $handler->validateConfigurationForm($form, $form_state); + 'handler_settings', + 'target_bundles', + ], NULL); } - $form_state->get('field')->settings = $form_state->getValue(array('field', 'settings')); + // Don't store the 'target_bundles_update' button value into the field + // config settings. + $form_state->unsetValue([ + 'settings', + $target_type, + 'handler_settings', + 'target_bundles_update', + ]); + $form_state->unsetValue([ + 'settings', + $target_type, + 'handler_submit', + ]); + } } diff --git a/tests/src/FunctionalJavascript/DynamicEntityReferenceTest.php b/tests/src/FunctionalJavascript/DynamicEntityReferenceTest.php new file mode 100644 index 0000000..ac9de27 --- /dev/null +++ b/tests/src/FunctionalJavascript/DynamicEntityReferenceTest.php @@ -0,0 +1,136 @@ +adminUser = $this->drupalCreateUser($this->permissions); + $this->anotherUser = $this->drupalCreateUser(); + } + + /** + * Tests if the toolbar can be toggled with JavaScript. + */ + public function testFieldSettings() { + $assert_session = $this->assertSession(); + // Add EntityTestBundle for EntityTestWithBundle. + EntityTestBundle::create([ + 'id' => 'test', + 'label' => 'Test label', + 'description' => 'My test description', + ])->save(); + $this->drupalLogin($this->adminUser); + // Add a new dynamic entity reference field. + $this->drupalGet('entity_test/structure/entity_test/fields/add-field'); + $edit = [ + 'label' => 'Foobar', + 'field_name' => 'foobar', + 'new_storage_type' => 'dynamic_entity_reference', + ]; + $this->submitForm($edit, t('Save and continue'), 'field-ui-field-storage-add-form'); + $page = $this->getSession()->getPage(); + $assert_session->selectExists('settings[entity_type_ids][]', $page) + ->selectOption('user'); + $assert_session->selectExists('cardinality', $page) + ->selectOption(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED); + $this->submitForm([], t('Save field settings'), 'field-storage-config-edit-form'); + $target_type_select = $assert_session->selectExists('default_value_input[field_foobar][0][target_type]'); + $target_type_select->selectOption('entity_test'); + try { + $target_type_select->selectOption('user'); + } + catch (ElementNotFoundException $e) { + $this->assertTrue(TRUE, 'Entity type select doesn\'t have "user" option.'); + } + $edit = [ + 'settings[entity_test_label][handler_settings][target_bundles][entity_test_label]' => TRUE, + 'settings[entity_test_view_builder][handler_settings][target_bundles][entity_test_view_builder]' => TRUE, + 'settings[entity_test_no_id][handler_settings][target_bundles][entity_test_no_id]' => TRUE, + 'settings[entity_test_no_label][handler_settings][target_bundles][entity_test_no_label]' => TRUE, + 'settings[entity_test_label_callback][handler_settings][target_bundles][entity_test_label_callback]' => TRUE, + 'settings[entity_test][handler_settings][target_bundles][entity_test]' => TRUE, + 'settings[entity_test_admin_routes][handler_settings][target_bundles][entity_test_admin_routes]' => TRUE, + 'settings[entity_test_base_field_display][handler_settings][target_bundles][entity_test_base_field_display]' => TRUE, + 'settings[entity_test_mul][handler_settings][target_bundles][entity_test_mul]' => TRUE, + 'settings[entity_test_mul_changed][handler_settings][target_bundles][entity_test_mul_changed]' => TRUE, + 'settings[entity_test_mul_default_value][handler_settings][target_bundles][entity_test_mul_default_value]' => TRUE, + 'settings[entity_test_mul_langcode_key][handler_settings][target_bundles][entity_test_mul_langcode_key]' => TRUE, + 'settings[entity_test_rev][handler_settings][target_bundles][entity_test_rev]' => TRUE, + 'settings[entity_test_mulrev_changed][handler_settings][target_bundles][entity_test_mulrev_changed]' => TRUE, + 'settings[entity_test_mulrev][handler_settings][target_bundles][entity_test_mulrev]' => TRUE, + 'settings[entity_test_revlog][handler_settings][target_bundles][entity_test_revlog]' => TRUE, + 'settings[entity_test_constraints][handler_settings][target_bundles][entity_test_constraints]' => TRUE, + 'settings[entity_test_composite_constraint][handler_settings][target_bundles][entity_test_composite_constraint]' => TRUE, + 'settings[entity_test_constraint_violation][handler_settings][target_bundles][entity_test_constraint_violation]' => TRUE, + 'settings[entity_test_field_override][handler_settings][target_bundles][entity_test_field_override]' => TRUE, + 'settings[entity_test_default_value][handler_settings][target_bundles][entity_test_default_value]' => TRUE, + 'settings[entity_test_update][handler_settings][target_bundles][entity_test_update]' => TRUE, + 'settings[entity_test_with_bundle][handler_settings][target_bundles][test]' => TRUE, + 'settings[entity_test_default_access][handler_settings][target_bundles][entity_test_default_access]' => TRUE, + 'settings[entity_test_cache][handler_settings][target_bundles][entity_test_cache]' => TRUE, + 'settings[entity_test_string_id][handler_settings][target_bundles][entity_test_string_id]' => TRUE, + ]; + $page = $this->getSession()->getPage(); + foreach (array_keys($edit) as $checkbox) { + $page->checkField($checkbox); + $this->assertJsCondition('(typeof(jQuery)=="undefined" || (0 === jQuery.active && 0 === jQuery(\':animated\').length))'); + } + $this->submitForm([], t('Save settings'), 'field-config-edit-form'); + $assert_session->pageTextContains((string) t('Saved %name configuration', array('%name' => 'Foobar'))); + } + +}