프로그래밍 방식으로 메뉴 링크를 만들려면 어떻게합니까?


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 ()-> 저장소 ( 'menu')-create ([]);를 사용하십시오.
Eyal

1
올바른 해결책은 메뉴 yaml을 사용해야한다고 생각합니다
Eyal

3
이것은 어느 후크에서 올바르게 사용됩니까?
Paul

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에서 상위 항목 의 열이며 메뉴 항목을 연결하려는 Drupal의 내부 경로 ID입니다. 그것은에서의 표 .menu_treeroute_namemenu_treeroute_name

자세한 내용과 옵션은 모듈 정의 메뉴 링크 제공메뉴 링크 추가 를 참조하십시오.


3
메뉴 yaml은 작성하려는 메뉴 항목을 미리 알고있는 경우에만 도움이됩니다. 프로그램 작성은 노드 저장에있을 수 있습니다.
Duncanmoo

1
번역 가능한 메뉴 항목을 어떻게 추가합니까? 하나의 메뉴 항목과 같지만 3 가지 언어 (다른 메뉴 항목 제목 및 경로)
MilanG

1

@skorzh 답변을 확장하고 @Matt의 의견에 답장하려면 메뉴 항목을 다른 항목 안에 중첩하려면 부모 ID를 가져 와서 'parent'로 설정해야합니다. 예를 들어이 코드는 $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.