ฉันต้องเพิ่มลิงค์ไปยังเมนูที่มีอยู่ (หรือใหม่) โดยทางโปรแกรมใน Drupal 8
ฉันต้องเพิ่มลิงค์ไปยังเมนูที่มีอยู่ (หรือใหม่) โดยทางโปรแกรมใน Drupal 8
คำตอบ:
เพื่อสร้างรายการเมนูโดยอัตโนมัติสิ่งนี้สามารถวางใน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();
หากคุณต้องการสร้างลิงก์เมนูที่กำหนดโมดูลให้เพิ่มตัวอย่างเช่นนี้ในไฟล์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
เป็น ID เส้นทางภายในของ Drupal สำหรับที่คุณต้องการให้รายการเมนูเชื่อมโยง มันอยู่ในตารางเป็นmenu_tree
route_name
ดูที่การจัดเตรียมลิงก์เมนูที่กำหนดโมดูลและเพิ่มลิงก์เมนูสำหรับรายละเอียดและตัวเลือกเพิ่มเติม
หากต้องการขยายคำตอบ @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();