diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml index 81c03dbca0745d79ff4933e90796e52363201a68..8850d40ef7bebd052110103ccf023ce60cf6c389 100644 --- a/core/config/schema/core.entity.schema.yml +++ b/core/config/schema/core.entity.schema.yml @@ -234,6 +234,9 @@ field.widget.settings.entity_reference_autocomplete_tags: match_operator: type: string label: 'Autocomplete matching' + match_limit: + type: integer + label: 'Maximum number of autocomplete suggestions.' size: type: integer label: 'Size of textfield' @@ -248,6 +251,9 @@ field.widget.settings.entity_reference_autocomplete: match_operator: type: string label: 'Autocomplete matching' + match_limit: + type: integer + label: 'Maximum number of autocomplete suggestions.' size: type: integer label: 'Size of textfield' diff --git a/core/lib/Drupal/Core/Entity/EntityAutocompleteMatcher.php b/core/lib/Drupal/Core/Entity/EntityAutocompleteMatcher.php index 2cede4dffaa5717820a35b56c5142108c2f0666d..93a8539ced9b69108f4f845d74385745d0147b26 100644 --- a/core/lib/Drupal/Core/Entity/EntityAutocompleteMatcher.php +++ b/core/lib/Drupal/Core/Entity/EntityAutocompleteMatcher.php @@ -61,7 +61,8 @@ public function getMatches($target_type, $selection_handler, $selection_settings if (isset($string)) { // Get an array of matching entities. $match_operator = !empty($selection_settings['match_operator']) ? $selection_settings['match_operator'] : 'CONTAINS'; - $entity_labels = $handler->getReferenceableEntities($string, $match_operator, 10); + $match_limit = isset($selection_settings['match_limit']) ? (int) $selection_settings['match_limit'] : 10; + $entity_labels = $handler->getReferenceableEntities($string, $match_operator, $match_limit); // Loop through the entities and convert them into autocomplete output. foreach ($entity_labels as $values) { diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php index cea4ecb7e97df59b15da53d70b436a6d6991d7ee..af3c80a9b061ad95f8e5cd853ef5dc5b9b3f147b 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldWidget/EntityReferenceAutocompleteWidget.php @@ -28,6 +28,7 @@ class EntityReferenceAutocompleteWidget extends WidgetBase { public static function defaultSettings() { return [ 'match_operator' => 'CONTAINS', + 'match_limit' => 10, 'size' => 60, 'placeholder' => '', ] + parent::defaultSettings(); @@ -44,6 +45,13 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#options' => $this->getMatchOperatorOptions(), '#description' => t('Select the method used to collect autocomplete suggestions. Note that <em>Contains</em> can cause performance issues on sites with thousands of entities.'), ]; + $element['match_limit'] = [ + '#type' => 'number', + '#title' => $this->t('Number of results'), + '#default_value' => $this->getSetting('match_limit'), + '#min' => 0, + '#description' => $this->t('The number of suggestions that will be listed. Use <em>0</em> to remove the limit.'), + ]; $element['size'] = [ '#type' => 'number', '#title' => t('Size of textfield'), @@ -68,6 +76,8 @@ public function settingsSummary() { $operators = $this->getMatchOperatorOptions(); $summary[] = t('Autocomplete matching: @match_operator', ['@match_operator' => $operators[$this->getSetting('match_operator')]]); + $size = $this->getSetting('match_limit') ?: $this->t('unlimited'); + $summary[] = $this->t('Autocomplete suggestion list size: @size', ['@size' => $size]); $summary[] = t('Textfield size: @size', ['@size' => $this->getSetting('size')]); $placeholder = $this->getSetting('placeholder'); if (!empty($placeholder)) { @@ -88,7 +98,10 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen $referenced_entities = $items->referencedEntities(); // Append the match operation to the selection settings. - $selection_settings = $this->getFieldSetting('handler_settings') + ['match_operator' => $this->getSetting('match_operator')]; + $selection_settings = $this->getFieldSetting('handler_settings') + [ + 'match_operator' => $this->getSetting('match_operator'), + 'match_limit' => $this->getSetting('match_limit'), + ]; $element += [ '#type' => 'entity_autocomplete', diff --git a/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml b/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml index b65b723be8564351b6756be9536ae718fa333a26..4b7f304c27c27ee1b63fa90c2198030534bb3545 100644 --- a/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml +++ b/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml @@ -62,6 +62,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml b/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml index 3cc25603ee2074d8a149b4ff3d3f503234ff1eb5..2f87d23d595574eb543208b353d73aa9673b9cc7 100644 --- a/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml +++ b/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml @@ -77,6 +77,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/modules/jsonapi/tests/src/Functional/EntityFormDisplayTest.php b/core/modules/jsonapi/tests/src/Functional/EntityFormDisplayTest.php index b28efdb8fb06a3fe9445ba9425f8451b227748a5..73190d265555248192f1db97982c8d13a3cab81b 100644 --- a/core/modules/jsonapi/tests/src/Functional/EntityFormDisplayTest.php +++ b/core/modules/jsonapi/tests/src/Functional/EntityFormDisplayTest.php @@ -139,6 +139,7 @@ protected function getExpectedDocument() { 'weight' => 5, 'settings' => [ 'match_operator' => 'CONTAINS', + 'match_limit' => 10, 'size' => 60, 'placeholder' => '', ], diff --git a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_five.default.yml b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_five.default.yml index 8deaa648b7e42e31c1710e59b209ce2928930032..98206155d25b694ca44fecf23cbcd82a61aad17e 100644 --- a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_five.default.yml +++ b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_five.default.yml @@ -51,6 +51,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_four.default.yml b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_four.default.yml index 40d4d1bd31c01f5f161dc60d1ab197b998dd37d7..5303563d91d6c68d8969fddcc8d129f82a8428e5 100644 --- a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_four.default.yml +++ b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_four.default.yml @@ -62,6 +62,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_one.default.yml b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_one.default.yml index 212daf81879608a79d7d404be27ec4fc0611e9ac..2e07c3d2194f82722da8af0ca0cc12fdb5ecc979 100644 --- a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_one.default.yml +++ b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_one.default.yml @@ -36,6 +36,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_three.default.yml b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_three.default.yml index ea7248e2aa3e180f97708e6873ccc6989f57a8f8..c70d348c779a18498135b046406542754bb327fe 100644 --- a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_three.default.yml +++ b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_three.default.yml @@ -53,6 +53,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_two.default.yml b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_two.default.yml index fabd13b0297b24082152efa1374ad150e520a509..acc954e827eba502de3f1cc3b034ce9a8514773a 100644 --- a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_two.default.yml +++ b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.media.type_two.default.yml @@ -36,6 +36,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.node.basic_page.default.yml b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.node.basic_page.default.yml index 6df6518481a363d9359faf95b9eda1c9bb5fad60..0fd908e713eeff2e0d5e02fe8745ffd38aa00e3e 100644 --- a/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.node.basic_page.default.yml +++ b/core/modules/media_library/tests/modules/media_library_test/config/install/core.entity_form_display.node.basic_page.default.yml @@ -95,6 +95,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml b/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml index 1b703217676d3952bfb184f9314b85f5780730a8..aecc9590fd017ea0a4a1d9a235eb28980981e63d 100644 --- a/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml +++ b/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml @@ -25,6 +25,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/modules/system/system.module b/core/modules/system/system.module index dc1509ab9110938499019b781b6a7b4cfbe282ea..16337f54409f13c0cec436c7b98412d7804c5cd0 100644 --- a/core/modules/system/system.module +++ b/core/modules/system/system.module @@ -15,6 +15,8 @@ use Drupal\Core\Database\Query\AlterableInterface; use Drupal\Core\Extension\Dependency; use Drupal\Core\Extension\Extension; +use Drupal\Core\Entity\Display\EntityFormDisplayInterface; +use Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget; use Drupal\Core\File\Exception\FileException; use Drupal\Core\File\FileSystemInterface; use Drupal\Core\Form\FormStateInterface; @@ -1466,3 +1468,32 @@ function system_modules_uninstalled($modules) { } } } + +/** + * Implements hook_ENTITY_TYPE_presave() for entity_form_display entities. + * + * Provides a BC layer for modules providing old configurations. + * + * @todo Remove this hook in Drupal 9.0.x https://www.drupal.org/project/drupal/issues/3086388 + */ +function system_entity_form_display_presave(EntityFormDisplayInterface $display) { + /** @var \Drupal\Core\Field\WidgetPluginManager $field_widget_manager */ + $field_widget_manager = \Drupal::service('plugin.manager.field.widget'); + + foreach ($display->getComponents() as $field_name => $component) { + if (empty($component['type'])) { + continue; + } + + $plugin_definition = $field_widget_manager->getDefinition($component['type'], FALSE); + if (!is_a($plugin_definition['class'], EntityReferenceAutocompleteWidget::class, TRUE)) { + continue; + } + + if (!isset($component['settings']['match_limit'])) { + @trigger_error(sprintf('Any entity_reference_autocomplete component of an entity_form_display must have a match_limit setting. The %s field on the %s form display is missing it. This BC layer will be removed before 9.0.0. See https://www.drupal.org/node/2863188', $field_name, $display->id()), E_USER_DEPRECATED); + $component['settings']['match_limit'] = 10; + $display->setComponent($field_name, $component); + } + } +} diff --git a/core/modules/system/system.post_update.php b/core/modules/system/system.post_update.php index 5f6c9f766348690c86070205fa3a7bd620d8a5f9..114d289120226e0f8663c7664ea9cc2beb156452 100644 --- a/core/modules/system/system.post_update.php +++ b/core/modules/system/system.post_update.php @@ -10,6 +10,7 @@ use Drupal\Core\Entity\Display\EntityViewDisplayInterface; use Drupal\Core\Entity\Entity\EntityFormDisplay; use Drupal\Core\Entity\Entity\EntityViewDisplay; +use Drupal\Core\Field\Plugin\Field\FieldWidget\EntityReferenceAutocompleteWidget; /** * Re-save all configuration entities to recalculate dependencies. @@ -213,3 +214,29 @@ function system_post_update_clear_menu_cache() { function system_post_update_layout_plugin_schema_change() { // Empty post-update hook. } + +/** + * Populate the new 'match_limit' setting for the ER autocomplete widget. + */ +function system_post_update_entity_reference_autocomplete_match_limit(&$sandbox = NULL) { + $config_entity_updater = \Drupal::classResolver(ConfigEntityUpdater::class); + /** @var \Drupal\Core\Field\WidgetPluginManager $field_widget_manager */ + $field_widget_manager = \Drupal::service('plugin.manager.field.widget'); + + $callback = function (EntityDisplayInterface $display) use ($field_widget_manager) { + foreach ($display->getComponents() as $field_name => $component) { + if (empty($component['type'])) { + continue; + } + + $plugin_definition = $field_widget_manager->getDefinition($component['type'], FALSE); + if (is_a($plugin_definition['class'], EntityReferenceAutocompleteWidget::class, TRUE)) { + return TRUE; + } + } + + return FALSE; + }; + + $config_entity_updater->update($sandbox, 'entity_form_display', $callback); +} diff --git a/core/modules/system/tests/src/Functional/Update/EntityReferenceAutocompleteWidgetMatchLimitUpdateTest.php b/core/modules/system/tests/src/Functional/Update/EntityReferenceAutocompleteWidgetMatchLimitUpdateTest.php new file mode 100644 index 0000000000000000000000000000000000000000..fa196a88a40ea60a286baa186d56a7b17fad33b3 --- /dev/null +++ b/core/modules/system/tests/src/Functional/Update/EntityReferenceAutocompleteWidgetMatchLimitUpdateTest.php @@ -0,0 +1,44 @@ +<?php + +namespace Drupal\Tests\system\Functional\Update; + +use Drupal\Core\Entity\Entity\EntityFormDisplay; +use Drupal\FunctionalTests\Update\UpdatePathTestBase; + +/** + * Tests that the match_limit setting is added to entity_reference_autocomplete. + * + * @see system_post_update_entity_reference_autocomplete_match_limit() + * + * @group legacy + */ +class EntityReferenceAutocompleteWidgetMatchLimitUpdateTest extends UpdatePathTestBase { + + /** + * {@inheritdoc} + */ + protected function setDatabaseDumpFiles() { + $this->databaseDumpFiles = [ + __DIR__ . '/../../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz', + ]; + } + + /** + * Tests that the match_limit setting is added to the config. + * + * @expectedDeprecation Any entity_reference_autocomplete component of an entity_form_display must have a match_limit setting. The field_tags field on the node.article.default form display is missing it. This BC layer will be removed before 9.0.0. See https://www.drupal.org/node/2863188 + * @expectedDeprecation Any entity_reference_autocomplete component of an entity_form_display must have a match_limit setting. The uid field on the node.article.default form display is missing it. This BC layer will be removed before 9.0.0. See https://www.drupal.org/node/2863188 + */ + public function testViewsPostUpdateEntityLinkUrl() { + $display = EntityFormDisplay::load('node.article.default'); + $this->assertArrayNotHasKey('match_limit', $display->getComponent('field_tags')['settings']); + $this->assertArrayNotHasKey('match_limit', $display->getComponent('uid')['settings']); + + $this->runUpdates(); + + $display = EntityFormDisplay::load('node.article.default'); + $this->assertEquals(10, $display->getComponent('field_tags')['settings']['match_limit']); + $this->assertEquals(10, $display->getComponent('uid')['settings']['match_limit']); + } + +} diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml index a359bdf5a352f3ef6c23cf9a1ee918852f963baf..ac659d316055edf87df0c8c2ff6911789d8c7dd8 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml @@ -50,6 +50,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.document.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.document.default.yml index 489716bb1c896dc4784731b179457ff70c785bf5..971b5c28ebdca659624e9d068343e0d9f1b46468 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.document.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.document.default.yml @@ -50,6 +50,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml index 237009bd44821d4009b5c0ca7bd1c2e5c0e49064..3e83e1c38735a0ddd04942379dd1723b22f45f4c 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml @@ -52,6 +52,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml index baed30de3761ef429586d51e30572714e6f6b0dc..9ff0e4538269e17921039211afcfa315b70033f7 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml @@ -51,6 +51,7 @@ content: weight: 4 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml index 90fb03f73ba2744e9c590d3e6700b4653decdaf6..b9340255334a0eea8a382d471fe4d9b33ced1bed 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml @@ -50,6 +50,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml index 4e3d69e156effdbbb4c536df4b58f9e3f66b5c47..b3b36b6accc10c8df05984a4480a440f6ad1398d 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml @@ -48,6 +48,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } @@ -110,6 +111,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml index 2bd498a57783b9bffa02f4ee62c8ed568d6bf393..97fb4e243bb3d7f1f4539ba6ba7ee5d2f5cd3758 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml @@ -89,6 +89,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml index 3a62a517edaf922597383ddfda759304f1c523da..44b7859c0cacd2f09fcee4c0ef158baa89d9f8ea 100644 --- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml +++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml @@ -79,6 +79,7 @@ content: weight: 6 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } @@ -104,6 +105,7 @@ content: weight: 7 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } @@ -167,6 +169,7 @@ content: weight: 12 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml index 43c904fd2ace26f52714a28addb5f8f1950eb080..1f7102dd49ed5e223d5f5664d0682b6c88f40f73 100644 --- a/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml +++ b/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml @@ -54,6 +54,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } @@ -98,6 +99,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml index c4c7ef57537ce863a8314f2dd2eb5f8eea23ae8d..342988cbe27eb370e3098bd8c7889effb8a96d22 100644 --- a/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml +++ b/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml @@ -69,6 +69,7 @@ content: region: content settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' third_party_settings: { } diff --git a/core/profiles/standard/config/optional/core.entity_form_display.media.audio.default.yml b/core/profiles/standard/config/optional/core.entity_form_display.media.audio.default.yml index a30d8d24e8eccd25074e5bd7f7a84661541d2f01..f016c1ee47b57659d9916f9fb50ff17e3b5f7bfd 100644 --- a/core/profiles/standard/config/optional/core.entity_form_display.media.audio.default.yml +++ b/core/profiles/standard/config/optional/core.entity_form_display.media.audio.default.yml @@ -43,6 +43,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/standard/config/optional/core.entity_form_display.media.document.default.yml b/core/profiles/standard/config/optional/core.entity_form_display.media.document.default.yml index 1e58abd1ae848500fb7ecd6330b3b8a4d733cdd1..82cedc37e0cfa8bdf8ae472e1ddaac6fea4dfda2 100644 --- a/core/profiles/standard/config/optional/core.entity_form_display.media.document.default.yml +++ b/core/profiles/standard/config/optional/core.entity_form_display.media.document.default.yml @@ -36,6 +36,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/standard/config/optional/core.entity_form_display.media.image.default.yml b/core/profiles/standard/config/optional/core.entity_form_display.media.image.default.yml index 9184298ce04da148c2519b7df51c7ff2b7acd9e3..1203f94159987dc5c395ad16cd0b210590f4e14a 100644 --- a/core/profiles/standard/config/optional/core.entity_form_display.media.image.default.yml +++ b/core/profiles/standard/config/optional/core.entity_form_display.media.image.default.yml @@ -38,6 +38,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/standard/config/optional/core.entity_form_display.media.remote_video.default.yml b/core/profiles/standard/config/optional/core.entity_form_display.media.remote_video.default.yml index 4752e75274aca607d8ed33d07579262a6577412c..3fe271b4f73ac33db67e9217179da45319de0adb 100644 --- a/core/profiles/standard/config/optional/core.entity_form_display.media.remote_video.default.yml +++ b/core/profiles/standard/config/optional/core.entity_form_display.media.remote_video.default.yml @@ -44,6 +44,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/profiles/standard/config/optional/core.entity_form_display.media.video.default.yml b/core/profiles/standard/config/optional/core.entity_form_display.media.video.default.yml index a58d130bfb4a56955e2c91ceb169d2f7b58a8df9..f1001d6c7b7b59e01efb90f2e02dd1dcea8f58f0 100644 --- a/core/profiles/standard/config/optional/core.entity_form_display.media.video.default.yml +++ b/core/profiles/standard/config/optional/core.entity_form_display.media.video.default.yml @@ -43,6 +43,7 @@ content: weight: 5 settings: match_operator: CONTAINS + match_limit: 10 size: 60 placeholder: '' region: content diff --git a/core/tests/Drupal/FunctionalJavascriptTests/EntityReference/EntityReferenceAutocompleteWidgetTest.php b/core/tests/Drupal/FunctionalJavascriptTests/EntityReference/EntityReferenceAutocompleteWidgetTest.php index e1f580fce78151934b77ff95dbe453f12dc5fc7c..fe4c9cf6c6434757660c504465e8ff838e57b8c1 100644 --- a/core/tests/Drupal/FunctionalJavascriptTests/EntityReference/EntityReferenceAutocompleteWidgetTest.php +++ b/core/tests/Drupal/FunctionalJavascriptTests/EntityReference/EntityReferenceAutocompleteWidgetTest.php @@ -21,7 +21,7 @@ class EntityReferenceAutocompleteWidgetTest extends WebDriverTestBase { /** * {@inheritdoc} */ - public static $modules = ['node']; + public static $modules = ['node', 'field_ui']; /** * {@inheritdoc} @@ -51,7 +51,7 @@ public function testEntityReferenceAutocompleteWidget() { // Create an entity reference field and use the default 'CONTAINS' match // operator. $field_name = 'field_test'; - $this->createEntityReferenceField('node', 'page', $field_name, $field_name, 'node', 'default', ['target_bundles' => ['page']]); + $this->createEntityReferenceField('node', 'page', $field_name, $field_name, 'node', 'default', ['target_bundles' => ['page'], 'sort' => ['field' => 'title', 'direction' => 'DESC']]); $form_display = $display_repository->getFormDisplay('node', 'page'); $form_display->setComponent($field_name, [ 'type' => 'entity_reference_autocomplete', @@ -92,18 +92,70 @@ public function testEntityReferenceAutocompleteWidget() { ->save(); $this->drupalGet('node/add/page'); - $page = $this->getSession()->getPage(); - $autocomplete_field = $assert_session->waitForElement('css', '[name="' . $field_name . '[0][target_id]"].ui-autocomplete-input'); - $autocomplete_field->setValue('Test'); - $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), ' '); - $assert_session->waitOnAutocomplete(); + $this->doAutocomplete($field_name); $results = $page->findAll('css', '.ui-autocomplete li'); $this->assertCount(1, $results); $assert_session->pageTextContains('Test page'); $assert_session->pageTextNotContains('Page test'); + + // Change the size of the result set. + $display_repository->getFormDisplay('node', 'page') + ->setComponent($field_name, [ + 'type' => 'entity_reference_autocomplete', + 'settings' => [ + 'match_limit' => 1, + ], + ]) + ->save(); + + $this->drupalGet('node/add/page'); + + $this->doAutocomplete($field_name); + $results = $page->findAll('css', '.ui-autocomplete li'); + + $this->assertCount(1, $results); + $assert_session->pageTextContains('Test page'); + $assert_session->pageTextNotContains('Page test'); + + // Change the size of the result set via the UI. + $this->drupalLogin($this->createUser([ + 'access content', + 'administer content types', + 'administer node fields', + 'administer node form display', + 'create page content', + ] + )); + $this->drupalGet('/admin/structure/types/manage/page/form-display'); + $assert_session->pageTextContains('Autocomplete suggestion list size: 1'); + // Click on the widget settings button to open the widget settings form. + $this->drupalPostForm(NULL, [], $field_name . "_settings_edit"); + $this->assertSession()->waitForElement('css', sprintf('[name="fields[%s][settings_edit_form][settings][match_limit]"]', $field_name)); + $page->fillField('Number of results', 2); + $page->pressButton('Save'); + $assert_session->pageTextContains('Your settings have been saved.'); + $assert_session->pageTextContains('Autocomplete suggestion list size: 2'); + + $this->drupalGet('node/add/page'); + + $this->doAutocomplete($field_name); + $this->assertCount(2, $page->findAll('css', '.ui-autocomplete li')); + } + + /** + * Executes an autocomplete on a given field and waits for it to finish. + * + * @param string $field_name + * The field name. + */ + protected function doAutocomplete($field_name) { + $autocomplete_field = $this->getSession()->getPage()->findField($field_name . '[0][target_id]'); + $autocomplete_field->setValue('Test'); + $this->getSession()->getDriver()->keyDown($autocomplete_field->getXpath(), ' '); + $this->assertSession()->waitOnAutocomplete(); } } diff --git a/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php b/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php index a44534a31f0ca754dbabab5d2abff366f512bdca..78df2a75202561d263b03c6bb2489a00128f1649 100644 --- a/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php +++ b/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php @@ -109,6 +109,7 @@ protected function getExpectedNormalizedEntity() { 'weight' => 5, 'settings' => [ 'match_operator' => 'CONTAINS', + 'match_limit' => 10, 'size' => 60, 'placeholder' => '', ],