logo

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

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

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

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

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

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

स्क्रॉल

समीक्षा: कस्टम फ़ील्ड बनाना

30/09/2025, by Ivan

Menu

यह ट्यूटोरियल मूल रूप से Web Wash पर प्रकाशित हुआ था। लेकिन Berdir ने पूछा कि क्या मैं ट्यूटोरियल यहाँ पोस्ट कर सकता हूँ, तो लीजिए यह रहा।

Drupal 7 में मॉड्यूल आपको कोड के उदाहरण / स्निपेट्स को एक फील्ड में स्टोर करने की अनुमति देता है। यह एक कस्टम फील्ड के साथ आता है जिसे “Snippets Field” कहा जाता है और यह तीन फॉर्म आइटम दिखाता है: विवरण, स्रोत कोड और सिंटैक्स हाइलाइटिंग मोड (कौन सी प्रोग्रामिंग भाषा)।

लेकिन अब समय आ गया है कि मॉड्यूल को Drupal 8 में अपडेट किया जाए।

इस ट्यूटोरियल में मैं आपको दिखाऊँगा कि मैंने Drupal 8 में “बेसिक” कस्टम फील्ड कैसे बनाया। मैं PSR – 4, Annotations या Plugins में गहराई से नहीं जाऊँगा, वरना यह ट्यूटोरियल बहुत बड़ा हो जाएगा।

इसके बजाय मैं अन्य साइट्स के लिंक दूँगा जो इन कॉन्सेप्ट्स को और विस्तार से समझाते हैं।

यदि आप Drupal 8 में Field API की डिटेल डॉक्यूमेंटेशन ढूँढ रहे हैं, तो इन सीरीज़ को देखें:

 

Drupal 8 में फील्ड्स को Drupal 7 की तरह hooks से इम्प्लीमेंट नहीं किया जाता। इसके बजाय इन्हें नए Drupal 8 Plugin API का उपयोग करके बनाया जाता है। इसका मतलब है कि hooks इम्प्लीमेंट करने के बजाय हम Widget, Formatter और Field Item के लिए क्लासेस डिफाइन करते हैं। Drupal 7 के कई hooks जैसे hook_field_schema, hook_field_is_empty और अन्य अब क्लास के methods बन गए हैं।

कदम 1: फील्ड आइटम को इम्प्लीमेंट करना

पहला काम है SnippetsItem नाम की Field Item क्लास डिफाइन करना, जो FieldItemBase क्लास को एक्सटेंड करता है।

1. Drupal 8 में क्लासेस PSR-4 का उपयोग करके लोड होती हैं।

तो SnippetsItem क्लास डिफाइन करने के लिए हमें SnippetsItem.php फाइल बनानी होगी और इसे “module” /src/Plugin/Field/FieldType/SnippetsItem.php में रखना होगा।

/**
 * @file
 * Contains \Drupal\snippets\Plugin\Field\FieldType\SnippetsItem.
 */

namespace Drupal\snippets\Plugin\Field\FieldType;

use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;

इसके बाद हम फाइल में namespace Drupal\snippets\Plugin\Field\FieldType और तीन use statements जोड़ते हैं: Drupal\Core\Field\FieldItemBase, Drupal\Core\Field\FieldStorageDefinitionInterface और Drupal\Core\TypedData\DataDefinition।

2. अब हमें फील्ड की डिटेल्स डिफाइन करनी होंगी, जैसे field id, label, default widget, formatter आदि। यह Drupal 7 के hook_field_info को इम्प्लीमेंट करने के बराबर है।

Drupal 8 में अधिकतर इंफो hooks को Annotations से बदल दिया गया है।

/**
 * Plugin implementation of the 'snippets' field type.
 *
 * @FieldType(
 *   id = "snippets_code",
 *   label = @Translation("Snippets field"),
 *   description = @Translation("This field stores code snippets in the database."),
 *   default_widget = "snippets_default",
 *   default_formatter = "snippets_default"
 * )
 */
class SnippetsItem extends FieldItemBase { }

इसलिए hook_field_info को इम्प्लीमेंट करने के बजाय हम फील्ड को क्लास के ऊपर annotation के रूप में डिफाइन करते हैं।

Annotation attributes self-explanatory हैं। बस यह सुनिश्चित करें कि default_widget और default_formatter विजेट और फॉर्मैटर के annotation IDs को रेफर कर रहे हों, क्लास को नहीं।

यदि आप Annotations के बारे में और जानना चाहते हैं, तो drupal.org पर Annotation-based Plugins Documentation पेज देखें।

3. अब जब हमारे पास Field Item क्लास है, हमें कुछ methods डिफाइन करने होंगे। सबसे पहले हम schema() देखेंगे।

Drupal 7 में कस्टम फील्ड बनाते समय आप schema को hook_field_schema से डिफाइन करते हैं। Drupal 8 में हम SnippetsItem क्लास में schema() method जोड़कर schema डिफाइन करते हैं।

Schema API Documentation में schema array structure और values का वर्णन है।
/**
 * {@inheritdoc}
 */
public static function schema(FieldStorageDefinitionInterface $field) {
  return array(
    'columns' => array(
      'source_description' => array(
        'type' => 'varchar',
        'length' => 256,
        'not null' => FALSE,
      ),
      'source_code' => array(
        'type' => 'text',
        'size' => 'big',
        'not null' => FALSE,
      ),
      'source_lang' => array(
        'type' => 'varchar',
        'length' => 256,
        'not null' => FALSE,
      ),
    ),
  );
}

4. अब हमें isEmpty() method जोड़ना है और डिफाइन करना है कि फील्ड का कौन सा आइटम खाली माना जाएगा। यह method Drupal 7 के hook_field_is_empty जैसा है।

/**
 * {@inheritdoc}
 */
public function isEmpty() {
  $value = $this->get('source_code')->getValue();
  return $value === NULL || $value === '';
}

5. आखिरी method जो हम क्लास में जोड़ेंगे वह propertyDefinitions() है।

/**
 * {@inheritdoc}
 */
static $propertyDefinitions;

/**
 * {@inheritdoc}
 */
public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
    $properties['source_description'] = DataDefinition::create('string')
      ->setLabel(t('Snippet description'));

    $properties['source_code'] = DataDefinition::create('string')
      ->setLabel(t('Snippet code'));

    $properties['source_lang'] = DataDefinition::create('string')
      ->setLabel(t('Programming Language'))
      ->setDescription(t('Snippet code language'));

    return $properties;
  }

यह method इस बात को डिफाइन करता है कि फील्ड values में कौन सा data type होगा। “Snippets field” में केवल तीन values हैं: विवरण, कोड और भाषा। इसलिए मैंने इन values को method में string के रूप में जोड़ दिया।

इसके बारे में और जानने के लिए drupal.org पर Entity API कैसे Typed Data API को इम्प्लीमेंट करता है डॉक्यूमेंटेशन देखें।

यहाँ क्लिक करें पूरी फाइल देखने के लिए। नोट: इसे PSR-4 स्पेसिफिकेशन में अपडेट करना होगा, अधिक जानकारी के लिए देखें Https://www.drupal.org/node/2128865.