2010-07-02 6 views
5

जब मैं ड्रूपल में पृष्ठ पर नोड जोड़ता हूं तो क्या मैं स्वचालित रूप से मेनू आइटम जोड़ सकता हूं?Drupal: नए नोड्स जोड़े जाने पर स्वचालित रूप से मेनू आइटम जोड़ें

दूसरे शब्दों में, क्या मैं एक मेनू माता-पिता को नोड सामग्री-प्रकार के साथ जोड़ सकता हूं, और फिर नए नोड जोड़े जाने पर स्वचालित रूप से बच्चों को जोड़ सकता हूं?

धन्यवाद

उत्तर

1

हां।

मुझे यकीन है कि मॉड्यूल ऐसा कुछ करने के लिए करता है, लेकिन आप अपना खुद का निर्माण भी कर सकते हैं।

इसके बारे में आप दो तरीकों से जा सकते हैं।

आप अपने इच्छित आइटमों के लिए क्वेरी करने के लिए hook_menu() का उपयोग कर सकते हैं और सही मेनू संरचना वापस कर सकते हैं। आपको यह भी सुनिश्चित करना होगा कि hook_nodeapi() का उपयोग करके मेनू कैश को नोड पर पुनर्निर्मित किया जाए। के बारे में यह क्यों एक बुरा विचार

Alternitivly आप hook_nodeapi() इस्तेमाल कर सकते हैं menu_link_save() के साथ कस्टम मेनू आइटम जोड़ने के लिए है नीचे Henricks 'टिप्पणी देखें।

संपादित

hook_menu मेनू आइटम की एक सरणी वापस आ जाएगी, अक्सर इन सुंदर स्थिर हैं लेकिन इन सरणियों गतिशील रूप से उत्पन्न किया जा रहा है कुछ भी गलत नहीं है।

तो आप नोड्स की सूची प्राप्त करने के लिए नोड तालिका से पूछ सकते हैं, इन वस्तुओं के माध्यम से लूप करें और गतिशील रूप से एक सरणी बनाएं जिसमें सही मेनू आइटम हों।

बहुत मोटे तौर पर:

function example_menu() { 
    $result = db_query('select * from node where ...'); // put in your own select items and where clause 
    $menu = array(); 
    while ($row = db_fetch_object($result)) { 
    $menu['my_path/' . $row->nid;] = array(
     // See hook menu docs for what to put here. 
    ); 
    } 
    return $menu; 
} 
+0

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

+6

से नोड्स सूची कैसे प्राप्त करें ** ** इसके लिए 'hook_menu() 'का उपयोग नहीं करना चाहिए! ** दृश्य मेनू प्रविष्टियां बनाना केवल हुक की एक साइड इफेक्ट/सुविधा सुविधा है, ** यह मुख्य नहीं है उद्देश्य **। इस हुक द्वारा निर्मित/छेड़छाड़ वाला 'मेनू' ड्रूपल आंतरिक मेनू सिस्टम (राउटर टेबल) है, दृश्यमान UI मेनू नहीं।दृश्यमान मेनू प्रविष्टियों को menu_link_save के माध्यम से बनाया जाना चाहिए, जेरेमीस के दूसरे सुझाव के अनुसार (यह है कि hook_menu 'सुविधा' प्रविष्टियों को बनाने के लिए स्वयं का उपयोग करता है)। –

+0

