ফাংশন আবাহন 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;
}
}