मैं प्रोग्रामिक रूप से मेनू लिंक कैसे बना सकता हूं?


14

मुझे Drupal 8 में मौजूदा मेनू (या नए) में कुछ लिंक जोड़ने की आवश्यकता है।

जवाबों:


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

1
Unit_create को हटा दिया गया है। \ Drupal का उपयोग करें: unitTypeManager () -> संग्रहण प्राप्त करें ('मेनू') - बनाएं ([]);
ईयेल

1
मुझे लगता है कि सही समाधान मेनू yamls का उपयोग करना चाहिए
ईयाल

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 (वैकल्पिक) है idmenu_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();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.