मैंने राउटर आइटम बनाम मेनू प्रविष्टियों [दूसरे उत्तर में] के अंतर को समझाया [http://stackoverflow.com/questions/1844109/drupal-module-nested-menu-items/1869469#1869469)। यह भी देखें [कब और कैसे मेनू_लिंक्स का उपयोग करें] (http://drupal.org/node/217393)। –

0

आप Auto Menu module पर एक नज़र रखना चाहिए - Drupal 6 संस्करण अभी भी एक देव रिलीज है, जबकि, यह आपकी आवश्यकताओं को कवर कर सकते हैं। यदि नहीं, तो आप इसे अपना स्वयं का समाधान बनाने के लिए menu_link_save() का उपयोग करने के उदाहरण के रूप में ले सकते हैं।

0

मैं मेनू_लिंक_सेव() कॉल के लिए भी जाऊंगा। नियम मॉड्यूल के साथ, जब भी कोई नया नोड सहेजा जाता है, तो आप स्वचालित मेनू आइटम स्वचालित रूप से बनाने के लिए एक क्रिया सेट कर सकते हैं।

आप ट्यूटोरियल मैं कुछ समय पहले लिखा था, जो प्रोग्राम के menu_link_save (का उपयोग कर मेनू आइटम बनाने के साथ सौदों पर एक नजर है करने के लिए चाहते हो सकता है) और नियम: http://jan.tomka.name/blog/programmatically-creating-menu-items-drupal

0

ऐसा लगता है कि एक Drupal मॉड्यूल है कि इस करता है वहाँ की तरह: Auto Menu। इस मॉड्यूल के बारे में कुछ और विवरण (इसके प्रोजेक्ट पेज से):

ऑटो मेनू मॉड्यूल स्वचालित रूप से नोड निर्माण/संस्करण पर मेनू प्रविष्टियां उत्पन्न करता है। अभिभावक मेनू आइटम प्रति सामग्री प्रकार के आधार पर निर्दिष्ट किया जा सकता है।

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

2

Menu Position मॉड्यूल भी है जो उनके सामग्री प्रकार, उनकी भाषा और वर्गीकरण के आधार पर विशिष्ट मेनू प्रविष्टियों के तहत सामग्री को रखने की अनुमति देता है। अन्य मानदंडों को जोड़ने के लिए इसमें एक छोटा एपीआई भी है।

4

आप इसे ड्रूपल 7 पर नियमों के साथ कर सकते हैं। यह मॉड्यूल: http://drupal.org/project/menu_rules कुछ क्रियाओं को नियमों में जोड़ता है। उनमें से एक नोड के लिए मेनू आइटम बनाना है। आप चुनते हैं: इवेंट: नोड बनाएं एक नोड अद्यतन शर्त: सामग्री प्रकार है "अपनी सामग्री प्रकार" कार्रवाई:

+0

आप इस घटना को "नोड बनाएं" कहां चुनते हैं? – Vincent

-1

Menu Views Drupal 7 के लिए एक दिलचस्प मॉड्यूल है (वहाँ अगर does not मौजूद यह मेनू आइटम बनाने के लिए एक चेकबॉक्स है) नोड के लिए एक मेनू आइटम का अद्यतन करें स्वचालित रूप से मेनू लिंक उत्पन्न करने के लिए। यह आपको मेनू लिंक बनाने के लिए दृश्य की शक्ति का उपयोग करने की अनुमति देता है और सुपरफिश और अच्छे मेनू जैसे मॉड्यूल के साथ संयोजन में आउट-ऑफ-द-बॉक्स का उपयोग किया जा सकता है।

(पुनश्च: मेरी प्रतिष्ठा काफी अधिक दो से अधिक लिंक प्रदान करने के लिए नहीं है, इसलिए मैं प्रदान हाइपरलिंक के बजाय बोल्ड अन्य मॉड्यूल में चिह्नित किया है)

0

यहाँ इस मामले में जहां आप ऐसा कर सकते है .... एक नोड अभियान बनाते समय मेनू आइटम 'अभियान 001' बनाते हैं। default_menu_link का उपयोग करना अब एक और सामग्री प्रकार, 'सब अभियान' एक नोड बना रहा है, जिसका उपयोग एंटिटीआरफ के रूप में अभियान का उपयोग कर रहा है, इसलिए इसका मेनू आइटम पहले बनाए गए अभियान के मेनू आइटम के नीचे होना चाहिए।

function mymodule_node_insert($node) { 
    if ($node->type == 'sub-campaign') { 
    if (isset($node->field_reference_campaign['und'][0]['target_id'])) { 
     $campaign_node_id = $node->field_photo_album_campaign['und'][0]['target_id']; 
     $campaign_loaded = node_load($campaign_node_id); 
     // Get menu link id for the campaign node. 
     $campaign_node_id_mlid = custom_node_mlid($campaign_node_id); 
     $campaign_loaded_title = strtolower(str_replace(' ', "-", $campaign_loaded->title)); 
     $campaign_loaded_title_link_path = 'campaign/' . $campaign_loaded_title . '/photo-albums'; 
     //I will query if it exist or not, if not then will create a sub menu item. 
     $link_exist = db_query("SELECT * FROM {menu_links} WHERE link_path = :link_path", array(':link_path' => $campaign_loaded_title_link_path))->fetchField(); 
     dsm($link_exist); 
     if (!$link_exist) { 
     // Create menu item under campaign. 
     custom_create_menu_item($campaign_loaded_title_link_path, 'photo-albums', $campaign_node_id_mlid); 
     //watchdog('glue_site - Menu Item', 'Link Created'); 
     } 
     else { 
     //dsm('Link Exist.'); 
     watchdog('glue_site - Menu Item', 'Link Already Exist'); 
     } 
    } 
    } 
    if ($node->type == 'campaign') { 

    } 
} 

फिर एक कस्टम समारोह मेनू आइटम

function custom_create_menu_item($campaign_loaded_title_link_path, $type, $plid) { 
    switch ($type) { 
    case 'photo-albums': 
     $item = array(
     'link_path' => $campaign_loaded_title_link_path, 
     // If changing the title here, change it in template.php as well. 
     'link_title' => 'Sub Campaign', 
     'menu_name' => 'menu-campaign-menu', // Menu machine name, for example: main-menu 
     'weight' => 0, 
     'plid' => $plid, // Parent menu item, 0 if menu item is on top level 
     'module' => 'menu', 
     'router_path' => 'campaign/%/sub-campaign', 
     'customized' => '1', 
    ); 
     menu_link_save($item); 
     menu_cache_clear_all(); 
     watchdog('glue_site - Menu Item', 'Link Created'); 
     break; 
    } 
} 

बनाने के लिए माता-पिता नोड के mlid प्राप्त करने के लिए। अभियान नोड ...

function custom_node_mlid($nid) { 
    // Require menu node module. 
    $arr = menu_node_get_links($nid); 
    $mlid = array_keys($arr); 
    return $mlid[0]; 
} 

इसके लिए आपको जरूरत menu_node

0

यह एक साधारण समस्या दुर्भाग्य Drupal समुदाय यह जटिल बनाना चाहता है फैसला किया है कि है। नियमों और हुक के साथ सभी हैकी समाधानों के बारे में भूल जाओ। ड्रूपल 6 या ड्रूपल 7 पर निर्भर करते हुए दो मॉड्यूल हैं, जो समस्या को बहुत सुन्दर तरीके से हल करते हैं। मैं वास्तव में मेनू प्रविष्टियों बनाने के खिलाफ सलाह देते हैं। इसके बजाय नीचे दिए गए दो मॉड्यूल मेनू में नोड्स को गतिशील रूप से प्रस्तुत करते हैं, ताकि आपका मेनू संपादक हजारों नोड्स से भरा न हो। फिर, उदाहरण के लिए, यदि आप तय करते हैं कि आप चाहते हैं कि सभी ब्लॉग पोस्ट [हमारे ब्लॉग] से [हमारे बारे में] -> [समाचार] में स्थानांतरित हो जाएं, यह केवल एक सेटिंग बदलने का एक मामला है। हजारों नोड्स को अपडेट नहीं किया जा रहा है।

D6 Menu Trails

D7 Menu Position

संबंधित मुद्दे