Çağıran işlev hook_menu()
, menu_rebuild () tarafından çağrılan menu_router_build () işlevidir . Aşağıdaki kodu içerir.
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);
Aynı yolu tanımlayan iki modül varsa, tarafından döndürülen dizideki son modül module_implements()
diğer modüllerden tanımlanan değeri geçersiz kılar.
Gerekli olan ikinci parametre module_implements()
şu şekilde tanımlanır:
$sort
Varsayılan olarak, modüller ağırlık ve dosya adına göre sıralanır, bu seçeneğin ayarlandığı gibi TRUE
, modül listesi modül adına göre sıralanır.
Yana menu_router_build()
için ikinci parametre geçmez menu_implements()
, işlevi bu parametre için varsayılan bir değer kullanıyor. Bu, modül listesinin ağırlıklarına ve dosya adlarına göre sıralandığı anlamına gelir; iki modül aynı ağırlığa sahip olduğunda, listede görünen ilk modül alfabetik olarak önce gelen modüldür.
Ayrıca, herhangi bir modül uygulaması hook_module_implements_alter()
, kancaların çağrılma sırasını değiştirebilir.
Bu nedenle, kancaların hangi sırayla çağrıldığını bilmemelisiniz.
Kodun amacı başka bir modül tarafından uygulanan rotayı değiştiriyorsa, örneğin ikinci bir modül kurulduğunda ve etkinleştirildiğinde bir yolun kaldırılması gerektiğinden, kod kullanılmalıdır hook_menu_alter()
. Rota çakışmaları durumunda hangi modülün "kazanacağını" anlamaya çalışıyorsanız, böyle bir rota çakışmasından kaçınmayı ve başka bir modülden tanımlanmamış bir rotayı tanımlamayı tercih ederim.
O zaman uyguluyorsanız hook_menu_alter()
ve modülünüzün en son yürütüldüğünden emin olmak istiyorsanız, bir rotayı etkili bir şekilde geçersiz kılan modül olmak için de uygulamanız gerekir 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;
}
}