कभी-कभी जब मैं एक हुक लगाने की कोशिश करता हूं, तो यह महसूस करने के लिए कि यह मॉड्यूल फ़ाइल में होना चाहिए।
क्या यह जानने का एक तरीका है कि थीम के टेम्पलेट में क्या हुक लागू किया जा सकता है। पीएफ फ़ाइल, या मॉड्यूल में एक?
कभी-कभी जब मैं एक हुक लगाने की कोशिश करता हूं, तो यह महसूस करने के लिए कि यह मॉड्यूल फ़ाइल में होना चाहिए।
क्या यह जानने का एक तरीका है कि थीम के टेम्पलेट में क्या हुक लागू किया जा सकता है। पीएफ फ़ाइल, या मॉड्यूल में एक?
जवाबों:
आम तौर पर, केवल हूक को थीमों द्वारा लागू किया जा सकता है, जिसका अर्थ है हुक जैसे 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);
}
तृतीय-पक्ष मॉड्यूल द्वारा उपयोग किए जाने वाले हुक के लिए, आपको उन्हें लागू करने के लिए उपयोग किए गए कोड की जांच करने की आवश्यकता है। संभावना है कि थीम के लिए केवल हूक बदल दिए जाते हैं, लेकिन कुछ मामलों में अन्य हूक को भी थीम द्वारा लागू किया जा सकता है।
ध्यान रखें कि विषयों के मामले में, हुक कार्यान्वयन के लिए सभी सक्षम थीमों की जांच नहीं की जाती है, जो मॉड्यूल के साथ होता है। केवल वर्तमान में उपयोग की जाने वाली थीम और आधार थीम की जाँच की जाती है, जैसा कि व्यू मॉड्यूल से किया गया है।
theme()
) तो कम से कम D7 में परिवर्तन-हुक केवल तब ही लागू किए जाते हैं । यदि इसे इनिशियलाइज़ नहीं किया गया है तो किसी भी विषय में कोई भी परिवर्तन नहीं किया जाएगा।
theme()
पृष्ठ के लिए उपयोग की जाने वाली थीम को परिवर्तित नहीं करता है, लेकिन यह डेटा को प्रस्तुत करने के लिए एक फ़ंक्शन को आमंत्रित करता है। उदाहरण के लिए, गारलैंड से मिनेली तक यह विषय नहीं बदलता है।
drupal_alter()
देखते हैं तो यह देखते हैं कि यह केवल विषय में परिवर्तन-हुक को आमंत्रित करता है यदि drupal_theme_initialize()
इसे पहले कहा गया था। यदि यह नहीं था, तो कोई सक्रिय विषय नहीं है (अभी तक) और इस प्रकार कोई हुक नहीं कहा जाता है। कम से कम डी 7 में कोई गारंटी नहीं है जब drupal_theme_initialize()
अनुरोध में पहली बार कहा जाता है।