Làm cách nào để tạo liên kết menu theo chương trình?


14

Tôi cần thêm một số liên kết vào menu hiện có (hoặc mới) theo chương trình trong Drupal 8.

Câu trả lời:


24

Để tạo một mục menu tự động, mục này có thể được đặt trong hook_update_Ntệp mymodule.installvà 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();

1
entity_create không được dùng nữa. Sử dụng \ Drupal :: entityTypeManager () -> get Storage ('menu') - create ([]);
Mắt

1
Tôi nghĩ rằng giải pháp chính xác nên sử dụng thực đơn yamls
Eyal

3
Cái nào được sử dụng đúng cách?
Paul

11
Nó sẽ ổn để mở rộng câu trả lời? Nó không nêu rõ nơi mã này có thể được đặt để tạo các mục menu. Tôi nghĩ những người như tôi sẽ đấu tranh để có được điều này và thực hiện nó một cách hiệu quả.
cwiggo

6
Làm thế nào bạn có thể thêm một liên kết menu khi còn nhỏ vào một liên kết cha mẹ?
Matt

8

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à idcột của cha mẹ trong menu_treebảng và route_namelà 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_treebàn như route_name.

Xem Cung cấp liên kết menu do mô-đun xác địnhThêm liên kết menu để biết thêm chi tiết và tùy chọn.


3
Menu yamls chỉ giúp nếu bạn biết trước những mục menu nào bạn muốn tạo, việc tạo lập trình có thể được lưu trên nút.
Duncanmoo

1
Làm thế nào để thêm mục menu dịch theo cách đó? Giống như một mục menu, nhưng trong 3 ngôn ngữ (tiêu đề và đường dẫn mục menu khác nhau).
MilanG

1

Để 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_levelbê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();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.