Как мне создать ссылки меню программно?

14

Мне нужно добавить некоторые ссылки на существующее меню (или на новое) программно в Drupal 8.

skorzh
источник

Ответы:

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();
skorzh
источник
1
entity_create устарела. Используйте \ Drupal :: entityTypeManager () -> получить хранилище ('меню') - создать ([]);
Эял
1
Я думаю, что правильное решение должно использовать меню yamls
Eyal
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столбец родительского элемента в menu_treeтаблице, а route_nameтакже внутренний идентификатор маршрута Drupal, для которого вы хотите, чтобы пункт меню имел ссылку. Это в menu_treeтаблице как route_name.

См. Предоставление модульных ссылок меню и Добавить ссылку меню для более подробной информации и опций.

Колан
источник
3
Помехи меню помогают только в том случае, если вы заранее знаете, какие пункты меню вы хотите создать. Создание программы может быть сохранено на узле.
Дунканму
1
Как добавить переводимый пункт меню таким образом? Как один пункт меню, но на 3 языках (разные названия пунктов меню и пути).
МиланГ
1

Чтобы расширить @skorzh ответить и ответить на комментарий от @Matt, если вы хотите вложить элемент меню в другой, вы должны получить родительский идентификатор и установить его как «родительский». В качестве примера этот код вкладывает элемент в верхний уровень, используя переменную $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();
wranvaud
источник