Bagaimana cara membuat tautan menu secara terprogram?


14

Saya perlu menambahkan beberapa tautan ke menu yang ada (atau ke yang baru) secara terprogram di Drupal 8.

Jawaban:


24

Untuk membuat item menu secara otomatis, ini dapat ditempatkan hook_update_Npada file mymodule.installdan akan berjalan ketika database diperbarui (/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();
}

Anda juga dapat membuat seluruh Menu secara terprogram:

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

1
entitas_create sudah usang. Gunakan \ Drupal :: entityTypeManager () -> get storage ('menu') - create ([]);
Eyal

1
Saya pikir solusi yang tepat harus menggunakan menu yamls
Eyal

3
di mana kait ini digunakan dengan benar?
Paul

11
Apakah boleh untuk memperluas jawabannya? Itu tidak menyatakan di mana kode ini dapat ditempatkan untuk menghasilkan item menu. Saya pikir orang-orang seperti saya akan berjuang untuk mengambil ini dan menerapkannya secara efektif.
cwiggo

6
Bagaimana Anda menambahkan tautan menu sebagai anak ke tautan induk?
Matt

8

Jika Anda ingin membuat tautan menu yang ditentukan modul, tambahkan sesuatu seperti contoh ini ke file custom_module.links.menu.yml Anda :

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(opsional) adalah idkolom induk dalam menu_treetabel, dan route_namemerupakan ID rute internal Drupal tempat Anda menginginkan item menu untuk ditautkan. Ada di menu_treemeja sebagai route_name.

Lihat Menyediakan tautan menu yang ditentukan modul dan Tambah tautan menu untuk detail dan opsi lebih lanjut.


3
Menu yamls hanya membantu jika Anda tahu terlebih dahulu item menu apa yang ingin Anda buat, pembuatan Programmatic mungkin tersimpan di node.
Duncanmoo

1
Bagaimana cara menambahkan item menu yang dapat diterjemahkan? Seperti satu item menu, tetapi dalam 3 bahasa (judul dan jalur item menu berbeda).
MilanG

1

Untuk memperluas pada @skorzh, jawab dan balas komentar dari @Matt, jika Anda ingin memasukkan item menu ke dalam item lain, Anda harus mendapatkan id induk dan menjadikannya sebagai 'induk'. Sebagai contoh, kode ini menyarangkan item di dalam level teratas menggunakan variabel di $top_levelbawah ini.

  $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();
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.