logo

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

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

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

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

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

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

स्क्रॉल

नए EBT मॉड्यूल्स बनाना

28/09/2025, by Ivan

नया EBT मॉड्यूल बनाने का सबसे आसान तरीका Drush कमांड (Drush 12+ के लिए) है। इस कमांड का उपयोग करने के लिए, आपको EBT कोर Starterkit मॉड्यूल सक्षम करना होगा:

EBT Starterkit

इसके बाद जनरेटर EBT मॉड्यूल्स उपलब्ध होंगे:

drush generate ebt:module

मशीन नाम ebt_* प्रीफ़िक्स से शुरू करें, यह सभी EBT मॉड्यूल्स के काम करने के लिए आवश्यक है।

EBT मॉड्यूल जनरेट

आप EBT कोर मॉड्यूल्स फ़ोल्डर में भी EBT Starterkit का उपयोग कर सकते हैं। बस फ़ाइलों में सभी ebt_starterkit को अपने नए EBT मॉड्यूल के मशीन नाम से बदलें।

https://www.drupal.org/project/ebt_core

या EBT टेक्स्ट मॉड्यूल की कॉपी करें और उसमें मशीन नाम बदल दें।

https://www.drupal.org/project/ebt_text

क्योंकि, यह सबसे सरल EBT मॉड्यूल है और इसमें सभी बेसिक EBT सेटिंग्स शामिल हैं।

EBT मॉड्यूल चरण दर चरण बनाना

मौजूदा EBT टेक्स्ट मॉड्यूल को बोइलरप्लेट के रूप में कॉपी करें या drush generate ebt:module कमांड का उपयोग करें।

EBT टेक्स्ट मॉड्यूल में निम्नलिखित फ़ोल्डर्स होते हैं:
/ebt_text/config/install - इसमें EBT टेक्स्ट ब्लॉक प्रकार और फ़ील्ड इंस्टेंसेज़ के लिए कॉन्फ़िग्स होते हैं। अन्य EBT मॉड्यूल्स में पैराग्राफ प्रकार और फ़ील्ड स्टोरेज के लिए कॉन्फ़िग्स हो सकते हैं।
/ebt_text/templates - यहाँ block--block-content--ebt-text.html.twig टेम्पलेट होता है जो कंटेंट ब्लॉक के लिए है, जिसे ब्लॉक लेआउट पेज में उपयोग किया जा सकता है, और block--inline-block--ebt-text.html.twig टेम्पलेट Layout Builder इनलाइन ब्लॉक्स के लिए है।
/ebt_text/tests - यहाँ EBT मॉड्यूल्स के लिए टेस्ट होते हैं, अभी केवल एक इंस्टॉलेशन मॉड्यूल का टेस्ट है।

और अन्य सामान्य Drupal मॉड्यूल फाइलें: composer.json, ebt_text.info.yml, readme.md। आप आधिकारिक डॉक्यूमेंटेशन में कस्टम Drupal मॉड्यूल बनाने के बारे में अधिक पढ़ सकते हैं:

https://www.drupal.org/docs/develop/creating-modules

मैं एक नया मॉड्यूल EBT Countdown बनाऊँगा जो इस जावास्क्रिप्ट प्लगइन FlipDown का उपयोग करेगा:

https://github.com/PButcher/flipdown

FlipCount.js

Github रिपॉज़िटरी को फोर्क करें और उसे Packagist पर सबमिट करें

सभी तृतीय पक्ष (3rd party) लाइब्रेरीज़ को फोर्क करके Packagist पर रखना चाहिए, उदाहरण के लिए:

https://packagist.org/packages/levmyshkin/flexslider

से:

https://github.com/levmyshkin/flexslider

फिर Composer इन्हें सामान्य Packagist लाइब्रेरीज़ की तरह डाउनलोड कर सकता है। इन तृतीय पक्ष लाइब्रेरीज़ में "type": "drupal-library" होना चाहिए, और ये डिफ़ॉल्ट रूप से /libraries फ़ोल्डर में डाउनलोड होंगी:
https://github.com/levmyshkin/flexslider/blob/master/composer.json

EBT लाइब्रेरी

आइए FlipDown के लिए Github रिपॉज़िटरी फोर्क करें।

गिट रिपॉज़िटरी को फोर्क करना थोड़ा असामान्य लग सकता है, बजाय सीधे स्रोत गिट रिपॉज़िटरी का उपयोग करने के। लेकिन मेरा मानना है कि मुख्य composer.json फ़ाइल में रिपॉज़िटरी लिंक जोड़ने जैसी प्रक्रियाओं से बचकर EBT मॉड्यूल्स का उपयोग करना आसान होगा। सोचिए, नए उपयोगकर्ताओं के लिए Composer इंस्टॉल करना, composer.json फ़ाइल को मैन्युअली अपडेट करना और रिपॉज़िटरी स्रोत सही जगह पर डालना कितना कठिन है। अपनी स्वयं की Packagist लाइब्रेरी के साथ इंस्टॉलेशन प्रक्रिया सरल हो जाती है। तो चलिए सभी तृतीय पक्ष लाइब्रेरीज़ को Packagist पर रखें।

फोर्क गिट रिपॉज़िटरी

गिट रिपॉज़िटरी फोर्क करते समय आप रिपॉज़िटरी का नाम बदल सकते हैं। इसे साफ़ रखें, कैपिटल लेटर्स और विशेष कैरेक्टर्स का उपयोग न करें। डैश (-) और अंडरस्कोर (_) का उपयोग ठीक है।

रिपॉज़िटरी का नाम बदलें

अब हमारे पास नई गिट रिपॉज़िटरी है:

