ฉันจะสร้างลิงค์เมนูโดยทางโปรแกรมได้อย่างไร


14

ฉันต้องเพิ่มลิงค์ไปยังเมนูที่มีอยู่ (หรือใหม่) โดยทางโปรแกรมใน Drupal 8

คำตอบ:


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
entity_create เลิกใช้แล้ว ใช้ \ Drupal :: entityTypeManager () -> รับพื้นที่เก็บข้อมูล ('เมนู') - สร้าง ([]);
Eyal

1
ฉันคิดว่าวิธีแก้ปัญหาที่ถูกต้องควรใช้เมนู yamls
Eyal

3
ใช้ตะขอชนิดใดในการใช้งานอย่างถูกต้อง
พอล

11
มันจะโอเคที่จะขยายคำตอบหรือไม่? ไม่ได้ระบุรหัสที่สามารถวางเพื่อสร้างรายการเมนู ฉันคิดว่าคนอย่างฉันจะดิ้นรนเพื่อให้ได้สิ่งนี้และนำไปใช้อย่างมีประสิทธิภาพ
cwiggo

6
คุณจะเพิ่มลิงค์เมนูเป็นเด็กในลิงก์ผู้ปกครองได้อย่างไร
Matt

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เป็น ID เส้นทางภายในของ Drupal สำหรับที่คุณต้องการให้รายการเมนูเชื่อมโยง มันอยู่ในตารางเป็นmenu_treeroute_name

ดูที่การจัดเตรียมลิงก์เมนูที่กำหนดโมดูลและเพิ่มลิงก์เมนูสำหรับรายละเอียดและตัวเลือกเพิ่มเติม


3
เมนู yamls ช่วยได้เฉพาะเมื่อคุณรู้ล่วงหน้าว่ารายการเมนูใดที่คุณต้องการสร้างการสร้างแบบเป็นโปรแกรมอาจอยู่ในการบันทึกของโหนด
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();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.