Drupal 7 में प्रोग्राम मेनू बनाएं


15

एक नौसिखिया सवाल लोग।

किसी भी विचार मैं कैसे प्रोग्राम मेनू बना सकते हैं? कहते हैं मेरे पास 3 अलग-अलग मेनू हैं जो मैं बनाना चाहता हूं। पहला मेनू शीर्ष लेख के बाईं ओर रखा जाएगा। दूसरा मेनू पहले मेनू के नीचे रखा जाएगा। तीसरा मेनू मुख्य नेविगेशन होगा।

क्या ये मेनू एक ही समूह के अंतर्गत हो सकते हैं? क्या इसे स्टाइल करने में समस्या होगी?

धन्यवाद

जवाबों:


25

यदि आप इसे अपडेट स्क्रिप्ट में करने का प्रयास कर रहे हैं, तो यह काम करना चाहिए:

$menus = array(
  array(
    'menu_name' => 'menu_test_one',
    'title' => 'My Menu One',
    'description' => 'Lorem Ipsum',
  ),
  array(
    'menu_name' => 'menu_test_two',
    'title' => 'My Menu Two',
    'description' => 'Lorem Ipsum',
  ),
  array(
    'menu_name' => 'menu_test_three',
    'title' => 'My Menu Three',
    'description' => 'Lorem Ipsum',
  ),
);

$links = array(
  array(
    array(
      'link_title' => 'Link1',
      'link_path' => 'http://yourdomain.com/link1',
      'menu_name' => 'menu_test_one',
      'weight' => 0,
      'expanded' => 0,
    ),
    array(
      'link_title' => 'Link2',
      'link_path' => 'http://yourdomain.com/link2',
      'menu_name' => 'menu_test_one',
      'weight' => 1,
      'expanded' => 0,
    ),
  ),
  array(
    array(
      'link_title' => 'Link3',
      'link_path' => 'http://yourdomain.com/link3',
      'menu_name' => 'menu_test_two',
      'weight' => 0,
      'expanded' => 0,
    ),
    array(
      'link_title' => 'Link4',
      'link_path' => 'http://yourdomain.com/link4',
      'menu_name' => 'menu_test_two',
      'weight' => 1,
      'expanded' => 0,
    ),
  ),
  array(
    array(
      'link_title' => 'Link5',
      'link_path' => 'http://yourdomain.com/link5',
      'menu_name' => 'menu_test_three',
      'weight' => 0,
      'expanded' => 0,
    ),
    array(
      'link_title' => 'Link6',
      'link_path' => 'http://yourdomain.com/link6',
      'menu_name' => 'menu_test_three',
      'weight' => 1,
      'expanded' => 0,
    ),
  ),
);

// Save menu group into menu_custom table
foreach ($menus as $menu) {
  // Look the table first if the data does exist
  $exists = db_query("SELECT title FROM {menu_custom} WHERE menu_name=:menu_name", array(':menu_name' => $menu['menu_name']))->fetchField();
  // Save the record if the data does not exist
  if (!$exists) {
    menu_save($menu);
  }
}

$item = ''; 
foreach ($links as $layer1) {
  foreach ($layer1 as $link) {
    // Build an array of menu link 
    $item = array(
      'link_path' => $link['link_path'],
      'link_title' => $link['link_title'],
      'menu_name' => $link['menu_name'],
      'weight' => $link['weight'],
      'expanded' => $link['expanded'],
    );
    // Look the table first if the data does exist
    $exists = db_query("SELECT mlid from {menu_links} WHERE link_title=:link_title AND link_path=:link_path", array(':link_title' =>  $link['link_title'], ':link_path' => $link['link_path']))->fetchField();
    // Save the record if the data does not exist
    if (!$exists) {  
      menu_link_save($item);
    }
  }
}

यदि मेरा दृष्टिकोण गलत है तो टिप्पणियाँ स्वागत योग्य हैं। धन्यवाद।


यह वही है जो मैं चाहता हूं। मुझे अपने कोड की कोशिश करने दो और बाद में प्रतिक्रिया दूंगा। साझा करने के लिए धन्यवाद
user8012

5
इसके बजाय $ चलाने के लिए db क्वेरी भविष्य के प्रमाण (लेकिन शायद थोड़ा धीमा) विधि का उपयोग सिर्फ अगर ((मेनू_लोड ($ मेनू ['menu_name')])) {menu_save ($ मेनू) होगा; }
बाला क्लार्क

अच्छा, अच्छा!
टायलर डरडेन

