Câu trả lời:
Để tạo một mục menu tự động, mục này có thể được đặt trong hook_update_N
tệp mymodule.install
và sẽ chạy khi cơ sở dữ liệu được cập nhật (/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();
}
Bạn cũng có thể tạo toàn bộ Menu theo lập trình:
\Drupal::entityTypeManager()
->getStorage('menu')
->create([
'id' => 'menu_test',
'label' => 'Test menu',
'description' => 'Description text',
])
->save();
Nếu bạn muốn tạo các liên kết menu do mô-đun xác định, hãy thêm một cái gì đó giống như ví dụ này vào tệp custom_module.links.menu.yml của bạn :
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
(tùy chọn) là id
cột của cha mẹ trong menu_tree
bảng và route_name
là ID tuyến đường nội bộ của Drupal cho nơi bạn muốn liên kết với mục menu. Nó ở trong menu_tree
bàn như route_name
.
Xem Cung cấp liên kết menu do mô-đun xác định và Thêm liên kết menu để biết thêm chi tiết và tùy chọn.
Để mở rộng câu trả lời @skorzh và trả lời nhận xét từ @Matt, nếu bạn muốn lồng một mục menu bên trong một mục khác, bạn phải lấy id cha và đặt nó là 'cha mẹ'. Như một ví dụ mã này lồng các mục bên trong cấp cao nhất bằng cách sử dụng biến $top_level
bên dưới.
$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();