মডিউল_ইনভোক_ল (), বা মডিউল_ভেন্ক () এবং মডিউল_আইপিপ্লিমেন্ট () ব্যবহার করা কি ভাল?


10

ব্যবহার module_invoke_all('some_hook')করা সহজ, তবে পারফরম্যান্সের জন্য এটি কি আরও ভাল?

foreach (module_implements('some_hook') as $module) {
  $data = module_invoke($module, 'some_hook');
}

উত্তর:


11

সামান্য পার্থক্য আছে; module_invoke_all()নিম্নলিখিত কোড চালায়:

function module_invoke_all() {
  $args = func_get_args();
  $hook = $args[0];
  unset($args[0]);
  $return = array();
  foreach (module_implements($hook) as $module) {
    $function = $module . '_' . $hook;
    if (function_exists($function)) {
      $result = call_user_func_array($function, $args);
      if (isset($result) && is_array($result)) {
        $return = array_merge_recursive($return, $result);
      }
      elseif (isset($result)) {
        $return[] = $result;
      }
    }
  }

  return $return;
}

পার্থক্যটি হ'ল module_invoke_all()উদাহরণস্বরূপ, func_get_args()শুধুমাত্র একবার module_invoke() func_get_args()ডাকা হয় , যখন ব্যবহারের সময় প্রতিটি সময় module_invoke()বলা হয়; যদিও এটি একটি প্রান্তিক পার্থক্য।
কয়েকটি ক্ষেত্রে রয়েছে module_implementing()এবং module_invoke()ব্যবহৃত হয়, সাধারণত যখন কোনও মডিউলটি জানা উচিত যে কোন মডিউলটি চাওয়া হয়েছে, যেমন search_get_info()সন্ধান ফাংশনগুলি বাস্তবায়নকারী মডিউলগুলির সম্পর্কে তথ্যের অ্যারে তৈরি করে।

function search_get_info($all = FALSE) {
  $search_hooks = &drupal_static(__FUNCTION__);

  if (!isset($search_hooks)) {
    foreach (module_implements('search_info') as $module) {
      $search_hooks[$module] = call_user_func($module . '_search_info');
      // Use module name as the default value.
      $search_hooks[$module] += array(
        'title' => $module,
        'path' => $module,
      );
      // Include the module name itself in the array.
      $search_hooks[$module]['module'] = $module;
    }
  }

  if ($all) {
    return $search_hooks;
  }

  $active = variable_get('search_active_modules', array('node', 'user'));
  return array_intersect_key($search_hooks, array_flip($active));
}

আরেকটি উদাহরণ হ'ল ইমেজ_স্টাইলস () , যা মডিউলগুলি দ্বারা প্রয়োগ সমস্ত চিত্র শৈলীর তালিকা পায় এবং এটি নিম্নলিখিত কোডটি ব্যবহার করে:

  foreach (module_implements('image_default_styles') as $module) {
    $module_styles = module_invoke($module, 'image_default_styles');
    foreach ($module_styles as $style_name => $style) {
      $style['name'] = $style_name;
      $style['module'] = $module;
      $style['storage'] = IMAGE_STORAGE_DEFAULT;
      foreach ($style['effects'] as $key => $effect) {
        $definition = image_effect_definition_load($effect['name']);
        $effect = array_merge($definition, $effect);
        $style['effects'][$key] = $effect;
      }
      $styles[$style_name] = $style;
    }
  }

উভয় ক্ষেত্রে, পুনরুদ্ধার করা তথ্য একটি অ্যারেতে রাখা হয় যেখানে সূচিটি মডিউলটির সংক্ষিপ্ত নাম।


5

আপনার কোডটিতে একবার নজর থাকলে , মডিউল_ইনভোক_লোকটি কেবল এটিই করে, এবং বেশ কয়েকটা স্যানিটি পরীক্ষা করে। এবং এটি সহজ। :-)


1
লিংকটি নষ্ট হয়েছে, সম্ভবত দ্রুপাল ৮ এর অগ্রাধিকারের কারণে D
ব্যবহারকারীর 3535

-1

এটি সম্ভবত ব্যবহার না করা, এবং এর পরিবর্তে drupal_alter () ব্যবহার করা ভাল

মডিউল_আইভোকে_ সমস্ত () ডকুমেন্টেশনে যেমন বলা হয়েছে ,

সমস্ত আর্গুমেন্ট মান দ্বারা পাস করা হয়। যদি আপনার রেফারেন্সের মাধ্যমে যুক্তিগুলি পাস করার প্রয়োজন হয় তবে drupal_alter () ব্যবহার করুন।

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