https://github.com/levmyshkin/flipdown

अब हमें इस रिपॉज़िटरी में "type": "drupal-library" के साथ composer.json फ़ाइल जोड़नी होगी:

git add composer.json
git commit -m 'Add Composer.json file'
git push origin master

यहाँ composer.json फ़ाइल है:

https://github.com/levmyshkin/flipdown/blob/master/composer.json

यदि आप अपनी नई गिट रिपॉज़िटरी में टैग चेक करते हैं, तो यह खाली होगा:

git tag

गिट टैग्स

आमतौर पर मैं स्रोत रिपॉज़िटरी का वर्ज़न फ़ॉलो करता हूँ, उदाहरण के लिए यदि लाइब्रेरी का नवीनतम वर्ज़न 1.4.6 था, तो मैं माइनर वर्ज़न बढ़ाकर 1.4.7 कर देता हूँ। FlipDown रिपॉज़िटरी में कोई टैग या रिलीज़ नहीं था, इसलिए मैंने नई रिपॉज़िटरी के लिए 1.0.0 वर्ज़न बनाया:

git tag 1.0.0
git push origin 1.0.0

हमें नए टैग की ज़रूरत है क्योंकि इसमें हमारा नया composer.json "type": "library" के साथ शामिल है।

हम जावास्क्रिप्ट लाइब्रेरी को सीधे मॉड्यूल के अंदर क्यों कॉपी नहीं कर सकते?

हम केवल GPL लाइसेंस के तहत आने वाली लाइब्रेरीज़ कॉपी कर सकते हैं, लेकिन आमतौर पर जावास्क्रिप्ट लाइब्रेरीज़ MIT लाइसेंस का उपयोग करती हैं। तकनीकी रूप से यह संभव है, लेकिन Drupal.org के नियमों द्वारा इसकी अनुमति नहीं है:
https://www.drupal.org/about/licensing

आइए FlipDown लाइब्रेरी को packagist.org पर सबमिट करें:

https://packagist.org/packages/submit

Packagist पर नई लाइब्रेरी सबमिट करें

यदि आपने लाइब्रेरी सबमिट की और "type": "drupal-library" वाला composer.json जोड़ना भूल गए, तो चिंता न करें, बस composer.json फ़ाइल जोड़ें और अपनी गिट रिपॉज़िटरी के लिए नया टैग बनाएँ। यह टैग स्वतः Packagist पर पुश हो जाएगा।

यहाँ FlipDown के लिए Packagist लाइब्रेरी पेज है:

https://packagist.org/packages/levmyshkin/flipdown

Packagist लाइब्रेरी

सुनिश्चित करें कि आपके Packagist पेज पर drupal-library टाइप हो।

आइए वापस अपनी Drupal फ़ाइलों में जाएँ और ebt_text फ़ोल्डर कॉपी करें, मैं नए मॉड्यूल का नाम ebt_countdown रखूँगा:

EBT Countdown मॉड्यूल

हमें करना होगा:

- /config/install में कॉन्फ़िग्स हटाएँ, हम बाद में नए कॉन्फ़िग्स एक्सपोर्ट करेंगे

- सभी ebt_text को ebt_countdown से बदलें

- फ़ाइलों का नाम बदलें ताकि "text" की जगह "countdown" हो

- ebt_countdown.info.yml और README.md फ़ाइलों में मॉड्यूल विवरण के टेक्स्ट अपडेट करें।

मैं गिट में हर स्टेप को अलग-अलग कमिट करूँगा ताकि आप अपडेट्स को चरण दर चरण देख सकें:

git clone https://git.drupalcode.org/project/ebt_countdown.git

गिट इतिहास
 

अब हमारे पास अपने मॉड्यूल के लिए बोइलरप्लेट है और हम Drupal.org पर बदलाव पुश कर सकते हैं।

Drupal.org पर मॉड्यूल प्रोजेक्ट बनाएँ

आइए drupal.org साइट पर प्रोजेक्ट जोड़ने वाले पेज पर जाएँ:

https://www.drupal.org/node/add

Drupal.org कंटेंट जोड़ें

हमें मॉड्यूल प्रोजेक्ट जोड़ने की आवश्यकता है:

https://www.drupal.org/node/add/project-module

नाम: Extra Block Types (EBT): Countdown
प्रोजेक्ट प्रकार: Full project
शॉर्ट नाम: ebt_countdown
रखरखाव स्थिति: सक्रिय रूप से मेंटेन किया गया
डेवलपमेंट स्थिति: सक्रिय विकासाधीन
मॉड्यूल श्रेणियाँ: कंटेंट, कंटेंट डिस्प्ले
ईकोसिस्टम: Extra Block Types (EBT): Core (3191928)

नया Drupal प्रोजेक्ट बनाएँ

विवरण फ़ील्ड में मैं आमतौर पर उपलब्ध सभी EBT मॉड्यूल्स की सूची डालता हूँ:

Extra Block Types: Countdown मॉड्यूल एक एनिमेटेड काउंटडाउन वाला ब्लॉक जोड़ने की सुविधा प्रदान करता है।

EBT UI के माध्यम से काउंटडाउन के लिए स्टाइल चुनने की अनुमति देता है।

