Як я можу програмно створити посилання на меню?


14

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

Відповіді:


24

Щоб автоматично створити пункт меню, його можна розмістити у hook_update_Nфайлі a 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
Суспільство_створення застаріло. Використовуйте \ Drupal :: entitTypeManager () -> отримати сховище ('меню') - створити ([]);
Eyal

1
Я думаю, що для правильного рішення слід використовувати ямли меню
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
Як додати елемент меню, що перекладається таким чином? Як і один пункт меню, але трьома мовами (різні назви пунктів меню та шляхи).
МіланГ

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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.