web-dev-qa-db-ja.com

プログラムでDrupal 8に新しいメニューを作成します

カスタムモジュールを使用して、プログラムでDrupal 8に新しいメニューを作成できますか?

カスタムモジュールを作成しています。モジュールの要件の1つは、Structure > Menusの下に新しいメニューを作成することです。

ほとんどのチュートリアルでは、既存のメニューにメニューリンクを追加する方法を説明しています。たとえば、 メニューリンクの作成メニューリンクの追加 などです。

要するに、最終結果が画像の"User Account Menu"の下のメニューになるような方法が必要です。それから、上記のチュートリアルを使用して、メニューリンクを追加できます。

ありがとう。

enter image description here

8
Akshay Khot

メニューは設定です。 <module_root>/config/install/system.menu.foo.ymlという名前のファイルをコードベースに追加することで、モジュールに1つ含めることができます(fooを目的のメニューIDに置き換えます)。

ファイルの内容は、コアシステムモジュールによってインストールされた同じ構成の1つに似たものになります。

langcode: en
status: true
dependencies: {  }
id: foo
label: 'Foo menu'
description: 'Links related to foo'
locked: true

モジュールが(再)インストールされると、メニューが作成されます。

hook_installまたは類似のAPIを技術的に使用することもできます。

$menu = \Drupal::entityTypeManager()->getStorage('menu')
  ->create([
    'langcode' => 'en',
    'status' => TRUE,
    ...
  ]);

しかし、ymlメソッドは少しすっきりしており、推奨されていると思います(ただし、現在ソースを見つけることができません)。

余談ですが、メニューはアルファベット順にリストされています。メニューを変更するのは簡単ではないと思います。メニューには相互に関連するウェイトの概念がないため、リストの一番下にあるメニューが本当に必要な場合は、どういうわけかそれを回避する必要があります。

6
Clive