EBT मॉड्यूल्स कुछ क्लिक में Layout Builder में विभिन्न ब्लॉक्स जोड़ने की सुविधा देते हैं। आप इस EBT मॉड्यूल्स के समूह से अलग-अलग ब्लॉक प्रकार इंस्टॉल कर सकते हैं:
<ul>
  <li><a href="https://www.drupal.org/project/ebt_accordion" title="EBT Accordion / FAQ">EBT Accordion / FAQ</a></li>
  <li><a href="https://www.drupal.org/project/ebt_basic_button" title="EBT Basic Button">EBT बेसिक बटन</a></li>
  <li><a href="https://www.drupal.org/project/ebt_bootstrap_button" title="EBT Bootstrap Button">EBT बूटस्ट्रैप बटन</a></li>
  <li><a href="https://www.drupal.org/project/ebt_cta" title="EBT Call to Action">EBT कॉल टू एक्शन</a>
  <li><a href="https://www.drupal.org/project/ebt_carousel" title="EBT Tabs">EBT कैरोसेल</a>
  <li><a href="https://www.drupal.org/project/ebt_counter" title="EBT Counter">EBT काउंटर</a>
  <li><a href="https://www.drupal.org/project/ebt_image_gallery">EBT इमेज गैलरी</a></li>
  <li><a href="https://www.drupal.org/project/ebt_quote" title="EBT Quote">EBT उद्धरण</a></li>
  <li><a href="https://www.drupal.org/project/ebt_slick_slider">EBT स्लिक स्लाइडर</a></li>
  <li><a href="https://www.drupal.org/project/ebt_slideshow">EBT स्लाइडशो</a></li>
  <li><a href="https://www.drupal.org/project/ebt_stats">EBT आँकड़े</a></li>
  <li><a href="https://www.drupal.org/project/ebt_tabs" title="EBT Tabs">EBT टैब्स</a></li>
  <li><a href="https://www.drupal.org/project/ebt_text">EBT टेक्स्ट</a></li>
  <li><a href="https://www.drupal.org/project/ebt_timeline">EBT टाइमलाइन</a></li>
  <li><a href="https://www.drupal.org/project/ebt_webform">EBT वेबफॉर्म</a></li>
  <li><a href="https://www.drupal.org/project/ebt_webform_popup">EBT वेबफॉर्म पॉपअप</a></li>
</ul>

सभी EBT ब्लॉक प्रकारों में EBT ब्लॉक्स के लिए डिफ़ॉल्ट विजेट होता है, जिसमें डिज़ाइन विकल्प होते हैं:
<ul>
<li>CSS बॉक्स (मार्जिन, पैडिंग, बॉर्डर)</li>
<li>बैकग्राउंड: रंग, इमेज (पैरालैक्स और कवर सहित), वीडियो (Youtube)</li>
<li>एज टू एज, कंटेनर चौड़ाई</li>
</ul>

EBT ब्लॉक्स के बारे में अधिक पढ़ें EBT Core मॉड्यूल पेज पर:
https://www.drupal.org/project/ebt_core

<div class="container">
<div class="panel-layout capricorn pane-bundle-cta-multiple">
  <div class="panel-pane pane-fieldable-panels-pane pane-vid-10729 d-sponsor pane-bundle-cta pane-fpid-422">
   <div class="pane-content">
    <div class="fieldable-panels-pane pane-style-full nographic pane-style-supporter">
     <div class="pane-title pane-bundle-cta-multiple">
       <h3>क्या आपको एक और Extra Block Type चाहिए?</h3>

       <a class="button-link" target="_blank" href="http://drupalbook.org/contact" title="DrupalBook">हमसे संपर्क करें</a>

       <a href="http://drupalbook.org/contact" title="DrupalBook"  target="_blank"><img src="/files/logo.svg__1.png" alt="DrupalBook लोगो" width="85" /></a>
     </div>
   </div>
   </div>
  </div>
</div>
</div>

अब हमारे पास Drupal.org पर Drupal मॉड्यूल प्रोजेक्ट पेज है:
https://www.drupal.org/project/ebt_countdown

Version Control टैब पर आप निर्देश देख सकते हैं कि अपनी लोकल गिट रिपॉज़िटरी के लिए रिमोट ओरिजिन कैसे जोड़ें:

https://www.drupal.org/project/ebt_countdown/git-instructions

Drupal प्रोजेक्ट वर्ज़न कंट्रोल

प्रारंभिक कमिट के बाद आपको अन्य EBT मॉड्यूल्स के मुख्य संस्करण को फ़ॉलो करने के लिए एक नई ब्रांच बनानी चाहिए, अभी यह 1.4.x है।

अब हम अपने मॉड्यूल के लिए नई कार्यक्षमता जोड़ना शुरू कर सकते हैं। प्रक्रिया कस्टम मॉड्यूल डेवलपमेंट जैसी ही है: हम ब्लॉक प्रकार बनाएँगे, फ़ील्ड्स जोड़ेंगे, css/js एसेट्स शामिल करेंगे।

EBT Countdown की कार्यक्षमता बनाना शुरू करें

चरण 1. EBT Countdown ब्लॉक प्रकार बनाना। यदि आपने इसे Drush से जनरेट किया है तो बस मॉड्यूल इंस्टॉल करें।

यदि आपने मॉड्यूल को Drush से जनरेट किया है तो बस इसे इंस्टॉल करें।

सबसे पहले, हमें एक नया ब्लॉक प्रकार EBT Countdown बनाना होगा:

/admin/structure/block/block-content/types/add

नया ब्लॉक प्रकार बनाएँ

