9.7. Drupal में प्लगइन्स। प्रोग्रामेटिकली ब्लॉक कैसे जोड़ें।
इस ट्यूटोरियल में, हम देखेंगे कि Drupal 8 में कस्टम मॉड्यूल के माध्यम से ब्लॉक्स को प्रोग्रामेटिकली कैसे आउटपुट किया जाता है।
कोड उदाहरण GitHub पर देखे जा सकते हैं:
https://github.com/levmyshkin/drupalbook8
आइए हम एक PHP क्लास वाली फ़ाइल जोड़ने से शुरुआत करें, इस तरह Drupal में कस्टम मॉड्यूल के माध्यम से ब्लॉक्स बनाए जाते हैं। फ़ाइल बनाने की प्रक्रिया वही है जैसा हमने पेज के लिए किया था, जैसा कि हम यहाँ करते हैं:
9.3. कस्टम Drupal मॉड्यूल बनाएं। पेज को प्रोग्रामेटिकली आउटपुट करें।
हमें केवल एक फ़ाइल बनानी है जिसमें एक प्लगइन हो:
modules/custom/drupalbook/src/Plugin/Block/FirstBlock.php
आइए हम इस ब्लॉक कोड को कॉपी करें और फिर कोड के प्रत्येक भाग को समझते हैं
modules/custom/drupalbook/src/Plugin/Block/FirstBlock.php:
<?php
namespace Drupal\drupalbook\Plugin\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
/**
* Provides a block with a simple text.
*
* @block(
* id = "drupalbook_first_block_block",
* admin_label = @block("My first block"),
* )
*/
class FirstBlock extends BlockBase {
/**
* {@block}
*/
public function build() {
$config = $this->getConfiguration();
if (!empty($config['drupalbook_first_block_settings'])) {
$text = $this->t('Hello @Name in block!', ['@Name' => $config['drupalbook_first_block_settings']]);
}
else {
$text = $this->t('Hello World in block!');
}
return [
'#markup' => $text,
];
}
/**
* {@block}
*/
protected function blockAccess(AccountInterface $account) {
return AccessResult::allowedIfHasPermission($account, 'access content');
}
/**
* {@block}
*/
public function blockForm($form, FormStateInterface $form_state) {
$config = $this->getConfiguration();
$form['drupalbook_first_block_settings'] = [
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => !empty($config['drupalbook_first_block_settings']) ? $config['drupalbook_first_block_settings'] : '',
];
return $form;
}
/**
* {@block}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['drupalbook_first_block_settings'] = $form_state->getValue('drupalbook_first_block_settings');
}
}
हम अपना ब्लॉक रेजिना लेफ्ट साइडबार या किसी अन्य कॉलम में दिखाएंगे, जहाँ आपको यह सुविधाजनक लगे।
अपने ब्लॉक का नाम टाइप करना शुरू करें और Drupal स्वचालित रूप से आपको अपना ब्लॉक चुनने का सुझाव देगा। यदि आपका ब्लॉक वहाँ नहीं है, तो जांचें कि क्या वांछित कोड सही फ़ाइल में है, और फ़ाइल सही फ़ोल्डर में है, और फिर कैश साफ़ करना न भूलें।
अब जब हमारा ब्लॉक प्रदर्शित हो गया है, आइए देखें कि ब्लॉक जोड़ने का कोड कैसे काम करता है:
फ़ाइल की शुरुआत में, हमारे पास namespace है, ताकि यह निर्धारित किया जा सके कि हमारा ब्लॉक प्लगइन फ़ाइल कहाँ होनी चाहिए, ताकि Drupal इसे स्वचालित रूप से कनेक्ट कर सके। हम अन्य फ़ाइलों से क्लासेस को भी उपयोग करके शामिल करते हैं।
\drupalbook\Plugin\Block;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Session\AccountInterface;
आगे टिप्पणियों में एनोटेशन है। हमें ब्लॉक को YML फ़ाइलों में कहीं भी परिभाषित करने की आवश्यकता नहीं है, यह स्वचालित रूप से Drupal द्वारा एनोटेशन का उपयोग करके लोड किया जाएगा।
/**
* Provides a block with a simple text.
*
* @block(
* id = "drupalbook_first_block_block",
* admin_label = @block("My first block"),
* )
*/
यहां हम @block को बताते हैं कि यह एक ब्लॉक प्लगइन होगा। id, admin_label स्वचालित रूप से Drupal द्वारा लिया जाएगा, इसलिए id को अद्वितीय होना चाहिए। @block फिर ब्लॉक लेबल को Drupal प्रशासन पैनल के माध्यम से अनुवाद करने में मदद करता है।
extends BlockBase {
हम BlockBase क्लास से विरासत में लेते हैं, आप Ctrl दबाकर PhpStorm में BlockBase पर क्लिक कर सकते हैं और देख सकते हैं कि हमारे ब्लॉक में कौन से तरीके फिर से परिभाषित किए जा सकते हैं, हम उनमें से सभी का उपयोग नहीं करते। आप आवश्यकता अनुसार अन्य तरीकों को ओवरराइड कर सकते हैं।
आइए हम कक्षा के तरीकों को आगे देखें:
/**
* {@block}
*/
protected function blockAccess(AccountInterface $account) {
return AccessResult::allowedIfHasPermission($account, 'access content');
}
हमने पहले इस लेख में पृष्ठ तक पहुँच के बारे में विचार किया है, ब्लॉकों में हम वही पहुँच अधिकार का उपयोग कर सकते हैं:
https://drupalbook.org/ru/drupal/126-rout-s-parametrom
यहां हम वही AccessResult क्लास का उपयोग कर रहे हैं।
/**
* {@block}
*/
public function blockForm($form, FormStateInterface $form_state) {
$config = $this->getConfiguration();
$form['drupalbook_first_block_settings'] = [
'#type' => 'textfield',
'#title' => $this->t('Name'),
'#description' => $this->t('Who do you want to say hello to?'),
'#default_value' => !empty($config['drupalbook_first_block_settings']) ? $config['drupalbook_first_block_settings'] : '',
];
return $form;
}
हम प्रत्येक ब्लॉक के लिए अलग से ब्लॉक कंफिगरेशन फ़ॉर्म का उपयोग कर सकते हैं, जिसे हम प्रोग्रामेटिकली बनाते हैं। यदि आप ब्लॉक सेटिंग्स पर जाते हैं:
यहां आप हमारा नाम फ़ील्ड देख सकते हैं, जिसे हमने blockForm() विधि में जोड़ा था:
हम फ़ॉर्म API का उपयोग करके फ़ॉर्म के लिए फ़ील्ड बनाते हैं:
https://www.drupal.org/docs/8/api/form-api
https://api.drupal.org/api/drupal/elements/8.5.x
हम भविष्य में Form API का विश्लेषण करेंगे और एक मल्टी-स्टेप पॉप-अप फ़ॉर्म बनाएंगे। फिलहाल आप देख सकते हैं कि आप Form API का उपयोग करके कौन से अन्य प्रकार के फ़ील्ड का उपयोग कर सकते हैं। प्रत्येक फ़ील्ड को एक एरे का उपयोग करके जोड़ा जाता है। ब्लॉक फ़ॉर्म में अधिक फ़ील्ड जोड़ने की कोशिश करें।
/**
* {@block}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['drupalbook_first_block_settings'] = $form_state->getValue('drupalbook_first_block_settings');
}
यहां हम फ़ॉर्म से फ़ील्ड के मान को Drupal कॉन्फ़िगरेशन में सहेजते हैं। हम भविष्य में कॉन्फ़िगरेशन पर अधिक विस्तार से विचार करेंगे, फिलहाल आपको बस यह समझना होगा कि Drupal में सभी कॉन्फ़िगरेशन का सामान्य भंडारण है और सभी मॉड्यूल इसका उपयोग करते हैं। इन कॉन्फ़िग्स को आपके एक साइट से दूसरी साइट में ट्रांसफर किया जा सकता है। उदाहरण के लिए, यदि आपने साइट की स्थानीय कॉपी पर ब्लॉक सेटिंग्स बदली हैं, तो इन कॉन्फ़िग्स को अपलोड और लाइव साइट पर लागू किया जा सकता है।
/**
* {@block}
*/
public function build() {
$config = $this->getConfiguration();
if (!empty($config['drupalbook_first_block_settings'])) {
$text = $this->t('Hello @Name in block!', ['@Name' => $config['drupalbook_first_block_settings']]);
}
else {
$text = $this->t('Hello World in block!');
}
return [
'#markup' => $text,
];
}
और अब मुख्य build() विधि, जो ब्लॉक की सामग्री प्रदर्शित करती है। इस विधि में, हम ब्लॉक की कॉन्फ़िगरेशन की जांच करते हैं और यदि हमारे पास एक नाम है, तो हम नाम के साथ टेक्स्ट प्रदर्शित करते हैं। ध्यान दें कि $this->t() विधि का उपयोग करते हुए, यह आपको Drupal प्रशासन पैनल के माध्यम से टेक्स्ट का अन्य भाषाओं में अनुवाद करने की अनुमति देता है। हम @Name प्लेसहोल्डर का उपयोग करते हैं, हमें इसे केवल इच्छित टेक्स्ट का अनुवाद करने की आवश्यकता होती है, न कि कॉन्फ़िगरेशन फ़ॉर्म में दर्ज किए गए फ़ील्ड के मान। इससे आप कई पंक्तियों के अनुवाद से बच सकते हैं, उदाहरण के लिए, अगर आप प्लेसहोल्डर का उपयोग नहीं करते हैं, तो सभी टेक्स्ट विकल्प जो $this->t() से गुजरते हैं, प्रशासन पैनल में अनुवाद के लिए उपलब्ध होंगे:
Hello Josh ...
Hello Mike ...
Hello Ivan ...
आदि।
मुझे लगता है कि अब आपको यह समझ में आ गया होगा कि Drupal 8 में कस्टम ब्लॉक्स को कैसे प्रदर्शित और कंफिगर करें, फिर हम ब्लॉक्स, पेजेस, फॉर्म्स का उपयोग करते हुए और अधिक जटिल उदाहरणों पर विचार करेंगे।
कोड उदाहरण GitHub पर देखे जा सकते हैं:
https://github.com/levmyshkin/drupalbook8