logo

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

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

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

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

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

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

स्क्रॉल

9.8. Drupal में फॉर्म के साथ काम करना। प्रोग्रामेटिकली कॉन्फ़िगरेशन फॉर्म जोड़ना।

17/10/2025, by Ivan

Menu

इस ट्यूटोरियल में, हम Drupal Form API के साथ काम करेंगे और मॉड्यूल के लिए एक सेटिंग्स फॉर्म बनाएंगे। हमने पहले ही पेज और ब्लॉक को प्रदर्शित करने के लिए मॉड्यूल बनाए हैं, अब हम एक कॉन्फ़िगरेशन फॉर्म बनाएंगे जिसमें हम कंडीशनल सर्विस से कनेक्ट करने के लिए डेटा स्टोर करेंगे। मान लीजिए कि हमें साइट पर API Key और API Client ID स्टोर करना है, उदाहरण के लिए, Google Maps API के लिए।

कोड के उदाहरण आप github पर देख सकते हैं:
https://github.com/levmyshkin/drupalbook8

हम इस डेटा को settings.php में स्टोर कर सकते हैं और इन सेटिंग्स को git में जोड़ सकते हैं। लेकिन यह सुरक्षित नहीं होगा, सेवाओं तक पहुंच को डेटाबेस में स्टोर करना बेहतर है।

Settings form

अब हम अपने फॉर्म के लिए एक और रूट जोड़ते हैं:

modules/custom/drupalbook/drupalbook.routing.yml

drupalbook.settings:
  path: '/admin/structure/drupalbook/settings'
  defaults:
    _form: '\Drupal\drupalbook\Form\DrupalbookSettingsForm'
    _title: 'DrupalBook Settings form'
  requirements:
    _permission: 'administer site configuration'

पिछले रूट्स की तरह, यहां हम defaults में _controller की बजाय _form का उपयोग करते हैं। इसका मतलब है कि हम फॉर्म के लिए Controller क्लास नहीं बनाएंगे, बल्कि एक फॉर्म क्लास बनाएंगे। चलिए फॉर्म क्लास के लिए एक फाइल बनाते हैं:

modules/custom/drupalbook/src/Form/DrupalbookSettingsForm.php

आपको अपने फॉर्म्स के लिए src फोल्डर में एक अलग Form फोल्डर बनानी होगी। यह आपको मॉड्यूल कोड को अलग-अलग फोल्डरों में विभाजित करने की सुविधा देता है और आप फोल्डरों के नाम के आधार पर आसानी से आवश्यक कोड पा सकते हैं।

फॉर्म कोड जोड़ें और हम कोड के प्रत्येक ब्लॉक को समझेंगे और यह कैसे काम करता है:

<?php

namespace Drupal\drupalbook\Form;
 
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
 
/**
 * Configure example settings for this site.
 */
class DrupalbookSettingsForm extends ConfigFormBase {
  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'drupalbook_admin_settings';
  }
 
  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return [
      'drupalbook.settings',
    ];
  }
 
  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('drupalbook.settings');
 
    $form['drupalbook_api_key'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('API Key'),
      '#default_value' => $config->get('drupalbook_api_key'),
    );
 
    $form['drupalbook_api_client_id'] = array(
      '#type' => 'textfield',
      '#title' => $this->t('API Client ID'),
      '#default_value' => $config->get('drupalbook_api_client_id'),
    );
 
    return parent::buildForm($form, $form_state);
  }
 
  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    // Retrieve the configuration
    $this->configFactory->getEditable('drupalbook.settings')
      // Set the submitted configuration setting
      ->set('drupalbook_api_key', $form_state->getValue('drupalbook_api_key'))
      // You can set multiple configurations at once by making
      // multiple calls to set()
      ->set('drupalbook_api_client_id', $form_state->getValue('drupalbook_api_client_id'))
      ->save();
 
    parent::submitForm($form, $form_state);
  }
}

हम पहले ही namespace और use ऑपरेटरों के साथ काम कर चुके हैं, और Drupal उन्हें केवल आवश्यक क्लासेस को जोड़ने के लिए उपयोग करता है:

\drupalbook\Form;
 
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;

एक कॉन्फ़िगरेशन फॉर्म बनाने के लिए, आपको ConfigFormBase क्लास से इनहेरिट करना होता है, ConfigFormBase यह подразु करता है कि आप फॉर्म से डेटा को कॉन्फ़िगरेशन में स्टोर करेंगे।

