थीम हुक बनाम मॉड्यूल हुक


10

कभी-कभी जब मैं एक हुक लगाने की कोशिश करता हूं, तो यह महसूस करने के लिए कि यह मॉड्यूल फ़ाइल में होना चाहिए।

क्या यह जानने का एक तरीका है कि थीम के टेम्पलेट में क्या हुक लागू किया जा सकता है। पीएफ फ़ाइल, या मॉड्यूल में एक?


4
आम तौर पर जब एक हुक एक विषय में अतिदेय होने के लिए उपलब्ध नहीं होता है तो यह अच्छे कारण के लिए होता है। थीम केवल उस सामग्री और कार्यक्षमता के प्रदर्शन से संबंधित कोड के लिए होना चाहिए जो मॉड्यूल प्रदान करते हैं। कार्यक्षमता या सामग्री को जोड़ने / हटाने / बदलने वाला कोड आमतौर पर एक मॉड्यूल में होना चाहिए। इस तथ्य के बारे में भी सोचें कि यदि आप थीम बदलते हैं, तो आप टेम्पलेट में किए गए किसी भी कस्टमाइज़ेशन को खो देते हैं। इसलिए, यदि आप ऐसे बदलाव कर रहे हैं, जो आप संभवतः रखना चाहते हैं यदि आपने कभी थीम बदल दी हैं, तो वह निश्चित रूप से एक मॉड्यूल में जाना चाहेगा।
रोबी

जवाबों:


11

आम तौर पर, केवल हूक को थीमों द्वारा लागू किया जा सकता है, जिसका अर्थ है हुक जैसे hook_form_alter()और hook_menu_alter(), या संक्षेप में उन सभी हुक जो drupal_alter()ड्रुपल 7 और निम्न ( ModuleHandler()::alter()या ThemeManager::alter()ड्रुपल 8 में) के माध्यम से लगाए जाते हैं ।

अन्य हुक, जो module_invoke_all()( ModuleHandler::invokeAll()Drupal 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;
      }
    }
  }

ड्रुपल 8 में, जहां ModuleHandlerक्लास मॉड्यूल से ThemeManagerलागू किए गए हुक और क्लास द्वारा लागू किए गए हुक को लागू करता है, केवल प्रथम श्रेणी में लागू होता है invoke()और invokeAll()। इसका मतलब यह है कि Drupal कोर द्वारा 8 Drupal थीम में हुक नहीं लगाए गए हैं।

यह Drupal कोर हुक के लिए मान्य है, और ज्यादातर सभी हुक तीसरे पक्ष के मॉड्यूल द्वारा उपयोग किए जाते हैं। यह तब होता है जब किसी विषय को भी लागू करने के लिए हुक को सत्यापित करने के लिए मॉड्यूल पर निर्भर करता है, और इसे लागू करता है। यह दृश्य मॉड्यूल क्या करता है।

  // 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

यदि थीम पहले से ही एक ही अनुरोध में शुरू की गई हो (यानी कॉल करके theme()) तो कम से कम D7 में परिवर्तन-हुक केवल तब ही लागू किए जाते हैं । यदि इसे इनिशियलाइज़ नहीं किया गया है तो किसी भी विषय में कोई भी परिवर्तन नहीं किया जाएगा।
zwirbeltier

पेज को रेंडर करने के लिए इस्तेमाल की जाने वाली थीम के लिए @zwirbeltier थीम हुक लगाए गए हैं। theme()पृष्ठ के लिए उपयोग की जाने वाली थीम को परिवर्तित नहीं करता है, लेकिन यह डेटा को प्रस्तुत करने के लिए एक फ़ंक्शन को आमंत्रित करता है। उदाहरण के लिए, गारलैंड से मिनेली तक यह विषय नहीं बदलता है।
kiamlaluno

@kiamlaluno: यदि आप में कोड को drupal_alter()देखते हैं तो यह देखते हैं कि यह केवल विषय में परिवर्तन-हुक को आमंत्रित करता है यदि drupal_theme_initialize()इसे पहले कहा गया था। यदि यह नहीं था, तो कोई सक्रिय विषय नहीं है (अभी तक) और इस प्रकार कोई हुक नहीं कहा जाता है। कम से कम डी 7 में कोई गारंटी नहीं है जब drupal_theme_initialize()अनुरोध में पहली बार कहा जाता है।
zwirbeltier

@zwirbeltier Drupal से सेट की गई थीम पहले से ही एक पेज रेंडर होने पर शुरू हो जाती है। यदि कोई मॉड्यूल उपयुक्त फ़ंक्शन को कॉल किए बिना पृष्ठ के लिए एक थीम सेट करता है, तो इसे प्रारंभ करने के लिए इसकी जिम्मेदारी है।
kiamlaluno
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.