TransWikia.com

How to define an internal link as parent in mymodule.links.menu.yml?

Drupal Answers Asked on December 24, 2021

How do I create a menu link programmatically to a node that I can use as a parent for other links?

In MYMODULE.links.module, I defined some links for my navbar:

MYMODULE.parent-fruits:
  title: 'Fruits'
  url: internal:/fruits
  weight: 0
  menu_name: food
MYMODULE.fruits-apple:
  title: 'Apple'
  parent: MYMODULE.parent-fruits
  route_name: view.fruits.apple
  weight: 5
  menu_name: food
MYMODULE.parent-vegetables:
  route_name: view.vegetables.page-main
  weight: 10
  menu_name: food
MYMODULE.vegetables-asparagus:
  parent: MYMODULE.parent-vegetables
  title: 'Asparagus'
  url: internal:/admin/structure/taxonomy/manage/card_group_private/add
  weight: 5
  menu_name: food

In this case, I expect to have a menu that looks like this:

  • Fruits (child-> Apple)
  • Vegetables (child-> asparagus)

When I go to the parent page, the link to the child should appear in the navbar menu (the parent tree should be expanded).

But what I actually get is:

  • Fruits (no children)
  • Vegetables (child-> asparagus)

The problem is caused by defining the menu link with url instead of route_name. I know this because when I change the parent of fruits-apple to parent: MYMODULE.parent-vegetables, then I see Apple as a child of Vegetables.

When I remove parent from Apple, then it appears in the menu (without a parent), so I know the link is defined correctly.

I can also create the Fruits / Apple links in the menu UI, and those work correctly.

Regarding parent: the documentation says this:

Determining the parent menu_link name can be a little tricky at first.
If you know the path of the parent menu item, you would need to search
for it in all available *.routing.yml files (most text editors and
IDEs should allow you to search all files in a project) and find the
route name for that path. Then, you would need to search for the route
name in all available *.links.menu.yml files. The menu_link whose
route_name matches is your link. Alternatively, if you know which
module is defining the parent menu link (or one of the parent menu
link’s children), you can go straight to that module and perform your
search.

Since these are node links, I checked node.routing.yml in the core node module, but I couldn’t find the route to node pages.

So: how do I create a menu link programmatically to a node that I can use as a parent for other links?

One Answer

I think changing from url to route_name is the solution, you normally use url only for external links.

You don't find entity routes in static yml files because they are created dynamically. You could use the Devel module and visit

/devel/routes

or from the command line with Drupal Console:

drupal debug:router

See https://drupalconsole.com/docs/en/commands/debug-router

Then when you have found the route name you have to add the entity id as route parameter.

Example:

mymodule.links.menu.yml

mymodule.node7:
  title: 'Node 7'
  route_name: 'entity.node.canonical'
  route_parameters: { node: '7' }

Answered by 4k4 on December 24, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP