Drupal मॉड्यूल में प्रोग्रामेटिक रूप से ब्लॉक बनाना
Drupal 8 में блок, ब्लॉक प्लगइन के экземпляर होते हैं।
Block Manager Drupal आपके मॉड्यूल्स को स्कैन करता है, ताकि ऐसे क्लास मिल सकें, जिनमें एनноटेशन @Block मौजूद हो।
नीचे दिया गया कोड उदाहरण @Block एनноटेशन का उपयोग करता है, जिसमें «id» और «admin_label» प्रॉपर्टीज़ के साथ एक कस्टम ब्लॉक को परिभाषित किया गया है।
अपने पहले बनाए गए मॉड्यूल स्केलेटन में src/Plugin/Block/HelloBlock.php
फ़ाइल बनाएँ और इसमें नीचे दिया गया कोड जोड़ें।
ताकि आपका Drupal साइट इस नए क्लास को पहचान सके, आपको cache क्लियर करना होगा।
<?php namespace Drupal\hello_world\Plugin\Block; use Drupal\Core\Block\BlockBase; /** * Provides a 'Hello' Block. * * @Block( * id = "hello_block", * admin_label = @Translation("Hello block"), * category = @Translation("Hello World"), * ) */ class HelloBlock extends BlockBase { /** * {@inheritdoc} */ public function build() { return [ '#markup' => $this->t('Hello, World!'), ]; } }
«Hello block» जोड़ने के लिए, Structure -> Block Layout (admin/structure/block) में जाएँ और प्रत्येक उपलब्ध region से जुड़े «Place block» बटन पर क्लिक करें।
जब आप किसी region के लिए «Place block» बटन दबाएँगे, तो «Place block» पॉपअप डायलॉग दिखाई देगा, जिसमें सभी उपलब्ध ब्लॉकों की सूची होगी। अपने ब्लॉक को जल्दी खोजने के लिए, «Filter by block name» विकल्प का उपयोग करें या माउस स्क्रॉल से «Hello block» ढूंढें। इस तरह, आप अपनी साइट पर किसी भी स्थान पर कस्टम ब्लॉक के जितने चाहें उतने экземпляर जोड़ सकते हैं।
समस्या निवारण
- क्लास का नाम और फ़ाइल का नाम समान होना चाहिए (क्लास HelloBlock और /src/Plugin/Block/HelloBlock.php)। यदि नाम अलग है, तो ब्लॉक उपलब्ध ब्लॉकों की सूची में तो दिखाई देगा, लेकिन उसे जोड़ा नहीं जा सकेगा।
- सभी path और फ़ाइल नामों को ध्यान से जाँचें। आपकी .php फ़ाइल सही लेबल वाले डायरेक्टरी (/src/Plugin/Block/) में होनी चाहिए, अन्यथा Drupal उसे पहचान नहीं पाएगा।
- यदि आपका ब्लॉक स्क्रीन पर बिना errors या watchdog टाइमर के region में place नहीं हो पा रहा, तो PHP/Apache error logs चेक करें।
- यदि आपका ब्लॉक सूची में नहीं है, तो Drupal cache को rebuild करना न भूलें (उदाहरण: drush cr)।
- यह सुनिश्चित करें कि आपके मॉड्यूल का नामकरण कन्वेंशन lowercase में हो। कुछ उपयोगकर्ताओं ने रिपोर्ट किया है कि camelCase नाम वाले मॉड्यूल्स के ब्लॉक दिखाई नहीं देते। उदाहरण के लिए, myModule कभी भी ब्लॉक नहीं दिखाएगा, जबकि उसे my_module होना चाहिए। यह Drupal 8.8.1 में आखिरी बार सत्यापित किया गया था।
नोट: कस्टम ब्लॉकों के साथ Twig टेम्पलेट्स का उपयोग
1. अपने .module फ़ाइल में hook_theme जोड़ें।
नोट: फंक्शन को 'block__...' नाम न दें - इससे किसी भी ब्रांच टेम्पलेट में वेरिएबल पास नहीं होंगे। इसके बजाय आप मॉड्यूल का नाम prefix के रूप में इस्तेमाल कर सकते हैं।
2. render array में «#theme» का उपयोग करें, build() मेथड में, और «#theme» के समान लेवल पर वेरिएबल्स पास करें - «#varname»।