मेरा सुझाव एक क्वेरी के बजाय menu_get_menus () का उपयोग करना होगा । तब आप मेनू को एक var में सेव कर सकते हैं और बस एक कर सकते हैं if (!array_key_exists($menu, $menus)) {- menu_get_menus () केवल कस्टम मेनू में सिंगल परम FALSE जोड़कर।
क्रिश्चियन

1
इसके अलावा जब आप चेक करते हैं कि मेनू लिंक मौजूद है: // तालिका को पहले देखें यदि डेटा $ मौजूद है = ... आपको मेनू_नाम की भी जांच करने की आवश्यकता है क्योंकि एक ही लिंक संयोजन विभिन्न मेनू में हो सकता है।
हुगोनोफोर

4

यहाँ एक मेनू को आसानी से एक सरणी से पॉप्युलेट करने का एक तरीका है:

<?php
function populate_menu($links, $menu_name, $plid = 0) {
  foreach ($links as $link) {
    $ls = array(
      'menu_name' => $menu_name,
      'link_title' => $link['link_title'],
      'link_path' => $link['link_path'],
      'plid' => $plid,
    );
    $newpid = menu_link_save($ls);
    if (!empty($link['childs'])) {
      populate_menu($link['childs'], $menu_name, $newpid);
    }
  }
}


$items = array(
  array(
    'link_title' => 'Menu1',
    'link_path' => '<front>',
    'childs' => array(
      array(
        'link_title' => 'Sub Item 1',
        'link_path' => '<front>',
        'childs' => array(
          array(
            'link_title' => 'Link item 1',
            'link_path' => '<front>',
          ),
          array(
            'link_title' => 'Link item 2',
            'link_path' => '<front>',
          ),
        ),
      ),
      array(
        'link_title' => 'Sub Item 2',
        'link_path' => '<front>',
        'childs' => array(
          array(
            'link_title' => 'Link item',
            'link_path' => '<front>',
          ),
        ),
      ),
    ),
  ),
);
populate_menu($items, 'main-menu');

2

hook_menu()आप सभी को कस्टम मॉड्यूल में लागू करने की आवश्यकता है। कस्टम मॉड्यूल के निर्माण के लिए, इस दस्तावेज़ को देखें ।

//Define the menus in the function which goes in your MYMODULE.module file  
function MYMODULE_menu() {
  //the menu which will point to http://yoursite/first-menu
  $items['first-menu'] = array(
    'title' => 'First menu',  // will appear as the name of the link
    // Page callback, etc. need to be added here.
  );

  //the menu which will point to http://yoursite/second-menu
  $items['second-menu'] = array(
    'title' => 'Second menu',  // will appear as the name of the link
    // Page callback, etc. need to be added here.
  );

  //the menu which will point to http://yoursite/third-menu
  $items['third-menu'] = array(
    'title' => 'third menu',  // will appear as the name of the link
    // Page callback, etc. need to be added here.
  );

  return $items;
}

आप किसी भी क्षेत्र में मेनू को प्रिंट कर सकते हैं page.tpl.phpआप विषय की फ़ाइल में निम्नलिखित कोड जोड़ सकते हैं।

//add this line in <div id="header"></div> to print it in header.
<?php
$menu1 = menu_navigation_links('first-menu');
print theme('links__first_menu', array('links' => $menu1));

//print second menu just below first menu
$menu2 = menu_navigation_links('second-menu');
print theme('links__second_menu', array('links' => $menu1));
?>

आपको प्रिंट करने की आवश्यकता नहीं है third-menuक्योंकि डिफ़ॉल्ट रूप से यह नेविगेशन मेनू पर दिखाई देगा।


नोट: नेविगेशन मेनू बनाने और इसे एक पृष्ठ पर जोड़ने के लिए यह सबसे अच्छा अभ्यास नहीं है। हुक_मेनू () पृष्ठ कॉलबैक बनाने के लिए है न कि नेविगेशन मेनू बनाने के लिए। कृपया इस विषय को पढ़ें , जो अंतर बताता है। मैंने इसका उत्तर तब दिया जब मैंने द्रुपाल को सीखना शुरू कर दिया था और मैं इस उत्तर की अनुशंसा नहीं करता।


1
नेविगेशन मेनू बनाने और इसे एक पृष्ठ पर जोड़ने के लिए यह सबसे अच्छा अभ्यास नहीं है। हुक_मेनू () पृष्ठ कॉलबैक बनाने के लिए है न कि नेविगेशन मेनू बनाने के लिए। कृपया निम्नलिखित पढ़ें जो मतभेदों को बताते हैं। api.drupal.org/api/drupal/includes -menu.inc/group/menu/7
क्रिश्चियन

1
@ क्रिसियन मैंने इसका उत्तर देते समय ड्रुपल को सीखना शुरू कर दिया था; और जिस तरह से मैंने ड्रुपल को सीखने के लिए पसंद किया वह वास्तव में चीजों की कोशिश करके यहां सवालों के जवाब देने से था। मेरे पास ज्ञान के वर्तमान स्तर पर, मैं निश्चित रूप से इस प्रकार के उत्तर को भी वोट करूंगा; लेकिन मुझे वास्तव में जिस तरह से मैंने शुरुआत में सोचा था उस पर गर्व है :) मैं आपके द्वारा बताए गए तरीके और प्रदान किए गए लिंक की सराहना करता हूं।
अजीत

