diff -u b/src/Plugin/Field/FieldFormatter/MenuLinkFormatter.php b/src/Plugin/Field/FieldFormatter/MenuLinkFormatter.php --- b/src/Plugin/Field/FieldFormatter/MenuLinkFormatter.php +++ b/src/Plugin/Field/FieldFormatter/MenuLinkFormatter.php @@ -5,7 +5,7 @@ use Drupal\Core\Field\FieldItemListInterface; use Drupal\Core\Field\FormatterBase; use Drupal\Core\Link; -use Drupal\Core\Url; +use Drupal\Component\Render\HtmlEscapedText; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Menu\MenuLinkManagerInterface; use Drupal\Core\Field\FieldDefinitionInterface; @@ -118,13 +118,12 @@ $id = $items[$delta]->getMenuPluginId(); $link = $this->menuLinkManager->createInstance($id); if ($this->getSetting('link_to_target')) { - $url = $link->getUrlObject(); + $elements[$delta] = Link::fromTextAndUrl($link->getTitle(), $link->getUrlObject())->toRenderable(); } else { // Set URL to none if we don't want to link to the menu link target. - $url = new Url(''); + $elements[$delta] = ['#markup' => new HtmlEscapedText($link->getTitle())]; } - $elements[$delta] = Link::fromTextAndUrl($link->getTitle(), $url)->toRenderable(); } return $elements; } only in patch2: unchanged: --- a/config/schema/menu_link.schema.yml +++ b/config/schema/menu_link.schema.yml @@ -1,3 +1,22 @@ +field.formatter.settings.menu_link: + type: mapping + label: 'Menu link formatter settings' + mapping: + link_to_target: + type: boolean + label: 'Enable link' + +field.formatter.settings.menu_link_breadcrumb: + type: mapping + label: 'Menu link breadcrumb formatter settings' + mapping: + link_to_target: + type: boolean + label: 'Enable links' + parents_only: + type: boolean + label: 'Only show the parents of the menu link' + field.storage_settings.menu_link: type: mapping label: 'Menu link settings' only in patch2: unchanged: --- /dev/null +++ b/tests/src/Kernel/Formatter/MenuLinkFormatterTest.php @@ -0,0 +1,129 @@ +installEntitySchema('user'); + $this->installEntitySchema('entity_test_mul'); + + FieldStorageConfig::create([ + 'field_name' => 'field_menu_link', + 'entity_type' => 'entity_test_mul', + 'type' => 'menu_link', + ])->save(); + + FieldConfig::create([ + 'field_name' => 'field_menu_link', + 'entity_type' => 'entity_test_mul', + 'bundle' => 'entity_test_mul', + ])->save(); + + } + + /** + * Tests the menu_link and menu_link_breadcrumb field formatters. + */ + public function testMenuLinkFormatters() { + $entity_test_mul = EntityTestMul::create([ + 'type' => 'entity_test_mul', + 'name' => 'test', + 'field_menu_link' => [ + 'menu_name' => 'test_menu', + 'title' => 'test title 1', + 'description' => 'test description', + ], + ]); + + /** @var \Drupal\Core\Menu\MenuLinkTree $menu_tree */ + $menu_tree = \Drupal::service('menu.link_tree'); + $parameters = new MenuTreeParameters(); + $parameters->addCondition('title', 'test title 1'); + $entity_test_mul->save(); + $result = $menu_tree->load('test_menu', $parameters); + $menu_link = reset($result); + // Add another entity as a child of the first one. + $entity_test_mul2 = EntityTestMul::create([ + 'type' => 'entity_test_mul', + 'name' => 'test', + 'field_menu_link' => [ + 'menu_name' => 'test_menu', + 'parent' => $menu_link->link->getPluginId(), + 'title' => 'test title 2', + 'description' => 'test description 2', + ], + ]); + $entity_test_mul2->save(); + + // Test that the menu_link formatter outputs plain text. + $content = $this->renderLink($entity_test_mul2, 'menu_link', ['link_to_target' => FALSE]); + $this->assertRaw('
test title 2
', $content); + + // Test that the menu_link formatter outputs a link. + $content2 = $this->renderLink($entity_test_mul2, 'menu_link', ['link_to_target' => TRUE]); + $this->assertRaw('
test title 2
', $content2); + + // Test that the breadcrumb formatter outputs links. + $content3 = $this->renderLink($entity_test_mul2, 'menu_link_breadcrumb', ['link_to_target' => TRUE]); + $this->assertRaw('test title 1', $content3); + $this->assertRaw('test title 2', $content3); + + // Test that the breadcrumb formatter outputs plain text. + $content4 = $this->renderLink($entity_test_mul2, 'menu_link_breadcrumb', ['link_to_target' => FALSE]); + $this->assertRaw('test title 1', $content4); + $this->assertRaw('test title 2', $content4); + $this->assertNoRaw('test title 1', $content3); + $this->assertNoRaw('test title 2', $content3); + + // Test that we skip the last element when parents_only is enabled. + $content5 = $this->renderLink($entity_test_mul2, 'menu_link_breadcrumb', ['link_to_target' => FALSE, 'parents_only' => TRUE]); + $this->assertRaw('test title 1', $content5); + $this->assertNoRaw('test title 2', $content5); + } + + /** + * Renders a menu link field. + * + * @param $entity + * The entity to render the link for. + * @param string $type + * The ID of the field formatter. + * @param string $settings + * The field formatter settings. + * + * @return string + * The rendered output. + */ + protected function renderLink($entity, $type, $settings) { + $display = entity_get_display('entity_test_mul', 'entity_test_mul', 'default') + ->setComponent('field_menu_link', [ + 'type' => $type, + 'settings' => $settings, + ]); + $content = $display->build($entity); + return $this->render($content); + } + +}