থিম হুক বনাম মডিউল হুক


10

কখনও কখনও যখন আমি একটি হুক প্রয়োগ করার চেষ্টা করি তখন বুঝতে পারি এটি মডিউল ফাইলে থাকার কথা।

কোনও থিমের টেমপ্লেট.এফপি ফাইল বা মডিউলে একটিতে কী হুক প্রয়োগ করা যেতে পারে তা জানার কোনও উপায় আছে?


4
সাধারণত যখন কোনও থিমটিতে একটি হুক উপলব্ধি করা যায় না তখন এটি সঙ্গত কারণেই হয়। থিমগুলি কেবল মডিউলগুলি সরবরাহ করে এমন সামগ্রী এবং কার্যকারিতা প্রদর্শন সম্পর্কিত কোডের জন্য হওয়া উচিত। কোড যা কার্যকরীতা বা সামগ্রীগুলিকে যুক্ত / অপসারণ / পরিবর্তন করে তা সাধারণত একটি মডিউলে থাকা উচিত। এছাড়াও আপনি যদি থিম পরিবর্তন করেন তবে আপনি টেমপ্লেট.এফপি-তে তৈরি কোনও কাস্টমাইজেশন হারাতে চান, তাই আপনি যদি থিমগুলি পরিবর্তন করেন তবে আপনি সম্ভবত এটি রাখতে চান তা অবশ্যই মডিউলটিতে যেতে চাইবে।
ছদ্মবেশী

উত্তর:


11

সাধারণভাবে বলতে গেলে, শুধুমাত্র পরিবর্তিত হুকগুলি থিম দ্বারা প্রয়োগ করা যেতে পারে, যার অর্থ হুকগুলি হ'ল hook_form_alter()এবং হ'ল hook_menu_alter()সংক্ষেপে drupal_alter()দ্রুপাল and এবং নিম্নে ( ModuleHandler()::alter()বা ThemeManager::alter()দ্রুপাল ৮) এর মাধ্যমে আহ্বান করা সমস্ত হুক ।

অন্যান্য হুকগুলি, যা module_invoke_all()( ModuleHandler::invokeAll()দ্রুপাল 8 এ) দ্বারা আহ্বান করা হয়েছে , কেবল থিমগুলির জন্য অনুরোধ করবেন না কারণ বর্তমানে সক্রিয় থিমটি কোনও হুক সংজ্ঞায়িত করে কিনা তা কোড পরীক্ষা করে না।

  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;
      }
    }
  }

ড্রুপাল ৮-এ, যেখানে ModuleHandlerক্লাসটি মডিউলগুলি থেকে বাস্তবায়িত হুকগুলি আহ্বান করে এবং ThemeManagerক্লাস থিমগুলি দ্বারা বাস্তবায়িত হুকগুলি আহ্বান করে, কেবল প্রথম শ্রেণীর প্রয়োগসমূহ invoke()এবং invokeAll()। এর অর্থ এই যে ড্রুপাল 8 থিম হুকগুলিকে দ্রুপাল কোর দ্বারা চালিত করা হয়নি।

এটি ড্রুপাল কোর হুকগুলির জন্য বৈধ এবং বেশিরভাগ হুক তৃতীয় পক্ষের মডিউল দ্বারা ব্যবহৃত। হুক একটি থিম দ্বারা প্রয়োগ করা হয়েছে যাচাই করার জন্য এটি একটি মডিউল অবধি রয়েছে এবং এটির অনুরোধ জানায়। ভিউজ মডিউলটি এটি করে।

  // Let modules modify the view just prior to rendering it.
  foreach (module_implements('views_pre_render') as $module) {
    $function = $module . '_views_pre_render';
    $function($this);
  }

  // Let the themes play too, because pre render is a very themey thing.
  foreach ($GLOBALS['base_theme_info'] as $base) {
    $function = $base->name . '_views_pre_render';
    if (function_exists($function)) {
      $function($this);
    }
  }
  $function = $GLOBALS['theme'] . '_views_pre_render';
  if (function_exists($function)) {
    $function($this);
  }

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


hook_entity_view_alter () থিমগুলিতে কাজ করে না।
dxvargas

থিমের কমপক্ষে ডি 7-র পরিবর্তিত হুকগুলি কেবলমাত্র তখনই অনুরোধ করা হবে যখন থিমটি ইতিমধ্যে একই অনুরোধে (যেমন কল করে theme()) শুরু করা হয়েছে। যদি এটি আরম্ভ না করা হয় তবে কোনও থিমের কোনও পরিবর্তিত হুক কার্যকর করা হবে না।
zwirbeltier

পৃষ্ঠাটি রেন্ডার করার জন্য ব্যবহৃত থিমের জন্য @Zwirbeltier থিম হুকগুলি অনুরোধ করা হয়েছে। theme()পৃষ্ঠার জন্য ব্যবহৃত থিম পরিবর্তন করে না, তবে এটি ডেটা রেন্ডার করার জন্য একটি ফাংশনকে আহ্বান করে। এটি থিম পরিবর্তন করে না, উদাহরণস্বরূপ, গারল্যান্ড থেকে মিনেলিতে।
কিমলালুনো

@কীমালালুনো: আপনি যদি কোডটিতে তাকান তবে drupal_alter()দেখতে পাবেন যে এটি কেবল থিমটিতে পরিবর্তিত হুকের drupal_theme_initialize()আগেই ডাকা হয়েছিল। যদি এটি না হয় তবে কোনও সক্রিয় থিম (এখনও) নেই এবং এইভাবে কোনও হুক বলা হয় না। কমপক্ষে ডি 7- drupal_theme_initialize()তে কোনও অনুরোধে প্রথমবার বলা হয় তখন কোনও গ্যারান্টি নেই ।
zwirbeltier

@zwirbeltier যখন কোনও পৃষ্ঠা রেন্ডার করা হয় তখনই দ্রুপাল থেকে থিম সেটটি ইতিমধ্যে শুরু করা হয়েছিল is যদি কোনও মডিউল উপযুক্ত ফাংশনটি কল না করে কোনও পৃষ্ঠার জন্য কোনও থিম সেট করে, এটি আরম্ভ করার দায়িত্ব এটি।
kiamlaluno
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.