Hàm gọi hook_menu()
là menu_router_build () , được gọi bởi menu numbuild () . Nó chứa mã sau đây.
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);
Nếu có hai mô-đun xác định cùng một tuyến đường, mô-đun cuối cùng trong mảng được trả về module_implements()
sẽ ghi đè giá trị được xác định từ các mô-đun khác.
Tham số thứ hai được yêu cầu bởi module_implements()
được định nghĩa là:
$sort
Theo mặc định, các mô-đun được sắp xếp theo trọng lượng và tên tệp, cài đặt tùy chọn này thành TRUE
, danh sách mô-đun sẽ được sắp xếp theo tên mô-đun.
Vì menu_router_build()
không chuyển tham số thứ hai cho menu_implements()
, nên hàm đang sử dụng giá trị mặc định cho tham số đó. Điều này có nghĩa là danh sách các mô-đun được sắp xếp theo trọng lượng và tên tệp của chúng; khi hai mô-đun có cùng trọng lượng, mô-đun đầu tiên xuất hiện trong danh sách là mô-đun xuất hiện theo thứ tự bảng chữ cái.
Hơn nữa, bất kỳ mô đun thực hiện nào hook_module_implements_alter()
cũng có thể thay đổi thứ tự các hook được gọi.
Vì lý do này, bạn không nên giả định để biết thứ tự các móc được gọi.
Nếu mục đích của mã là thay đổi tuyến đường được thực hiện bởi một mô-đun khác, ví dụ vì tuyến đường sẽ bị xóa khi mô-đun thứ hai được cài đặt và kích hoạt, nên sử dụng mã hook_menu_alter()
. Nếu bạn đang cố gắng hiểu mô-đun nào sẽ "chiến thắng" trong trường hợp xung đột tuyến đường, tôi thà tránh xung đột tuyến đường đó và xác định tuyến đường chưa được xác định từ mô-đun khác.
Nếu sau đó bạn đang triển khai hook_menu_alter()
và bạn muốn chắc chắn mô-đun của mình được thực thi lần cuối, để trở thành mô-đun ghi đè một tuyến hiệu quả, bạn cũng nên thực hiện 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;
}
}