9.2. Drupal में "hook" का क्या अर्थ है?
यह लेख आपको Drupal से परिचित कराने के लिए है, हम आगे अपने कस्टम मॉड्यूल को जोड़ने के बाद कोड उदाहरण लिखेंगे।
Drupal एक मोनोलिथिक सिस्टम नहीं है जिसमें सब कुछ परफेक्ट हो और जिसे बदलने की ज़रूरत न पड़े। बहुत बार ग्राहकों द्वारा यह अनुरोध किया जाता है कि साइट पर यह या वह फ़ीचर जोड़ा जाए। Drupal के कोर कोड को बनाए रखने और उसमें नई फ़ंक्शनलिटी जोड़ने के लिए हम मॉड्यूल्स का उपयोग करते हैं। मॉड्यूलर सिस्टम Drupal की क्षमताओं का विस्तार करने की अनुमति देता है। लेकिन अगर हमें किसी तैयार काउंटर मॉड्यूल की क्षमताओं का विस्तार करना पड़े तो क्या करें? निश्चित रूप से, हम drupal.org पर एक issue बनाकर आवश्यक फ़ंक्शनलिटी जोड़ने का अनुरोध कर सकते हैं, और संभवतः एक महीने, दो... या एक-दो साल में हमें वह फ़ंक्शनलिटी किसी विशेष मॉड्यूल में मिल जाए। लेकिन हम दूसरा तरीका भी अपना सकते हैं और वह कोड खुद लिख सकते हैं जिसकी हमें आवश्यकता है। Drupal के अतिरिक्त मॉड्यूल्स और Drupal स्वयं की क्षमताओं का विस्तार करने के लिए हम अपने मॉड्यूल्स में hooks और plugins का उपयोग करेंगे।
मुख्य विचार यह है कि हमें Drupal के कोड या अतिरिक्त मॉड्यूल्स के कोड को सपोर्ट करने की आवश्यकता नहीं है, और इस प्रकार हम प्रोग्रामर के कार्य के लिए भुगतान में काफी बचत कर सकते हैं। मॉड्यूल्स और Drupal के कोड को आसानी से अपडेट करने में सक्षम होने के लिए, आपको Drupal के कोर और contributed मॉड्यूल्स में सीधे परिवर्तन नहीं करने चाहिए। अन्यथा, जब भी आप मॉड्यूल या Drupal कोर को अपडेट करेंगे, आपकी सभी परिवर्तन मिट जाएंगे।
मॉड्यूल्स और Drupal कोर के बीच, साथ ही मॉड्यूल्स के बीच इंटरकनेक्शन के लिए Drupal में एक hook system होता है। एक hook एक फ़ंक्शन का callback होता है, यानी जब कोड के निष्पादन के दौरान hook पर पहुंचा जाता है, तो हमारे मॉड्यूल में जो फ़ंक्शन हमने जोड़ा है उसका कोड निष्पादित होता है। इस तरह, हम किसी भी समय उपयोगकर्ता डेटा, मेनू, टैक्सोनॉमीज़, विभिन्न कंटेंट प्रकारों के नोड्स को संशोधित, जोड़ने, हटाने या केवल लोड और प्रदर्शित करने की प्रक्रिया में हस्तक्षेप कर सकते हैं। Drupal 8 में हुक्स की संख्या काफी है, लेकिन Drupal 7 की तुलना में कम है — कई हुक्स अब थर्ड-पार्टी Symfony कॉम्पोनेंट्स के माध्यम से लागू किए गए हैं:
https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x
यदि आप 7वीं संस्करण को देखें, तो आपको बहुत नीचे स्क्रॉल करना पड़ेगा:
https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x
लेकिन इसका मतलब यह नहीं है कि Drupal 8 कम शक्तिशाली हो गया है, बस इतना है कि Drupal 7 में जो चीज़ें hook के माध्यम से लागू की गई थीं, Drupal 8 में उन्हें plugin के रूप में लागू किया गया है।
यदि आप Drupal 8 के हुक्स की सूची को ध्यान से देखें, तो आप उनके नामों के अंत में _alter देखेंगे, जिसका अर्थ है कि यह हुक वेरिएबल्स के मानों को बदलने के लिए डिज़ाइन किया गया है, उदाहरण के लिए:
hook_form_alter() — यह Drupal में किसी फ़ॉर्म के प्रोसेसिंग के दौरान उसके ऐरे को बदलने की अनुमति देता है। बाद में हम विश्लेषण करेंगे कि Drupal में फ़ॉर्म कैसे ऐरे से जनरेट किए जाते हैं। इस हुक को मॉड्यूल में लागू करने के लिए, जैसे कि अन्य हुक्स के लिए, हम बस एक फ़ंक्शन लिखते हैं:
function mymodule_form_alter() {
// form array को बदलें
}
मैंने उदाहरण को सरल रखा है, फ़ंक्शन के आर्ग्युमेंट्स या namespaces नहीं लिखे हैं — फिलहाल हमें यह समझना है कि हुक्स कैसे काम करते हैं। Mymodule हमारा मॉड्यूल है, हम ‘hook’ शब्द की जगह अपने मॉड्यूल का नाम लिखते हैं और Drupal स्वचालित रूप से इस फ़ंक्शन को पहचान लेता है और फ़ॉर्म ऐरे को संशोधित करता है। यह कैसे काम करता है? prepareForm मेथड के अंदर alter() नामक एक और मेथड को कॉल किया जाता है:
$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);
इसका अर्थ यह है कि Drupal में प्रत्येक मॉड्यूल जो hook_form_alter() को लागू करता है, इस स्थान पर अपना कोड सम्मिलित करता है। इस प्रकार, यदि हमें Drupal में किसी जगह पर कोड जोड़ना है, तो सबसे पहले हमें इसे hook के माध्यम से करना चाहिए, फिर plugin के माध्यम से, और यदि यह भी संभव न हो और हमें plugin मॉड्यूल को बदलना ही पड़े, तो हम उसे patch / hack / modify करेंगे (दुर्भाग्यवश, कभी-कभी ऐसा करना पड़ता है)। फिलहाल, हम ऐसे कार्यों का सामना नहीं कर रहे हैं जिनमें plugins को बदलने की आवश्यकता हो, इसलिए चलिए सीखते हैं कि अपने खुद के मॉड्यूल कैसे लिखें।