9.3. एक कस्टम Drupal मॉड्यूल बनाएं। पेज को प्रोग्रामेटिक रूप से प्रदर्शित करें।
आइए हम अपने मॉड्यूल को थोड़ी व्यवस्था के साथ बनाना शुरू करें। आइए कस्टम और कॉन्ट्रिब्यूटेड मॉड्यूल्स को अलग-अलग रखना जारी रखें। Drupal में मॉड्यूल्स /modules
फ़ोल्डर में होते हैं। अब हमें उन्हें /sites/all/modules
में गहराई तक रखने की आवश्यकता नहीं है, हालांकि readme में कहा गया है कि यह काम करेगा, फिर भी /modules
फ़ोल्डर का उपयोग करें। /modules
फ़ोल्डर के अंदर हम दो फ़ोल्डर बनाएंगे — custom
और contrib
। contrib
फ़ोल्डर में हम drupal.org से डाउनलोड किए गए अतिरिक्त मॉड्यूल्स रखेंगे, और हमारे कस्टम मॉड्यूल्स custom
फ़ोल्डर में संग्रहीत होंगे।
अंग्रेज़ी उपशीर्षक:
कोड उदाहरण GitHub पर देखे जा सकते हैं:
https://github.com/levmyshkin/drupalbook8
मॉड्यूल्स को contrib
और custom
फ़ोल्डर में विभाजित करना एक छोटी सी बात लगती है, लेकिन विश्वास कीजिए, जब आपकी साइट पर 200 contributed मॉड्यूल्स और 30 custom मॉड्यूल्स होंगे, तब आपको समझ आएगा कि सभी custom मॉड्यूल्स और कोड को ढूंढना कितना कठिन होता है। साथ ही, यदि आप किसी contributed मॉड्यूल के कोड में कुछ परिवर्तन करते हैं (जो केवल अत्यावश्यक स्थिति में किया जाना चाहिए), तो इसे custom फ़ोल्डर में स्थानांतरित करना अच्छा होगा ताकि अपडेट के दौरान यह परिवर्तन गलती से ओवरराइट न हो जाए (या कोई दूसरा प्रोग्रामर आपके परिवर्तन को ओवरराइट न कर दे, या आप स्वयं अनजाने में किसी और का परिवर्तन ओवरराइट न कर दें)।
तो चलिए अपना कस्टम मॉड्यूल बनाते हैं। फ़ोल्डर बनाएं: /modules/custom/drupalbook
। इस फ़ोल्डर में हमें drupalbook.info.yml
फ़ाइल बनानी होगी:
name: DrupalBook
description: Custom module for learning Drupal 8
type: module
core: 8.x
core_version_requirement: ^8 || ^9
package: DrupalBook
*.info.yml
फ़ाइल मॉड्यूल के विवरण के लिए जिम्मेदार होती है। इसमें दी गई जानकारी Extend पृष्ठ पर दिखाई देगी। फ़ाइल का नाम मॉड्यूल के नाम + .info.yml
से बनता है।
Drupal YML फ़ाइलें कॉन्फ़िगरेशन और सेटिंग्स के लिए एक मानक प्रारूप हैं। YML फ़ाइलों में फ़ील्ड और मान को कोलन से अलग किया जाता है, और नई पंक्तियाँ दो स्पेस की इंडेंटेशन से शुरू होती हैं। YML फ़ाइल के लिए फ़ॉर्मेटिंग बहुत महत्वपूर्ण है — यदि फ़ॉर्मेटिंग में गलती हुई, एक अतिरिक्त स्पेस या कोलन छूट गया, तो Drupal त्रुटि दे सकता है या फ़ाइल को सही ढंग से नहीं पढ़ पाएगा।
Extend पृष्ठ पर जाएँ और अपने मॉड्यूल को सक्षम करें:
अब जब हमारा मॉड्यूल सक्रिय है, तो हम उसमें कार्यक्षमता जोड़ सकते हैं और यह हमारी साइट पर काम करेगा। शुरुआत के लिए, हम पेज पर साधारण टेक्स्ट प्रदर्शित करेंगे। इसके लिए हमें एक और YML फ़ाइल बनानी होगी — drupalbook.routing.yml
:
drupalbook.first_page:
path: '/first-page'
defaults:
_controller: '\Drupal\drupalbook\Controller\FirstPageController::content'
_title: 'Hello World!'
requirements:
_permission: 'access content'
आइए देखें कि इस YML फ़ाइल में क्या है:
drupalbook.first_page: — यह हमारे रूट का नाम है। यह वह नाम है जिसके द्वारा Drupal सभी रूट्स की सूची तैयार करेगा। यह नाम अद्वितीय होना चाहिए, इसलिए मॉड्यूल का नाम और रूट का नाम एक साथ उपयोग करना बेहतर है, जैसे: drupalbook.first_page
, drupalbook.second_page
आदि।
path: '/first-page' — आपके रूट का URL पथ। ध्यान दें कि दो स्पेस की इंडेंटेशन अनिवार्य है, इसलिए यदि आपका टेक्स्ट एडिटर टैब दबाने पर टैबुलेशन जोड़ता है, तो इसे बदलकर दो स्पेस का उपयोग करें।
defaults: — रूट की डिफ़ॉल्ट सेटिंग्स और उसके निर्माण के तरीके को निर्धारित करता है। Drupal में रूट बनाने के कई तरीके हैं — उनमें से एक है Controller क्लास के माध्यम से। Drupal का रूटिंग सिस्टम Symfony से लिया गया है और Symfony की लाइब्रेरीज़ का उपयोग करता है। Symfony एक MVC फ्रेमवर्क है जो बहुत सुव्यवस्थित है और Laravel जैसे अन्य फ्रेमवर्क में भी उपयोग किया जाता है। MVC का अर्थ है Model, View, Controller (यहाँ View का अर्थ Views मॉड्यूल नहीं है, बल्कि जानकारी प्रदर्शित करने का टेम्पलेट है; Model — एंटिटी क्लास हैं जिनसे डेटाबेस में जानकारी जोड़ी जा सकती है, जैसा कि Drupal में Entity API करती है)। Controller का उपयोग रूटिंग के लिए किया जाता है, और हम इसी का उपयोग इस पाठ में करेंगे।
_controller: '\Drupal\drupalbook\Controller\FirstPageController::content' — इस पैरामीटर में हम यह निर्धारित करते हैं कि कौन सी PHP क्लास हमारा पृष्ठ प्रदर्शित करेगी। क्लास के नाम के बाद ::
का उपयोग करके हम बताते हैं कि उस क्लास की कौन सी मेथड को कॉल करना है। इतने सारे बैकस्लैश का उपयोग इसलिए किया जाता है ताकि Drupal समझ सके कि आपकी PHP क्लास किस फ़ोल्डर में स्थित है।
_title: 'Hello World!' — हमारे पेज का शीर्षक।
_permission: 'access content' — इस पेज को देखने की अनुमति, उपयोगकर्ता के पास यह अधिकार होना चाहिए।
रूटिंग के लिए YML फ़ाइल जोड़ने के बाद, हमें अपने पेज को प्रदर्शित करने के लिए एक PHP क्लास जोड़नी होगी। Drupal PSR-4 ऑटोलोडिंग मानक का उपयोग करता है:
https://www.php-fig.org/psr/psr-4/
आइए रूट की उस पंक्ति को देखें जहां हमने PHP क्लास को निर्दिष्ट किया है:
\Drupal\drupalbook\Controller\FirstPageController
\Drupal
का अर्थ है कि यह क्लास Drupal लाइब्रेरी का उपयोग करके कनेक्ट की जा रही है। Drupal अब एक अलग लाइब्रेरी भी है जिसे packagist से जोड़ा जा सकता है:
https://packagist.org/packages/drupal/drupal
इसके बाद, हम यह निर्दिष्ट करते हैं कि कौन सा मॉड्यूल उपयोग किया जाएगा:
\drupalbook
उसके बाद, हम या तो क्लास का नाम देते हैं या अंदर के फ़ोल्डर को निर्दिष्ट करते हैं। ये सभी फ़ोल्डर्स src
फ़ोल्डर के अंदर होंगे:
/modules/custom/drupalbook/src/Controller
कैस पर ध्यान दें — PHP केस सेंसिटिव है, इसलिए controller
और Controller
दो अलग-अलग फ़ोल्डर्स हैं।
और अंत में, हम फ़ाइल का नाम निर्दिष्ट करते हैं और उसमें .php
जोड़ते हैं:
/modules/custom/drupalbook/src/Controller/FirstPageController.php
आइए यह फ़ाइल बनाएँ:
/**
* @return
* Contains \Drupal\drupalbook\Controller\FirstPageController.
*/
namespace Drupal\drupalbook\Controller;
/**
* Provides route responses for the DrupalBook module.
*/
class FirstPageController {
/**
* Returns a simple page.
*
* @return array
* A simple renderable array.
*/
public function content() {
$element = array(
'#markup' => 'Hello World!',
);
return $element;
}
}
फ़ाइलों की संरचना इस प्रकार होनी चाहिए:
अब हमें कैश साफ़ करना होगा ताकि हमारा नया रूट कनेक्ट हो सके। और पेज इस पते पर खुलना चाहिए: http://drupalbook/first-page
अब आइए उस PHP क्लास को देखें जो यह पेज प्रदर्शित करती है:
/**
* @return
* Contains \Drupal\drupalbook\Controller\FirstPageController.
*/
यहां हम वही पथ निर्दिष्ट करते हैं जैसा कि रूटिंग YML फ़ाइल में है। यह दिखाता है कि Drupal को यह क्लास कहाँ से लोड करनी है।
namespace Drupal\drupalbook\Controller;
namespace
आपके क्लास फ़ाइल का पथ बताता है। जब आप किसी अन्य साइट से कोड कॉपी करते हैं, तो namespace
बदलना न भूलें — अपने मॉड्यूल का नाम सही करें। मेरे मामले में यह drupalbook
है, आपके मामले में कुछ और हो सकता है।
class FirstPageController {
/**
* Returns a simple page.
*
* @return array
* A simple renderable array.
*/
public function content() {
$element = array(
'#markup' => 'Hello World!',
);
return $element;
}
}
यह हमारी क्लास है जो पेज को प्रदर्शित करती है। इसमें content()
मेथड है जिसे हमने drupalbook.routing.yml
में निर्दिष्ट किया है। इस मेथड में हम #markup
एलिमेंट के साथ एक एरे लौटाते हैं जिसमें आउटपुट में HTML होता है। हम स्ट्रिंग के बजाय एरे लौटाते हैं क्योंकि इस तरीके से न केवल HTML, बल्कि JSON API एंडपॉइंट, XML या CSV फ़ाइल भी प्रदर्शित की जा सकती है।
मॉड्यूल का कोड GitHub पर देखा जा सकता है:
https://github.com/levmyshkin/drupalbook8
बस इतना ही — अगले पाठ में हम अपने मॉड्यूल की क्षमताओं का विस्तार करना जारी रखेंगे।