समारोह प्रेरक hook_menu()
है () menu_router_build , से बुलाया menu_rebuild () । इसमें निम्न कोड है।
foreach (module_implements('menu') as $module) {
$router_items = call_user_func($module . '_menu');
if (isset($router_items) && is_array($router_items)) {
foreach (array_keys($router_items) as $path) {
$router_items[$path]['module'] = $module;
}
$callbacks = array_merge($callbacks, $router_items);
}
}
// Alter the menu as defined in modules, keys are like user/%user.
drupal_alter('menu', $callbacks);
यदि एक ही मार्ग को परिभाषित करने वाले दो मॉड्यूल हैं, तो दिए गए सरणी में अंतिम मॉड्यूल module_implements()
अन्य मॉड्यूल से परिभाषित मूल्य को ओवरराइड करेगा।
द्वारा आवश्यक दूसरा पैरामीटर निम्नानुसार module_implements()
परिभाषित किया गया है:
$sort
डिफ़ॉल्ट रूप से, मॉड्यूल वजन और फ़ाइल नाम द्वारा आदेशित किए जाते हैं, इस विकल्प को सेटिंग्स TRUE
, मॉड्यूल सूची को मॉड्यूल नाम द्वारा आदेश दिया जाएगा।
चूंकि menu_router_build()
दूसरा पैरामीटर पास नहीं करता है menu_implements()
, इसलिए फ़ंक्शन उस पैरामीटर के लिए डिफ़ॉल्ट मान का उपयोग कर रहा है। इसका मतलब है कि मॉड्यूल की सूची उनके वजन और फ़ाइल नाम द्वारा आदेशित है; जब दो मॉड्यूल का वजन समान होता है, तो सूची में दिखाई देने वाला पहला मॉड्यूल वह होता है जो वर्णानुक्रम में पहले आता है।
इसके अलावा, किसी भी मॉड्यूल को लागू hook_module_implements_alter()
करने वाले हुक को रद्द करने के आदेश को बदल सकते हैं।
इस कारण से, आपको यह पता नहीं लगाना चाहिए कि हुक किस क्रम में लगाए गए हैं।
यदि कोड का उद्देश्य किसी अन्य मॉड्यूल द्वारा कार्यान्वित मार्ग को बदल रहा है, उदाहरण के लिए क्योंकि एक मार्ग को हटा दिया जाना चाहिए जब एक दूसरा मॉड्यूल स्थापित और सक्षम हो, तो कोड का उपयोग करना चाहिए hook_menu_alter()
। यदि आप यह समझने की कोशिश कर रहे हैं कि मार्ग संघर्ष के मामले में कौन सा मॉड्यूल "जीत" होगा, मैं इस तरह के मार्ग संघर्ष से बचूंगा, और एक ऐसे मार्ग को परिभाषित करूंगा जो पहले से ही किसी अन्य मॉड्यूल से परिभाषित नहीं है।
यदि तब आप कार्यान्वित कर रहे हैं hook_menu_alter()
, और आप सुनिश्चित करना चाहते हैं कि आपका मॉड्यूल अंतिम रूप से निष्पादित हो, तो ऐसा मॉड्यूल हो जो प्रभावी रूप से एक मार्ग को ओवरराइड करता हो, आपको hook_module_implements_alter()
भी लागू करना चाहिए ।
function mymodule_module_implements_alter(&$implementations, $hook) {
if ($hook == 'menu_alter') {
// Move mymodule_menu_alter() to the end of the list. module_implements()
// iterates through $implementations with a foreach loop which PHP iterates
// in the order that the items were added, so to move an item to the end of
// the array, we remove it and then add it.
$group = $implementations['mymodule'];
unset($implementations['mymodule']);
$implementations['mymodule'] = $group;
}
}