দুটি মডিউল উভয়ই 'হুক_মেনু' তে একই মেনু পথটিকে সংজ্ঞায়িত করলে, কোন একটি দ্রুপাল বেছে নেবে?


14

উদাহরণস্বরূপ, "মডিউলোন" পথ 'অ্যাডমিন / হ্যালো' সংজ্ঞা দেয়, কোন আউটপুট print_moduleone_stuff()

/**
 * Implements hook_menu()
 */
function moduleone_menu() {
  $items['admin/hello'] = array(
    'title' => 'Module One Hello World',
    'page callback' => print_moduleone_stuff,
  );
  return $items;
}

"মডিউলটো দু'টি 'অ্যাডমিন / হ্যালো' পথ নির্ধারণ করে, যা আউটপুট দেয় print_moduletwo_stuff()

/**
 * Implements hook_menu()
 */
function moduletwo_menu() {
  $items['admin/hello'] = array(
    'title' => 'Module Two Hello World',
    'page callback' => print_moduletwo_stuff,
  );
  return $items;
}

উভয় মডিউল পৃথক ফলাফলের জন্য 'অ্যাডমিন / হ্যালো' পথ সংজ্ঞায়িত করে। এই দুটি মডিউল সক্ষম করার সাথে, দ্রুপাল কীভাবে একে অপরের চেয়ে নির্বাচন করে? কীভাবে দ্রুপাল দ্বন্দ্ব সমাধান করবে?

উত্তর:


16

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

অনেক স্পষ্ট এবং সহায়ক, ধন্যবাদ। এই ক্ষেত্রে hook_menu_alter () ব্যবহারের জন্য উল্লেখ করার জন্য ধন্যবাদ।
গিলজারো

দুটি মডিউল হুক_মেনু_াল্টারে () যদি একই পথটিকে সংজ্ঞায়িত করে তবে কী হবে? একই বিধি প্রয়োগ হয়েছে?
গিলজারো

hook_menu_alter()নতুন মেনু সংজ্ঞায়িত করতে ব্যবহৃত হয় না, তবে বিদ্যমান মানগুলি পরিবর্তন করতে ব্যবহৃত হয়। যদি দুটি মডিউল একই মেনুতে পরিবর্তন করে, তবে যে পরিবর্তনটি টিকে থাকে তা মডিউল থেকে শেষের জন্য কার্যকর করা হয়।
kiamlaluno

4

সারণীতে যার মডিউলটির নিম্ন weightমানের রয়েছে systemতাকে প্রথমে বলা হবে, সুতরাং উচ্চতর weightমান সহ মডিউলটি এই ক্ষেত্রে 'জিতবে'।

ওজন দুটি (বা তারও বেশি) মডিউলগুলির জন্য যদি একই হয় তবে আমি বিশ্বাস করি যে মাইএসকিউএল টেবিল থেকে সরাসরি আসা ক্রম ছাড়া আর কোনও নির্দিষ্ট ক্রম নেই। (যদিও আমি এটি সম্পর্কে ভুল হতে পারি)।

যেহেতু আহ্বান থেকে প্রাপ্ত ফলাফলগুলি hook_menuকেবল মেনু আইটেমগুলির একক অ্যারেতে দেওয়া হয় সেখানে কখনও কোনও 'দ্বন্দ্ব' হবে না, পরবর্তী কলগুলির ফলাফলগুলি hook_menuকেবল পূর্ববর্তী কলগুলি থেকে ওভাররাইড করবে।


4
প্রো ড্রুপাল ডেভলপমেন্ট অনুসারে , সমান ওজনযুক্ত মডিউলগুলি তাদের নাম অনুসারে বর্ণানুক্রমিকভাবে ডাকা হয়।
এমপিডোনাদিও

2
এই বইয়ের দ্বারা যা রিপোর্ট করা হয়েছে তা সঠিক: একটি হুক প্রয়োগকারী মডিউলগুলির তালিকা সাধারণত ওজন অনুসারে এবং বর্ণানুক্রমিকভাবে সাজানো হয়; এটি দ্বিতীয় প্যারামিটার হিসাবে module_implements()পেয়ে থাকলে তা সাজানো হবে না FALSE, তবে module_invoke_all()এটি কেবল একটি প্যারামিটার দিয়ে কল করার মতো ক্রিয়াকলাপ ।
কিমলালুনো

আমার আগের মন্তব্যটি সম্পূর্ণ নির্ভুল নয়। আমার উত্তরে আমি যা রিপোর্ট করছি তা সঠিক।
কিমলালুনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.