यह आवश्यक है कि मशीन नाम ebt_ से शुरू हो, इसलिए आमतौर पर मैं ब्लॉक प्रकारों का नाम EBT से शुरू करता हूँ, फिर मशीन नाम स्वचालित रूप से सही तरीके से जेनरेट हो जाता है। क्या ब्लॉक प्रकार का मशीन नाम मॉड्यूल के नाम से मेल खाना चाहिए? हाँ, यह स्थिरता के लिए अच्छा है और सुनिश्चित करता है कि किसी अन्य EBT मॉड्यूल का वही मशीन नाम न हो। ब्लॉक प्रकार का मशीन नाम ebt_ से शुरू होना चाहिए, क्योंकि यह थीम फ़ोल्डर की बजाय मॉड्यूल्स में टेम्पलेट्स को ओवरराइड करने के लिए आवश्यक है, देखें ebt_core_theme_registry_alter() फ़ंक्शन ebt_core मॉड्यूल में।

अब हम EBT सेटिंग्स फ़ील्ड जोड़ सकते हैं, यह सभी EBT मॉड्यूल्स के लिए आवश्यक है। हमें मौजूदा फ़ील्ड EBT Settings: field_ebt_settings जोड़ना चाहिए:

EBT सेटिंग्स फ़ील्ड जोड़ें

EBT सेटिंग्स, EBT कोर मॉड्यूल से एक सामान्य फ़ील्ड है, यह DOM बॉक्स, बैकग्राउंड, स्पेसिंग और चौड़ाई सेटिंग्स प्रदान करता है।

क्योंकि हमें तिथि तक काउंटडाउन चाहिए, हमें टाइमस्टैम्प डेट फ़ील्ड होना चाहिए। आइए इसे भी जोड़ें:

तिथि फ़ील्ड बनाएँ

मैंने मशीन-पठनीय नाम के लिए ebt_ जोड़ा है, लेकिन यहाँ इसकी आवश्यकता नहीं है। यह field_countdown_date भी हो सकता है। हमारे पास ब्लॉक के लिए डिफ़ॉल्ट बॉडी और शीर्षक फ़ील्ड भी हैं, इसलिए यह काउंटडाउन ब्लॉक के लिए पर्याप्त होगा।

आमतौर पर EBT मॉड्यूल्स के लिए हम एडिट फॉर्म पर हॉरिज़ॉन्टल टैब्स रखते हैं:

फॉर्म डिस्प्ले प्रबंधित करें

यह आवश्यक नहीं है, लेकिन सामग्री और सेटिंग्स को अलग करना अच्छा है, क्योंकि हमारे पास ब्लॉक्स के लिए बहुत सारी सेटिंग्स होती हैं।

पैरेंट फ़ील्ड ग्रुप टैब्स होना चाहिए, जिसमें Direction Horizontal और Width Breakpoint 120 (या कोई छोटा नंबर) हो:

टैब्स सेटिंग्स

अब हम ब्लॉक प्रकार बना सकते हैं, आइए EBT Countdown मॉड्यूल सक्षम करें, ताकि ब्लॉक प्रकार के लिए टेम्पलेट्स लागू हो जाएँ:

/admin/modules

EBT Countdown सक्षम करें

आपको Layout Builder मॉड्यूल भी सक्षम करना होगा और किसी भी कंटेंट प्रकार के लिए लेआउट बिल्डर सक्षम करना होगा, उदाहरण के लिए बेसिक पेज के लिए।

/admin/structure/types/manage/page/display

Drupal EBT Countdown

जब आप नया पेज बनाते हैं, तो आप पेज लेआउट में ब्लॉक्स जोड़ सकेंगे।

EBT Countdown

और हमारे पास पेज पर क्या है:

EPT Countdown

 

चरण 2. EBT मॉड्यूल्स में तृतीय पक्ष (3rd party) लाइब्रेरीज़ शामिल करें

अब हम अपनी तृतीय पक्ष (3rd party) लाइब्रेरी शामिल कर सकते हैं। हमारे पास composer.json में levmyshkin/flipdown लाइब्रेरी है, लेकिन यह नया मॉड्यूल एक कस्टम मॉड्यूल है, इसलिए हमें इस लाइब्रेरी को composer से मैन्युअली इंस्टॉल करना होगा:

composer require levmyshkin/flipdown

नई लाइब्रेरी स्वचालित रूप से libraries फ़ोल्डर में रखी जानी चाहिए:

flipdown इंस्टॉल करें

आइए ebt_countdown.libraries.yml फ़ाइल जोड़ें और उसमें flipdown css/js और जावास्क्रिप्ट फ़ाइल ebt_flipdown/js/ebt_countdown.js शामिल करें, जहाँ बाद में हम flipdown प्लगइन को इनिशियलाइज़ करेंगे:

ebt_countdown.libraries.yml

ebt_countdown:
  css:
    component:
      /libraries/flipdown/dist/flipdown.min.css: { minified: true }
  js:
    /libraries/flipdown/dist/flipdown.min.js: { minified: true }
    js/ebt_countdown.js: {}

/libraries फ़ोल्डर की फ़ाइलों के लिए हम शुरुआत में स्लैश का उपयोग करते हैं, ताकि यह एब्सोल्यूट पाथ हो।

js/ebt_countdown.js:

(function ($, Drupal) {

  /**
   * EBT Countdown व्यवहार।
   */
  Drupal.behaviors.ebtCountDown = {
    attach: function (context, settings) {

    };
  }

})(jQuery, Drupal);

और हमें नए ebt_countdown लाइब्रेरी को टेम्पलेट्स में शामिल करना होगा, ध्यान रखें कि हमारे पास दो टेम्पलेट्स हैं:

{{ attach_library('ebt_countdown/ebt_countdown') }}

Drupal टेम्पलेट्स

कैश साफ़ करें और जाँचें कि आपके जावास्क्रिप्ट फ़ाइलें पेज पर मौजूद हैं:

जावास्क्रिप्ट फ़ाइल जोड़ें

