logo

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - नया लेआउट बिल्डर अनुभव❗

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - स्टाइलिश, कस्टमाइज़ेबल ब्लॉक टाइप्स: स्लाइडशो, टैब्स, कार्ड्स, एकॉर्डियन्स और कई अन्य। बैकग्राउंड, DOM बॉक्स, जावास्क्रिप्ट प्लगइन्स के लिए बिल्ट-इन सेटिंग्स। आज ही लेआउट बिल्डिंग का भविष्य अनुभव करें।

डेमो EBT मॉड्यूल्स EBT मॉड्यूल्स डाउनलोड करें

❗एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - नया पैराग्राफ्स अनुभव

एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - एनालॉजिकल पैराग्राफ आधारित मॉड्यूल्स का सेट।

डेमो EPT मॉड्यूल्स EPT मॉड्यूल्स डाउनलोड करें

स्क्रॉल

9.3. एक कस्टम Drupal मॉड्यूल बनाएं। पेज को प्रोग्रामेटिक रूप से प्रदर्शित करें।

17/10/2025, by Ivan

Menu

आइए हम अपने मॉड्यूल को थोड़ी व्यवस्था के साथ बनाना शुरू करें। आइए कस्टम और कॉन्ट्रिब्यूटेड मॉड्यूल्स को अलग-अलग रखना जारी रखें। Drupal में मॉड्यूल्स /modules फ़ोल्डर में होते हैं। अब हमें उन्हें /sites/all/modules में गहराई तक रखने की आवश्यकता नहीं है, हालांकि readme में कहा गया है कि यह काम करेगा, फिर भी /modules फ़ोल्डर का उपयोग करें। /modules फ़ोल्डर के अंदर हम दो फ़ोल्डर बनाएंगे — custom और contribcontrib फ़ोल्डर में हम drupal.org से डाउनलोड किए गए अतिरिक्त मॉड्यूल्स रखेंगे, और हमारे कस्टम मॉड्यूल्स custom फ़ोल्डर में संग्रहीत होंगे।

अंग्रेज़ी उपशीर्षक:

कोड उदाहरण GitHub पर देखे जा सकते हैं:

https://github.com/levmyshkin/drupalbook8

मॉड्यूल्स को contrib और custom फ़ोल्डर में विभाजित करना एक छोटी सी बात लगती है, लेकिन विश्वास कीजिए, जब आपकी साइट पर 200 contributed मॉड्यूल्स और 30 custom मॉड्यूल्स होंगे, तब आपको समझ आएगा कि सभी custom मॉड्यूल्स और कोड को ढूंढना कितना कठिन होता है। साथ ही, यदि आप किसी contributed मॉड्यूल के कोड में कुछ परिवर्तन करते हैं (जो केवल अत्यावश्यक स्थिति में किया जाना चाहिए), तो इसे custom फ़ोल्डर में स्थानांतरित करना अच्छा होगा ताकि अपडेट के दौरान यह परिवर्तन गलती से ओवरराइट न हो जाए (या कोई दूसरा प्रोग्रामर आपके परिवर्तन को ओवरराइट न कर दे, या आप स्वयं अनजाने में किसी और का परिवर्तन ओवरराइट न कर दें)।

modules

तो चलिए अपना कस्टम मॉड्यूल बनाते हैं। फ़ोल्डर बनाएं: /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 पृष्ठ पर जाएँ और अपने मॉड्यूल को सक्षम करें:

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

फ़ाइलों की संरचना इस प्रकार होनी चाहिए:

contrib

अब हमें कैश साफ़ करना होगा ताकि हमारा नया रूट कनेक्ट हो सके। और पेज इस पते पर खुलना चाहिए: http://drupalbook/first-page

drupalbook

अब आइए उस 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

बस इतना ही — अगले पाठ में हम अपने मॉड्यूल की क्षमताओं का विस्तार करना जारी रखेंगे।