extends ConfigFormBase {

इसके बाद, फॉर्म ID निर्दिष्ट करें, यह हर फॉर्म के लिए अद्वितीय होना चाहिए। यदि आप अपने फॉर्म का ID मॉड्यूल के नाम से शुरू करते हैं, तो सुनिश्चित करें कि आपका ID अद्वितीय होगा:

function getFormId() {
  return 'drupalbook_admin_settings';
}

अब उस कॉन्फ़िगरेशन समूह को निर्दिष्ट करें जिसमें हम डेटा स्टोर करेंगे:

function getEditableConfigNames() {
  return [
    'drupalbook.settings',
  ];
}

अब हम फॉर्म फील्ड्स कैसे बनाएंगे, यह देखते हैं। आप Form API की क्षमताओं का मूल्यांकन कर सकते हैं और आप कौन से फील्ड्स प्रदर्शित कर सकते हैं, इसके लिए आप डॉक्यूमेंटेशन पढ़ सकते हैं:

https://api.drupal.org/api/drupal/elements/8.5.x

अब तक हमने केवल textfield का उपयोग किया है:

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Textfield.php/class/Textfield/8.5.x

लेकिन आपको अक्सर ड्रॉपडाउन लिस्ट के साथ काम करना होता है:

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Select.php/class/Select/8.5.x

चेकबॉक्स और रेडियो बटन के साथ:

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Checkboxes.php/class/Checkboxes/8.5.x

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21Element%21Radios.php/class/Radios/8.5.x

अपने फॉर्म में इन फील्ड्स को जोड़ने की कोशिश करें, टेक्स्ट फील्ड्स तक सीमित न रहें।

function buildForm(array $form, FormStateInterface $form_state) {
  $config = $this->config('drupalbook.settings');

हम $form में फॉर्म ऐरे तैयार करते हैं और फिर इससे HTML बनाते हैं। $form_state में वह सभी डेटा स्टोर होता है जो हम फॉर्म से सबमिट करते हैं, इसमें सभी फील्ड्स के मान, फॉर्म आईडी, CSRF टोकन शामिल होते हैं ताकि स्वचालित फॉर्म सबमिशन से सुरक्षा हो सके। $form_state यह भी अनुमति देता है कि डेटा को मल्टी-स्टेप फॉर्म के बीच ट्रांसफर किया जाए, हम इसे अगले पाठ में उपयोग करेंगे।

यहां हम कॉन्फ़िगरेशन से डेटा लोड करते हैं। शायद आपने पहले ही drupalbook.settings में कुछ सहेजा होगा और $config अब खाली नहीं है, इससे हमें टेक्स्ट फील्ड्स में वर्तमान मान सेट करने की सुविधा मिलती है, #default_value का उपयोग करके, और डेटा प्राप्त करते हैं config->get() मेथड से।

['drupalbook_api_key'] = array(
  '#type' => 'textfield',
  '#title' => $this->t('API Key'),
  '#default_value' => $config->get('drupalbook_api_key'),
);
 
$form['drupalbook_api_client_id'] = array(
  '#type' => 'textfield',
  '#title' => $this->t('API Client ID'),
  '#default_value' => $config->get('drupalbook_api_client_id'),
);

और मेथड के अंत में, हम $form और $form_state लौटाते हैं ताकि फॉर्म बनाया जा सके।

::buildForm($form, $form_state);

इसके बाद हमारे पास submitForm() मेथड है, यह तब कार्य करता है जब फॉर्म सबमिट हो और कोई त्रुटियाँ न हों। यदि फिर भी आपने एक आवश्यक फ़ील्ड नहीं भरा और Drupal एक त्रुटि फेंकता है, तो submitForm काम नहीं करेगा। यदि आप सबमिट किए गए डेटा के मान जांचना चाहते हैं, तो आपको validateForm() का उपयोग करना होगा, validate तब भी काम करेगा यदि फॉर्म में कोई त्रुटि हो और validate का उपयोग करके आप फॉर्म सबमिशन को रद्द कर सकते हैं और यदि डेटा में कुछ गलत हो तो त्रुटि उत्पन्न कर सकते हैं। हम validate को अगले फॉर्म ट्यूटोरियल में कवर करेंगे।

submitForm() मेथड में, हम सभी फील्ड्स के मान प्राप्त करते हैं और drupalbook.settings कॉन्फ़िगरेशन को अपडेट करते हैं:

function submitForm(array &$form, FormStateInterface $form_state) {
  // Retrieve the configuration
  $this->configFactory->getEditable('drupalbook.settings')
    // Set the submitted configuration setting
    ->set('drupalbook_api_key', $form_state->getValue('drupalbook_api_key'))
    // You can set multiple configurations at once by making
    // multiple calls to set()
    ->set('drupalbook_api_client_id', $form_state->getValue('drupalbook_api_client_id'))
    ->save();
 
  parent::submitForm($form, $form_state);
}

हम parent मेथड submitForm को भी कॉल करते हैं, जो फॉर्म के सफल सबमिशन का संदेश प्रदर्शित करता है। आप इस लाइन को कमेंट आउट कर सकते हैं और अपना संदेश लिख सकते हैं:

//parent::submitForm($form, $form_state);
drupal_set_message($this->t('My Cool Form have been saved!'));

अपने रूट को लागू करने के लिए कैश को साफ़ करना न भूलें। अब आप अपने फॉर्म को क्रियाशील देख सकते हैं। जब आपको API Key लोड करनी हो, तो आप यह कोड उपयोग कर सकते हैं:

$config = \Drupal::config('example.settings');
$api_key =$config->get('drupalbook_api_key');
$api_client_id = $config->get('drupalbook_api_client_id');

यह कोड किसी भी मॉड्यूल या प्रीप्रोसेस फंक्शन में काम करेगा, क्योंकि Drupal में एकल कॉन्फ़िगरेशन सिस्टम है।

यह सब है, अगले फॉर्म पाठ में, हम मल्टी-स्टेप फॉर्म बनाने पर चर्चा करेंगे।

कोड के उदाहरण आप github पर देख सकते हैं:
https://github.com/levmyshkin/drupalbook8