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.