Menü bağlantılarını programlı olarak nasıl oluştururum?


14

Drupal 8'de programlı olarak mevcut menüye (veya yeni) bazı bağlantılar eklemem gerekiyor.

Yanıtlar:


24

Otomatik olarak bir menü öğesi oluşturmak için bu hook_update_Ndosya üzerine bir yerleştirilebilir mymodule.installve veritabanı güncellendiğinde (/update.php) çalışır:

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();
}

Ayrıca bir Menünün tamamını programlı olarak oluşturabilirsiniz:

\Drupal::entityTypeManager()
  ->getStorage('menu')
  ->create([
    'id' => 'menu_test',
    'label' => 'Test menu',
    'description' => 'Description text',
  ])
  ->save();

1
entity_create kullanımdan kaldırıldı. \ Drupal :: entityTypeManager () -> depolamayı al ('menü') - create ([]);
— Eyal

1
Bence doğru çözüm menü yamls
— Eyal

3
bu hangi kancada doğru kullanılır?
— Paul

11
Cevabı genişletmek uygun olur mu? Menü öğelerini oluşturmak için bu kodun nereye yerleştirilebileceğini belirtmez. Benim gibi insanlar bunu almak ve etkili bir şekilde uygulamak için mücadele edeceklerdir.
— cwiggo

6
Bir üst bağlantıya alt öğe olarak menü bağlantısını nasıl eklersiniz?
— Matt

8

Modül tanımlı menü bağlantıları oluşturmak istiyorsanız custom_module.links.menu.yml dosyanıza bu örnek gibi bir şey ekleyin :

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(isteğe bağlı), tablodaki idüst öğenin sütunudur menu_treeve route_nameDrupal'ın menü öğesinin bağlanmasını istediğiniz yerdeki dahili rota kimliğidir. Bu öyle menu_treeolarak masaya route_name.

Daha fazla ayrıntı ve seçenek için Modül tanımlı menü bağlantıları sağlama ve Menü bağlantısı ekleme konusuna bakın .


3
Menü yatları yalnızca hangi menü öğelerini oluşturmak istediğinizi önceden biliyorsanız yardımcı olur, Programlı oluşturma düğüm kaydetme olabilir.
— Duncanmoo

1
Çevrilebilir menü öğesi bu şekilde nasıl eklenir? Bir menü öğesi gibi, ancak 3 dilde (farklı menü öğesi başlıkları ve yolları).
— MilanG

1

@Skorzh cevabını genişletmek ve @Matt'ın yorumuna cevap vermek için, bir menü öğesini başka bir içine yerleştirmek istiyorsanız, üst kimliği almanız ve 'üst' olarak ayarlamanız gerekir. Örnek olarak bu kod, $top_levelaşağıdaki değişkeni kullanarak öğeyi en üst seviyenin içine yerleştirir .

  $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();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.