हम तारीख को PHP से जावास्क्रिप्ट में drupalSettings के जरिए पास करेंगे। इसलिए हमें अपने ebt_countdown.libraries.yml फ़ाइल को dependencies के साथ एक्सटेंड करना चाहिए। साथ ही हम once() फ़ंक्शन का उपयोग करेंगे:

  dependencies:
    - core/once
    - core/drupalSettings

चरण 3. EBT सेटिंग्स के लिए अपना फ़ील्ड विजेट शामिल करें, वेरिएबल्स को जावास्क्रिप्ट में पास करें

EBT मॉड्यूल्स में सेटिंग्स डिफ़ॉल्ट रूप से जावास्क्रिप्ट में पास नहीं होती हैं। हमें फ़ील्ड विजेट क्लास EbtSettingsDefaultWidget को ओवरराइड करने की आवश्यकता है:

ebt_countdown/src/Plugin/Field/FieldWidget/EbtSettingsCountDownWidget.php:

<?php

namespace Drupal\ebt_countdown\Plugin\Field\FieldWidget;

use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\ebt_core\Plugin\Field\FieldWidget\EbtSettingsDefaultWidget;

/**
 * 'ebt_settings_countdown' विजेट का प्लगइन इम्प्लीमेंटेशन।
 *
 * @FieldWidget(
 *   id = "ebt_settings_countdown",
 *   label = @Translation("EBT Countdown सेटिंग्स"),
 *   field_types = {
 *     "ebt_settings"
 *   }
 * )
 */
class EbtSettingsCountDownWidget extends EbtSettingsDefaultWidget {

  /**
   * {@inheritdoc}
   */
  public function formElement(FieldItemListInterface $items, $delta, array $element, array &$form, FormStateInterface $form_state) {
    $element = parent::formElement($items, $delta, $element, $form, $form_state);

    $element['ebt_settings']['pass_options_to_javascript'] = [
      '#type' => 'hidden',
      '#value' => TRUE,
    ];

    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
    foreach ($values as &$value) {
      $value += ['ebt_settings' => []];
    }
    return $values;
  }

}

अब हम इस फ़ील्ड विजेट को EBT Settings फ़ील्ड के लिए चुन सकते हैं:

/admin/structure/block/block-content/manage/ebt_countdown/form-display

Drupal सेटिंग्स

आइए अपने ब्लॉक को दोबारा सेव करें और drupalSettings जावास्क्रिप्ट वेरिएबल चेक करें। अब EBT Settings फ़ील्ड से सभी विकल्प जावास्क्रिप्ट में पास हो जाएँगे:

जावास्क्रिप्ट वेरिएबल

block-revision-id-* के अंत में हमारे पास ब्लॉक रिविज़न ID है, इसलिए हमारे पास सभी ब्लॉक्स के लिए यूनिक कीज़ हैं। इनलाइन ब्लॉक्स के लिए हम प्लगइन ID plugin-id-block-contentd202c374-f31b-4f7e-8a0d-12842a1422ff का उपयोग करते हैं। इसलिए हमारे पास Layout Builder में यूनिक IDs हैं।