हे अजीत, सब अच्छा - मैं अक्सर नीचे जवाब मत देना। मैं बस उत्तर से पहले एक अपडेट जोड़ूंगा जो कहता है कि अब आप इस दृष्टिकोण का सुझाव नहीं देते हैं। उत्तर के लिए धन्यवाद।
क्रिश्चियन

मेरे पतन को हटा दिया है।
ईसाई

0

आप मेनू आयात मॉड्यूल भी आज़मा सकते हैं । यह मेनू परिनियोजन के लिए बहुत अच्छा और आसान है। आप अपनी वेबसाइट पर हाथों से मेनू बना सकते हैं और जेनसन का उपयोग कर सकते हैं। इसके अलावा आप गैर-मौजूदा पृष्ठों के लिए नोड बना सकते हैं।

निर्यात स्क्रिप्ट का उदाहरण यहां दिया गया है:

$menu_name = 'menu-footer-secondary-menu';

// Create menu if doesn't exist.
if (!menu_load($menu_name)) {
  $menu = array(
    'menu_name' => $menu_name,
    'title' => t('Footer secondary menu'),
    'description' => '',
  );
  menu_save($menu);
}

// Import menu links from JSON.
$menu_string = 'Impressum {"url":"node\/1","options":{"attributes":[]}}
Datenschutzbestimmungen {"url":"node\/2","options":{"attributes":[]}}
Nutzungsbedingungen {"url":"node\/3","options":{"attributes":[]}}
';

$options = array(
  //'link_to_content' => TRUE, // Look for existing nodes and link to them.
  'create_content' => TRUE, // Create new content (also if link_to_content not set).
  'remove_menu_items' => TRUE, // Removes current menu items.
  'node_type' => 'page',
  'node_body' => 'Page is in development...',
  'node_author' => 1,
  'node_status' => 1,
);

menu_import_string($menu_string, $menu_name, $options);

आप इस स्क्रिप्ट को hook_update_N () या अपडेट स्क्रिप्ट प्रोसेसर के साथ चला सकते हैं


0

एक मेनू ब्लॉक बनाने के लिए, अपने .install फ़ाइल में हुक_एनेबल () प्रकार लागू करें

function mymodule_enable() {
  $t = get_t();
  if (module_exists('menu')) {
    menu_save(array(
      'menu_name' => 'my-new-menu',
      'title' => $t('My New Menu'),
      'description' => $t('My Menu description'),
    ));
  }
 }

उसी। स्थापना फ़ाइल में, hook_uninstall () लागू करना।

function mymodule_uninstall() {
  if (module_exists('menu')) {
   if ($my_menu = menu_load('my-new-menu')) {
    menu_delete($my_menu);
  }
 }
}

हुक_मेनू () लागू करते समय आपकी .module फ़ाइल में अगला।

function mymodule_menu() {
  return array(
   'mypage' => array(
   'title' => 'My Page',        
   'description' => 'My Page description',    
   'page callback' => 'my_page_callback_func',
   'page arguments' => array(arg(0)),
   'access arguments' => array('access content'),
   'menu_name' => 'my-new-menu',
   'file' => 'my.new.page.inc',
   'file path' => drupal_get_path('module', 'mymodule') . '/includes',
  ),
 );     
}

.Inc फ़ाइल को वापस लेना है जिसमें mymodule फ़ोल्डर के भीतर रखा गया फ़ोल्डर शामिल है।

देखें devel अधिक जानकारी के लिए मॉड्यूल के devel.install और devel.module फ़ाइल।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.