如何以编程方式创建菜单链接?


14

我需要在Drupal 8中以编程方式向现有菜单(或新菜单)添加一些链接。

Answers:


24

为了自动创建菜单项,可以将其放置在hook_update_N文件中的位置,mymodule.install并在数据库更新(/update.php)时运行:

use Drupal\menu_link_content\Entity\MenuLinkContent;
$items = array(
  '1' => 'Menuitem 1',
  '2' => 'Menuitem 2',
  '3' => 'Menuitem 3'
);

foreach($items as $nid => $title) {
  $menu_link = MenuLinkContent::create([
    'title' => $title,
    'link' => ['uri' => 'internal:/node/' . $nid],
    'menu_name' => 'main',
    'expanded' => TRUE,
  ]);
  $menu_link->save();
}

您还可以通过编程方式创建整个菜单:

\Drupal::entityTypeManager()
  ->getStorage('menu')
  ->create([
    'id' => 'menu_test',
    'label' => 'Test menu',
    'description' => 'Description text',
  ])
  ->save();

1
实体_创建已弃用。使用\ Drupal :: entityTypeManager()-> get storage('menu')-create([]);
2016年

1
我认为正确的解决方案应使用菜单Yamls
Eyal

3
正确使用哪个挂钩?
保罗

11
扩大答案可以吗?它没有说明可以在何处放置此代码以生成菜单项。我认为像我这样的人将很难接受并有效实施它。
cwiggo

6
您如何将菜单链接作为子链接添加到父链接?
马特

8

如果要创建模块定义的菜单链接,请将类似以下示例的内容添加到custom_module.links.menu.yml文件中:

custom_module.admin_item_1:
  title: 'New Admin Item 1'
  parent: system.admin
  description: 'Description of link goes here.'
  route_name: view.some_view_id.page_1

parent(可选)是表中id父级的menu_tree列,并且route_name是您希望菜单项链接到的位置的Drupal的内部路由ID。在menu_tree表中为route_name

有关更多详细信息和选项,请参阅提供模块定义的菜单链接添加菜单链接


3
菜单Yaml仅在事先知道要创建哪些菜单项时才有帮助,程序化创建可能在节点保存中。
Duncanmoo

1
如何以这种方式添加可翻译菜单项?类似于一个菜单项,但使用3种语言(不同的菜单项标题和路径)。
MilanG

1

要扩展@skorzh答案并回复@Matt的评论,如果要将菜单项嵌套在另一个菜单项中,则必须获取父ID并将其设置为“父”。作为示例,此代码使用以下变量将商品嵌套在顶层内$top_level

  $my_menu = \Drupal::entityTypeManager()->getStorage('menu_link_content')
    ->loadByProperties(['menu_name' => 'my-menu-name']);
  foreach ($my_menu as $menu_item) {
    $parent_id = $menu_item->getParentId();
    if (!empty($parent_id) {
      $top_level = $parent_id;
      break;
    }
  }
  $menu_link = MenuLinkContent::create([
    'title' => 'My menu link title',
    'link' => ['uri' => 'internal:/my/path'],
    'menu_name' => 'my-menu-name',
    'parent' => $top_level,
    'expanded' => TRUE,
    'weight' => 0,
  ]);
  $menu_link->save();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.