FlipDown प्लगइन में लाइट/डार्क थीम का विकल्प है, तो आइए इस सेटिंग फ़ील्ड को हमारे फ़ील्ड विजेट EbtSettingsCountDownWidget में पास करें:

    $element['ebt_settings']['color_theme'] = [
      '#title' => $this->t('रंग थीम'),
      '#type' => 'radios',
      '#options' => [
        'dark' => $this->t('डार्क'),
        'light' => $this->t('लाइट'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['color_theme'] ?? 'dark',
      '#description' => $this->t('काउंटडाउन के लिए रंग थीम चुनें'),
      '#weight' => '3',
    ];

थीम रंग

फिर हम जावास्क्रिप्ट में थीम रंग का मान प्राप्त कर सकते हैं:

जावास्क्रिप्ट मान

चरण 4. EBT Countdown ब्लॉक के लिए FlipDown प्लगइन इनिशियलाइज़ करें

हमने सेटिंग्स से वेरिएबल्स को जावास्क्रिप्ट में पास किया, लेकिन हमें कंटेंट से डेट वैल्यू भी जावास्क्रिप्ट में पास करनी होगी। हम एक खाली div बनाएँगे जिसमें attribute data-date="" होगा, जहाँ हम Date फ़ील्ड से दिनांक और समय डालेंगे। इनलाइन-ब्लॉक (Layout Builder में ब्लॉक्स) के लिए हम ब्लॉक का यूनिक ID परिभाषित करने के लिए block_revision_id का उपयोग करेंगे:

block--inline-block--ebt-countdown.html.twig:

    <div
      class="ebt-countdown-date ebt-countdown-inline-block flipdown"
      id="block-id-{{ configuration.block_revision_id }}"
      data-date="{{ content.field_ebt_countdown_date[0]['#attributes']['datetime']|date('U') }}">
    </div>

इनलाइन ब्लॉक काउंटडाउन

Block Layout पेज से कंटेंट ब्लॉक्स के लिए हम plugin_id का उपयोग करेंगे:

block--block-content--ebt-countdown.html.twig:

    <div
      class="ebt-countdown-date ebt-countdown-block-content flipdown"
      id="block-id-{{ plugin_id|clean_class }}"
      data-date="{{ content.field_ebt_countdown_date[0]['#attributes']['datetime']|date('U') }}">
    </div>

EBT काउंटडाउन ब्लॉक

यदि आपको यकीन नहीं है कि फ़ील्ड डेटा कहाँ है, तो आप Twig Debugger मॉड्यूल इंस्टॉल कर सकते हैं और पेज पर {{ dump(content.field_ebt_countdown_date) }} प्रिंट कर सकते हैं:

https://www.drupal.org/project/twig_debugger

और हमने तिथि को टाइमस्टैम्प में बदलने के लिए date('U') twig फ़िल्टर का उपयोग किया।

अब हम कस्टम जावास्क्रिप्ट शामिल कर सकते हैं और FlipDown इनिशियलाइज़ कर सकते हैं।

/ebt_countdown/js/ebt_countdown.js:

(function ($, Drupal) {

  /**
   * EBT Countdown व्यवहार।
   */
  Drupal.behaviors.ebtCountDown = {
    attach: function (context, settings) {
      var countdowns = once('ebt-countdown-block', '.ebt-countdown-date', context);
      countdowns.forEach(function(countdown) {
        var countdownTimestamp = parseInt(countdown.getAttribute('data-date'));
        var countdownId = countdown.getAttribute('id');
        new FlipDown(countdownTimestamp, countdownId, {
          theme: "dark",
        }).start();
      });
    }
  }

})(jQuery, Drupal);

अपडेट देखने के लिए कैश साफ़ करना न भूलें। इसके बाद FlipDown पेज पर काम करना शुरू कर देगा:

FlipDown

चरण 5. नए EBT Countdown ब्लॉक की स्टाइलिंग। Drush से जनरेट किए गए EBT मॉड्यूल में Gulp.js फ़ाइल शामिल होती है।

जैसा कि आप देख रहे हैं, डिफ़ॉल्ट FlipDown स्टाइल्स भी बहुत अच्छे से काम नहीं कर रही हैं। डेस्कटॉप पर भी दो पंक्तियों में नंबर दिखाई देते हैं। लेकिन हम इसे कस्टम स्टाइल्स से आसानी से ठीक कर सकते हैं। आप EBT Counter मॉड्यूल से gulpfile.js और package.json फ़ाइलें कॉपी कर सकते हैं ताकि scss को css में कंपाइल किया जा सके:

https://www.drupal.org/project/ebt_counter

gulpfile.js:

// --------------------------------------------------
// प्लगइन्स लोड करें
// --------------------------------------------------

var gulp = require('gulp'),
    sass = require('gulp-dart-scss'),
    postcss = require("gulp-postcss"),
    autoprefixer = require("autoprefixer"),
    cssnano = require("cssnano"),
    notify = require('gulp-notify'),
    sassUnicode = require('gulp-sass-unicode');


var config = {
    // मुख्य scss फाइलें जो पार्टियल्स इम्पोर्ट करती हैं
    scssSrc: 'scss/*.scss',
    // scss डायरेक्टरी में सभी scss फाइलें
    allScss: 'scss/**/*.scss',
    // css के लिए डेस्टिनेशन डायरेक्टरी
    cssDest: 'css/',
    // js डायरेक्टरी में सभी js फाइलें
    allJs: 'assets/js/**/*.js',
    // सभी img फाइलें
    allImgs: 'assets/img/**/*'
};


// डिपेंडेंसीज़ के बाद टास्क डिफ़ाइन करें
function style() {

  return gulp.src(config.allScss)
    .pipe(sass())
    .pipe(sassUnicode())
    .pipe(postcss([autoprefixer()]))
    .pipe(gulp.dest(config.cssDest));

  gulp.task('sass:watch', function () {
    gulp.watch('./scss/**/*.scss', ['sass']);
  });
}

// टास्क को एक्सपोज़ करें
// इससे आप इसे कमांड लाइन से चला सकते हैं
// $ gulp style
exports.style = style;

function watch(){
    // gulp.watch फाइलों में बदलावों को ट्रैक करता है
    // और बदलाव पर फंक्शन रन करता है
    gulp.watch('scss/**/*.scss', style)
}

// टास्क एक्सपोज़ करना न भूलें!
exports.watch = watch

package.json:

{
  "name": "ebt_styles",
  "version": "1.0.0",
  "description": "npm install चलाएँ और फिर gulp watch",
  "main": "gulpfile.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "autoprefixer": "^10.2.5",
    "cssnano": "^5.0.2",
    "gulp": "^4.0.2",
    "gulp-dart-scss": "^1.1.0",
    "gulp-notify": "^4.0.0",
    "gulp-postcss": "^9.0.0",
    "gulp-sass-unicode": "^1.0.5",
    "gulp-sourcemaps": "^3.0.0"
  },
  "dependencies": {
    "cucumber": "*",
    "postcss": "^8.2.13"
  }
}

package-lock.json फ़ाइल तब जेनरेट होगी जब आप यह कमांड चलाएँगे:

npm install

और आप gulp टास्क इस तरह शुरू कर सकते हैं:

gulp watch

अब हम scss फाइलें जोड़ेंगे:

/ebt_countdown/scss/flipdown.scss

.flipdown {
  width: 580px;
}

तो flipdown.css फ़ाइल स्वतः flipdown.scss से जेनरेट हो जाएगी। और हम इस .css फ़ाइल को .libraries.yml में शामिल कर सकते हैं:

ebt_countdown:
  css:
    component:
      /libraries/flipdown/dist/flipdown.min.css: { minified: true }
      css/flipdown.css: { }

आइए कैश साफ़ करें और परिणाम देखें:

EBT काउंटडाउन

अब यह बेहतर दिख रहा है!

क्या हम scss के बिना साधारण css का उपयोग कर सकते हैं?

हाँ, हम कर सकते हैं, लेकिन scss लिखना अधिकांश डेवलपर्स के लिए अधिक सुविधाजनक है।

चरण 6. FlipDown प्लगइन विकल्पों के साथ सेटिंग्स फ़ॉर्म का विस्तार करें

FlipDown प्लगइन में डिस्प्ले बदलने के लिए कुछ विकल्प होते हैं:

https://github.com/PButcher/flipdown

  • theme
  • headings

हमने पहले ही EBT सेटिंग्स के लिए नया फ़ील्ड विजेट EbtSettingsCountDownWidget बनाया था, अब हम इस फ़ॉर्म को नए फ़ील्ड्स के साथ विस्तारित करेंगे:

/ebt_countdown/src/Plugin/Field/FieldWidget/EbtSettingsCountDownWidget.php:

    $element['ebt_settings']['color_theme'] = [
      '#title' => $this->t('रंग थीम'),
      '#type' => 'radios',
      '#options' => [
        'dark' => $this->t('डार्क'),
        'light' => $this->t('लाइट'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['color_theme'] ?? 'dark',
      '#description' => $this->t('काउंटडाउन के लिए रंग थीम चुनें'),
      '#weight' => '3',
    ];

    $element['ebt_settings']['styles'] = [
      '#title' => $this->t('स्टाइल्स'),
      '#type' => 'radios',
      '#options' => [
        'default' => $this->t('डिफ़ॉल्ट'),
        'new_year' => $this->t('नया साल'),
      ],
      '#default_value' => $items[$delta]->ebt_settings['styles'] ?? 'default',
      '#description' => $this->t('काउंटडाउन के लिए विशेष स्टाइल चुनें'),
      '#weight' => '4',
    ];

    $element['ebt_settings']['heading_days'] = [
      '#title' => $this->t('दिन शीर्षक'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_days'] ?? $this->t('दिन'),
      '#description' => $this->t('दिन काउंटर के लिए हेडर'),
      '#weight' => '5',
    ];

    $element['ebt_settings']['heading_hours'] = [
      '#title' => $this->t('घंटे शीर्षक'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_hours'] ?? $this->t('घंटे'),
      '#description' => $this->t('घंटे काउंटर के लिए हेडर'),
      '#weight' => '6',
    ];

    $element['ebt_settings']['heading_minutes'] = [
      '#title' => $this->t('मिनट शीर्षक'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_minutes'] ?? $this->t('मिनट'),
      '#description' => $this->t('मिनट काउंटर के लिए हेडर'),
      '#weight' => '7',
    ];

    $element['ebt_settings']['heading_seconds'] = [
      '#title' => $this->t('सेकंड शीर्षक'),
      '#type' => 'textfield',
      '#default_value' => $items[$delta]->ebt_settings['heading_seconds'] ?? $this->t('सेकंड'),
      '#description' => $this->t('सेकंड काउंटर के लिए हेडर'),
      '#weight' => '8',
    ];
    
    return $element;

सेटिंग्स फ़ॉर्म अपडेट करें

तो अब हम हेडिंग्स का उपयोग अनुवादों के लिए कर सकते हैं:

हेडिंग्स जोड़ें

हमारे पास जावास्क्रिप्ट में सभी EBT सेटिंग्स वैल्यूज़ हैं, इसलिए मैंने केवल टेम्पलेट में ID जोड़ी ताकि सही यूनिक की आसानी से मिल सके।

.setAttribute('id', 'plugin-id-' ~ plugin_id|clean_class)
.setAttribute('id', 'block-revision-id-' ~ configuration.block_revision_id)

विकल्प कीज़ का पैटर्न IDs के समान है:

/ebt_core/ebt_core.module:

  // Block content के लिए plugin_id का उपयोग करें।
  $build['#attached']['drupalSettings'][$bundle]['block-revision-id-' . $revision_id[0]['value']] = $block_options;
  $uuid = $entity->get('uuid')->getValue();
  $block_options = [
    'blockClass' => 'plugin-id-block-content' . $uuid[0]['value'],
    'options' => $options,
  ];
  $build['#attached']['drupalSettings'][$bundle]['plugin-id-block-content' . $uuid[0]['value']] = $block_options;

तो हम जावास्क्रिप्ट drupalSettings से विकल्पों का उपयोग कर सकते हैं:

EBT सेटिंग्स

/ebt_countdown/js/ebt_countdown.js:

(function ($, Drupal) {

  /**
   * EBT Countdown व्यवहार।
   */
  Drupal.behaviors.ebtCountDown = {
    attach: function (context, settings) {
      var countdowns = once('ebt-countdown-block', '.ebt-countdown-date', context);
      countdowns.forEach(function(countdown) {
        // ब्लॉक ID प्राप्त करें।
        var countdownWrapper = countdown.closest('.ebt-block-countdown');
        var countdownWrapperId = countdownWrapper.getAttribute('id');
        // ब्लॉक EBT सेटिंग्स प्राप्त करें।
        var ebtOptions = drupalSettings['ebtCountdown'][countdownWrapperId];
        // जावास्क्रिप्ट प्लगइन के लिए विकल्प तैयार करें।
        var countdownTimestamp = parseInt(countdown.getAttribute('data-date'));
        var countdownId = countdown.getAttribute('id');
        // जावास्क्रिप्ट प्लगइन इनिशियलाइज़ करें।
        new FlipDown(countdownTimestamp, countdownId, {
          theme: ebtOptions['options']['color_theme'],
          headings: [
            ebtOptions['options']['heading_days'],
            ebtOptions['options']['heading_hours'],
            ebtOptions['options']['heading_minutes'],
            ebtOptions['options']['heading_seconds'],
          ],
        }).start();
      });
    }
  }

})(jQuery, Drupal);

मैंने फ़ील्ड विजेट में $element['ebt_settings']['styles'] भी जोड़ा है, ताकि हम पूरे ब्लॉक के लिए नया क्लास टेम्पलेट में जोड़ सकें।

{%
  set classes = [
  'block',
  'ebt-block',
  'ebt-block-countdown',
  'ebt-block-' ~ plugin_id|clean_class,
  'block-' ~ configuration.provider|clean_class,
  'block-' ~ plugin_id|clean_class,
  'plugin-id-' ~ plugin_id|clean_class,
  content.field_ebt_settings['#object'].field_ebt_settings.ebt_settings.styles,
]
%}
{% if content.field_ebt_settings['#object'].field_ebt_settings.ebt_settings.styles == 'new_year' %}
  {{ attach_library('ebt_countdown/new_year') }}
{% endif %}

यह new_year स्टाइल के लिए new_year लाइब्रेरी शामिल करेगा, लेकिन अब हमें यह लाइब्रेरी बनानी होगी।

/ebt_countdown/ebt_countdown.libraries.yml:

new_year:
  css:
    component:
      css/new-year.css: { }

और यहाँ नया साल ब्लॉक के लिए स्टाइल्स हैं:

/ebt_countdown/scss/new-year.scss
/ebt_countdown/css/new-year.css

.ebt-block-countdown.new_year {
  background: url(../img/snowflakes.webp) center center repeat;
}

यहाँ नया स्टाइल जोड़ने का परिणाम है:

नया साल EBT ब्लॉक

आप नए या मौजूदा EBT मॉड्यूल्स के लिए किसी भी संख्या में स्टाइल्स जोड़ सकते हैं। आप किसी भी EBT मॉड्यूल के लिए अपने स्टाइल्स भी सुझाव दे सकते हैं, बस इसके लिए drupal.org पर एक इश्यू बनाएँ:

https://www.drupal.org/project/issues/ebt_core

चरण 7. EBT ब्लॉक प्रकार, पैराग्राफ प्रकार और फ़ील्ड्स के लिए कॉन्फ़िग्स एक्सपोर्ट करें

मुझे लगता है कि हमने EBT Countdown में फीचर्स जोड़ना पूरा कर लिया है, अब समय है कॉन्फ़िग्स को एक्सपोर्ट करने और Drupal.org पर बदलाव डिप्लॉय करने का। हमें EBT Countdown से संबंधित सभी कॉन्फ़िग्स को /ebt_countdown/config/install फ़ोल्डर में कॉपी करना चाहिए।

अगर आपने Drush से EBT मॉड्यूल जेनरेट किया था, तो आपको नए फ़ील्ड्स और अपने EBT ब्लॉक प्रकार के लिए कॉन्फ़िग्स अपडेट करने की ज़रूरत होगी।

उसके बाद Extend पेज /admin/modules पर EBT मॉड्यूल को सक्षम करें। नया EBT ब्लॉक प्रकार और अन्य सेटिंग्स config फ़ाइलों के /config/install फ़ोल्डर से इंस्टॉल हो जाएंगे:

 

EBT module configs

हमें language.* कॉन्फ़िग्स जोड़ने की ज़रूरत नहीं है, क्योंकि कुछ Drupal साइट्स में केवल एक ही भाषा होती है और Language मॉड्यूल को डिसेबल किया जा सकता है।

आमतौर पर मैं सभी फाइलों की कॉपी करता हूँ और चेक करता हूँ कि /config/install फ़ोल्डर में कॉपी मौजूद है।

Copy of configs

अब हमें config/install फ़ोल्डर में कॉन्फ़िग्स से uuid और hashes हटाने होंगे।

Remove uuid

क्योंकि हमने अन्य Drupal मॉड्यूल्स का उपयोग किया है, हमें उन्हें .info फ़ाइल में dependencies के रूप में शामिल करना चाहिए।

Drupal dependencies

/ebt_countdown/ebt_countdown.info:

dependencies:
  - drupal:datetime

चरण 8. Drupal.org पर डिप्लॉय करें और परीक्षण करें

हमने पहले Drupal.org पर नया प्रोजेक्ट बनाया था:

https://www.drupal.org/project/ebt_countdown

मैं मुख्य ब्रांच के रूप में 1.4.x ब्रांच का उपयोग करूंगा, ताकि अन्य EBT मॉड्यूल्स के साथ स्थिरता बनी रहे:

Drupal EBT module

तो सभी रिलीज़ 1.4.0 वर्ज़न से शुरू होंगी:

git tag 1.4.0
git push origin 1.4.0

आप स्थिर 1.4.0 वर्ज़न बनाने से पहले -alpha, -beta वर्ज़न भी बना सकते हैं।

हमें इंतज़ार करना होगा 10 दिन, उसके बाद मॉड्यूल को सुरक्षा सलाह कवरेज (security advisory coverage) में शामिल किया जा सकता है।

EBT Countdown

तो हम अपने नए मॉड्यूल का परीक्षण कर सकते हैं और बग्स को ठीक कर सकते हैं।

कदम 9. README.md फ़ाइल जोड़ें

README.md फ़ाइल जोड़ना न भूलें, आप अन्य EBT मॉड्यूल्स में उदाहरण देख सकते हैं:

https://www.drupal.org/project/ebt_slideshow

EBT मॉड्यूल्स का उपयोग करने के लिए धन्यवाद! बेझिझक कोई भी सवाल पूछें या अपने सुझाव दें:

Drupal.org पर एक issue बनाएँ

EBT मॉड्यूल डेवलपर से संपर्क करें

या मुझे LinkedIn पर संदेश भेजें