diff --git a/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php b/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php index e1b1c2a8f5716df4f0dc728b89f5aff632169b89..937491f336ee4eb3958404b0081a7470587f60f8 100644 --- a/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php +++ b/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php @@ -175,6 +175,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#element_validate' => [[get_called_class(), 'validateUriElement']], '#maxlength' => 2048, '#required' => $element['#required'], + '#link_type' => $this->getFieldSetting('link_type'), ]; // If the field is configured to support internal links, it cannot use the diff --git a/core/modules/link/src/Tests/LinkFieldTest.php b/core/modules/link/src/Tests/LinkFieldTest.php index 9e2f433e7a66cfc012ed6ebe1022d2c812867282..0b034d177653da10ef24e64707783c7b4c693613 100644 --- a/core/modules/link/src/Tests/LinkFieldTest.php +++ b/core/modules/link/src/Tests/LinkFieldTest.php @@ -609,6 +609,49 @@ public function testLinkSeparateFormatter() { } } + /** + * Test '#link_type' property exists on 'link_default' widget. + * + * Make sure the 'link_default' widget exposes a '#link_type' property on + * its element. Modules can use it to understand if a text form element is + * a link and also which LinkItemInterface::LINK_* is (EXTERNAL, GENERIC, + * INTERNAL). + */ + public function testLinkTypeOnLinkWidget() { + + $link_type = LinkItemInterface::LINK_EXTERNAL; + $field_name = Unicode::strtolower($this->randomMachineName()); + + // Create a field with settings to validate. + $this->fieldStorage = FieldStorageConfig::create([ + 'field_name' => $field_name, + 'entity_type' => 'entity_test', + 'type' => 'link', + 'cardinality' => 1, + ]); + $this->fieldStorage->save(); + FieldConfig::create([ + 'field_storage' => $this->fieldStorage, + 'label' => 'Read more about this entity', + 'bundle' => 'entity_test', + 'settings' => [ + 'title' => DRUPAL_OPTIONAL, + 'link_type' => $link_type, + ], + ])->save(); + + $this->container->get('entity.manager') + ->getStorage('entity_form_display') + ->load('entity_test.entity_test.default') + ->setComponent($field_name, [ + 'type' => 'link_default', + ]) + ->save(); + + $form = \Drupal::service('entity.form_builder')->getForm(EntityTest::create()); + $this->assertEqual($form[$field_name]['widget'][0]['uri']['#link_type'], $link_type); + } + /** * Renders a test_entity and sets the output in the internal browser. *