กล่าวอ้างฟังก์ชั่น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()
สามารถแก้ไขลำดับของ hooks ที่ถูกเรียกใช้
ด้วยเหตุผลนี้คุณไม่ควรสันนิษฐานว่าลำดับใดถูกเรียกใช้ hooks ถ้าวัตถุประสงค์ของรหัสที่จะเปลี่ยนแปลงเส้นทางที่ดำเนินการโดยโมดูลอื่นตัวอย่างเช่นเพราะเป็นเส้นทางที่ควรจะถูกลบออกเมื่อโมดูลที่สองมีการติดตั้งและเปิดใช้งานรหัสควรใช้
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;
}
}