Loading core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +5 −12 Original line number Diff line number Diff line Loading @@ -4,7 +4,6 @@ use Drupal\Component\Render\FormattableMarkup; use Drupal\Component\Utility\Html; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Entity\ContentEntityStorageInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Component\Plugin\Exception\PluginNotFoundException; Loading Loading @@ -483,6 +482,7 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) { ]; $form['handler']['handler_submit'] = [ '#type' => 'submit', '#name' => 'handler_settings_submit', '#value' => $this->t('Change handler'), '#limit_validation_errors' => [], '#attributes' => [ Loading Loading @@ -705,8 +705,8 @@ public static function fieldSettingsAjaxProcess($form, FormStateInterface $form_ public static function fieldSettingsAjaxProcessElement(&$element, $main_form) { if (!empty($element['#ajax'])) { $element['#ajax'] = [ 'callback' => [static::class, 'settingsAjax'], 'wrapper' => $main_form['#id'], 'trigger_as' => ['name' => 'handler_settings_submit'], 'wrapper' => 'field-combined', 'element' => $main_form['#array_parents'], ]; } Loading @@ -731,21 +731,14 @@ public static function formProcessMergeParent($element) { return $element; } /** * Ajax callback for the handler settings form. * * @see static::fieldSettingsForm() */ public static function settingsAjax($form, FormStateInterface $form_state) { return NestedArray::getValue($form, $form_state->getTriggeringElement()['#ajax']['element']); } /** * Submit handler for the non-JS case. * * @see static::fieldSettingsForm() */ public static function settingsAjaxSubmit($form, FormStateInterface $form_state) { $form_storage = &$form_state->getStorage(); unset($form_storage['default_value_widget']); $form_state->setRebuild(); } Loading core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php +5 −1 Original line number Diff line number Diff line Loading @@ -97,8 +97,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $entity = $items->getEntity(); $referenced_entities = $items->referencedEntities(); $selection_settings = []; // Append the match operation to the selection settings. $selection_settings = $this->getFieldSetting('handler_settings') + [ if ($this->getFieldSetting('handler_settings') !== NULL) { $selection_settings = $this->getFieldSetting('handler_settings'); } $selection_settings += [ 'match_operator' => $this->getSetting('match_operator'), 'match_limit' => $this->getSetting('match_limit'), ]; Loading core/modules/field/tests/src/Functional/EntityReference/EntityReferenceAdminTest.php +16 −0 Original line number Diff line number Diff line Loading @@ -209,6 +209,21 @@ public function testFieldAdminHandler() { 'field_storage[subform][cardinality]' => -1, ]; $this->submitForm($edit, 'Update settings'); // Assert that the target bundle handler setting is initially set. $this->assertSession()->checkboxChecked('settings[handler_settings][target_bundles][tags]'); // Change the handler to 'views'. $this->submitForm([ 'settings[handler]' => 'views', ], 'Change handler'); $this->assertSession()->fieldValueEquals('settings[handler]', 'views'); // Change handler back to 'default'. $this->submitForm([ 'settings[handler]' => 'default:taxonomy_term', ], 'Change handler'); // Assert that changing the handler resets the handler settings. $this->assertSession()->checkboxNotChecked('settings[handler_settings][target_bundles][tags]'); $term_name = $this->randomString(); $result = \Drupal::entityQuery('taxonomy_term') ->condition('name', $term_name) Loading @@ -217,6 +232,7 @@ public function testFieldAdminHandler() { ->execute(); $this->assertCount(0, $result, "No taxonomy terms exist with the name '$term_name'."); $edit = [ 'settings[handler_settings][target_bundles][tags]' => TRUE, // This must be set before new entities will be auto-created. 'settings[handler_settings][auto_create]' => 1, ]; Loading core/modules/field_ui/tests/src/FunctionalJavascript/DefaultValueWidgetTest.php 0 → 100644 +84 −0 Original line number Diff line number Diff line <?php namespace Drupal\Tests\field_ui\FunctionalJavascript; use Drupal\FunctionalJavascriptTests\WebDriverTestBase; use Drupal\Tests\field_ui\Traits\FieldUiJSTestTrait; use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait; /** * Tests the default value widget in Field UI. * * @group field_ui */ class DefaultValueWidgetTest extends WebDriverTestBase { use TaxonomyTestTrait; use FieldUiJSTestTrait; /** * {@inheritdoc} */ protected static $modules = [ 'node', 'field_ui', 'taxonomy', ]; /** * {@inheritdoc} */ protected $defaultTheme = 'stark'; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); // Create a Content type and two test nodes. $this->createContentType(['type' => 'test_content']); $user = $this->drupalCreateUser([ 'access content', 'administer content types', 'administer node fields', ]); $this->drupalLogin($user); } /** * Tests default value options on field config change. */ public function testDefaultValueOptionsForChangingBundles() { $vocab_1 = $this->createVocabulary(['name' => 'Colors']); $this->createTerm($vocab_1, ['name' => 'red']); $this->createTerm($vocab_1, ['name' => 'green']); $vocab_2 = $this->createVocabulary(['name' => 'Tags']); $this->createTerm($vocab_2, ['name' => 'random tag 1']); $this->createTerm($vocab_2, ['name' => 'random tag 2']); $field_name = 'test_field'; $this->fieldUIAddNewFieldJS('admin/structure/types/manage/test_content', $field_name, $field_name, 'entity_reference', FALSE); $page = $this->getSession()->getPage(); $page->findField('field_storage[subform][settings][target_type]')->selectOption('taxonomy_term'); $this->assertSession()->assertWaitOnAjaxRequest(); $page->findField('settings[handler_settings][target_bundles][' . $vocab_1->id() . ']')->check(); $this->assertSession()->assertWaitOnAjaxRequest(); $page->findField('set_default_value')->check(); $default_value_field = $page->findField('default_value_input[field_' . $field_name . '][0][target_id]'); $default_value_field->setValue('r'); $this->getSession()->getDriver()->keyDown($default_value_field->getXpath(), ' '); $this->assertSession()->waitOnAutocomplete(); // Check the autocomplete results. $results = $page->findAll('css', '.ui-autocomplete li'); $this->assertCount(2, $results); $this->assertSession()->elementTextNotContains('css', '.ui-autocomplete li', 'random tag 1'); $this->assertSession()->elementTextContains('css', '.ui-autocomplete li', 'green'); } } Loading
core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +5 −12 Original line number Diff line number Diff line Loading @@ -4,7 +4,6 @@ use Drupal\Component\Render\FormattableMarkup; use Drupal\Component\Utility\Html; use Drupal\Component\Utility\NestedArray; use Drupal\Core\Entity\ContentEntityStorageInterface; use Drupal\Core\Entity\EntityInterface; use Drupal\Component\Plugin\Exception\PluginNotFoundException; Loading Loading @@ -483,6 +482,7 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) { ]; $form['handler']['handler_submit'] = [ '#type' => 'submit', '#name' => 'handler_settings_submit', '#value' => $this->t('Change handler'), '#limit_validation_errors' => [], '#attributes' => [ Loading Loading @@ -705,8 +705,8 @@ public static function fieldSettingsAjaxProcess($form, FormStateInterface $form_ public static function fieldSettingsAjaxProcessElement(&$element, $main_form) { if (!empty($element['#ajax'])) { $element['#ajax'] = [ 'callback' => [static::class, 'settingsAjax'], 'wrapper' => $main_form['#id'], 'trigger_as' => ['name' => 'handler_settings_submit'], 'wrapper' => 'field-combined', 'element' => $main_form['#array_parents'], ]; } Loading @@ -731,21 +731,14 @@ public static function formProcessMergeParent($element) { return $element; } /** * Ajax callback for the handler settings form. * * @see static::fieldSettingsForm() */ public static function settingsAjax($form, FormStateInterface $form_state) { return NestedArray::getValue($form, $form_state->getTriggeringElement()['#ajax']['element']); } /** * Submit handler for the non-JS case. * * @see static::fieldSettingsForm() */ public static function settingsAjaxSubmit($form, FormStateInterface $form_state) { $form_storage = &$form_state->getStorage(); unset($form_storage['default_value_widget']); $form_state->setRebuild(); } Loading
core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php +5 −1 Original line number Diff line number Diff line Loading @@ -97,8 +97,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $entity = $items->getEntity(); $referenced_entities = $items->referencedEntities(); $selection_settings = []; // Append the match operation to the selection settings. $selection_settings = $this->getFieldSetting('handler_settings') + [ if ($this->getFieldSetting('handler_settings') !== NULL) { $selection_settings = $this->getFieldSetting('handler_settings'); } $selection_settings += [ 'match_operator' => $this->getSetting('match_operator'), 'match_limit' => $this->getSetting('match_limit'), ]; Loading
core/modules/field/tests/src/Functional/EntityReference/EntityReferenceAdminTest.php +16 −0 Original line number Diff line number Diff line Loading @@ -209,6 +209,21 @@ public function testFieldAdminHandler() { 'field_storage[subform][cardinality]' => -1, ]; $this->submitForm($edit, 'Update settings'); // Assert that the target bundle handler setting is initially set. $this->assertSession()->checkboxChecked('settings[handler_settings][target_bundles][tags]'); // Change the handler to 'views'. $this->submitForm([ 'settings[handler]' => 'views', ], 'Change handler'); $this->assertSession()->fieldValueEquals('settings[handler]', 'views'); // Change handler back to 'default'. $this->submitForm([ 'settings[handler]' => 'default:taxonomy_term', ], 'Change handler'); // Assert that changing the handler resets the handler settings. $this->assertSession()->checkboxNotChecked('settings[handler_settings][target_bundles][tags]'); $term_name = $this->randomString(); $result = \Drupal::entityQuery('taxonomy_term') ->condition('name', $term_name) Loading @@ -217,6 +232,7 @@ public function testFieldAdminHandler() { ->execute(); $this->assertCount(0, $result, "No taxonomy terms exist with the name '$term_name'."); $edit = [ 'settings[handler_settings][target_bundles][tags]' => TRUE, // This must be set before new entities will be auto-created. 'settings[handler_settings][auto_create]' => 1, ]; Loading
core/modules/field_ui/tests/src/FunctionalJavascript/DefaultValueWidgetTest.php 0 → 100644 +84 −0 Original line number Diff line number Diff line <?php namespace Drupal\Tests\field_ui\FunctionalJavascript; use Drupal\FunctionalJavascriptTests\WebDriverTestBase; use Drupal\Tests\field_ui\Traits\FieldUiJSTestTrait; use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait; /** * Tests the default value widget in Field UI. * * @group field_ui */ class DefaultValueWidgetTest extends WebDriverTestBase { use TaxonomyTestTrait; use FieldUiJSTestTrait; /** * {@inheritdoc} */ protected static $modules = [ 'node', 'field_ui', 'taxonomy', ]; /** * {@inheritdoc} */ protected $defaultTheme = 'stark'; /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); // Create a Content type and two test nodes. $this->createContentType(['type' => 'test_content']); $user = $this->drupalCreateUser([ 'access content', 'administer content types', 'administer node fields', ]); $this->drupalLogin($user); } /** * Tests default value options on field config change. */ public function testDefaultValueOptionsForChangingBundles() { $vocab_1 = $this->createVocabulary(['name' => 'Colors']); $this->createTerm($vocab_1, ['name' => 'red']); $this->createTerm($vocab_1, ['name' => 'green']); $vocab_2 = $this->createVocabulary(['name' => 'Tags']); $this->createTerm($vocab_2, ['name' => 'random tag 1']); $this->createTerm($vocab_2, ['name' => 'random tag 2']); $field_name = 'test_field'; $this->fieldUIAddNewFieldJS('admin/structure/types/manage/test_content', $field_name, $field_name, 'entity_reference', FALSE); $page = $this->getSession()->getPage(); $page->findField('field_storage[subform][settings][target_type]')->selectOption('taxonomy_term'); $this->assertSession()->assertWaitOnAjaxRequest(); $page->findField('settings[handler_settings][target_bundles][' . $vocab_1->id() . ']')->check(); $this->assertSession()->assertWaitOnAjaxRequest(); $page->findField('set_default_value')->check(); $default_value_field = $page->findField('default_value_input[field_' . $field_name . '][0][target_id]'); $default_value_field->setValue('r'); $this->getSession()->getDriver()->keyDown($default_value_field->getXpath(), ' '); $this->assertSession()->waitOnAutocomplete(); // Check the autocomplete results. $results = $page->findAll('css', '.ui-autocomplete li'); $this->assertCount(2, $results); $this->assertSession()->elementTextNotContains('css', '.ui-autocomplete li', 'random tag 1'); $this->assertSession()->elementTextContains('css', '.ui-autocomplete li', 'green'); } }