プログラムでメニューリンクを作成するにはどうすればよいですか?


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()-> get storage( 'menu')-create([]);を使用します。
エアル

1
私は、正しい解決策は、メニューyamlsを使用する必要があることだと思う
エヤル

3
これはどのフックで適切に使用されていますか?
ポール

11
答えを広げても大丈夫でしょうか?メニュー項目を生成するためにこのコードを配置できる場所は記載されていません。私のような人はこれを受け入れて効果的に実装するのに苦労すると思います。
cwiggo

6
メニューリンクを子として親リンクにどのように追加しますか?
マット

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は、作成するメニュー項目を事前に知っている場合にのみ役立ちます。プログラムによる作成はノードの保存時に行われます。
ダンカンムー

1
翻訳可能なメニュー項目をそのように追加する方法は?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.