logo

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

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

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

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

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

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

स्क्रॉल
30/09/2025, by Ivan

Menu

  • Drupal 7 - एंटिटी साधारण stdClass ऑब्जेक्ट्स थीं।
  • Drupal 8 - एंटिटी अब विशेष टाइप किए गए ऑब्जेक्ट्स हैं, और हर एंटिटी टाइप एक क्लास को परिभाषित करता है, जो उस एंटिटी के इंस्टेंसेज़ के लिए उपयोग किया जाएगा।

आवश्यकताएँ
एंटिटी क्लासेज़ को उस मॉड्यूल के Entity namespace में रखा जाना चाहिए, जो एंटिटी टाइप प्रदान करता है, जैसे \Drupal\[module_name]\Entity। इसका मतलब है कि एंटिटी क्लास की PHP फ़ाइलें मॉड्यूल की src/Entity डायरेक्टरी में मिलेंगी।

क्लास के लिए DocBlock में EntityType annotation होना चाहिए, जो उस एंटिटी टाइप के लिए मेटाडेटा को परिभाषित करता है। इसमें एंटिटी टाइप का लेबल, कंट्रोलर्स, टेबल्स आदि जैसी चीजें शामिल होती हैं। सभी उपलब्ध मेटाडेटा प्रॉपर्टीज़ की डॉक्यूमेंटेड सूची के लिए \Drupal\Core\Entity\Annotation\EntityType क्लास देखें।

नामकरण

एंटिटी टाइप के नाम में मॉड्यूल का नाम prefix के रूप में होना चाहिए, यदि एंटिटी टाइप और मॉड्यूल का नाम समान नहीं हैं। क्लास नाम में prefix आवश्यक नहीं है, क्योंकि यह परिभाषित करने वाले मॉड्यूल के namespace में स्थित होता है, बशर्ते कि उसका नाम अपने आप में पर्याप्त रूप से स्पष्ट हो। उदाहरण के लिए, taxonomy terms के लिए एंटिटी टाइप का नाम taxonomy_term है, और क्लास का नाम Drupal\taxonomy\Entity\Term है।

इंटरफेसेज़

Drupal 8 इंटरफेसेज़ के साथ type hints और methods का उपयोग करने की अनुशंसा करता है, बजाय क्लासेज़ के। उदाहरण के लिए, generic Entity storage EntityInterface को type hint करता है, जैसे hook_entity_insert (EntityInterface $entity), और node-specific storage NodeInterface को type hint करता है, जैसे hook_node_insert (NodeInterface $node)।

एंटिटी के फ़ील्ड्स/प्रॉपर्टीज़ अक्सर बहुत छोटे, स्टोरेज-ओरिएंटेड और ज्यादा स्पष्ट नहीं होते। इसके अलावा, कंटेंट एंटिटी आम तौर पर अपने फ़ील्ड्स (यहाँ तक कि बेसिक फ़ील्ड्स जैसे node title) के लिए निश्चित प्रॉपर्टीज़ का उपयोग नहीं करती।

इसलिए अनुशंसित दृष्टिकोण यह है कि methods के दस्तावेज़ित नामों के साथ एक interface प्रदान करें। इसके लिए कुछ नियम हैं:

  • Methods आमतौर पर get/set/is जैसे prefix के साथ होते हैं: getSomething(), setSomething($value), isSomething().
  • सिर्फ उन्हीं चीजों के लिए methods जोड़ें जिन्हें अन्य कोड बदलने की आवश्यकता हो। उदाहरण: node की आखिरी बदली गई तिथि ($node->updated) को बदला नहीं जाना चाहिए, इसलिए एक method है $node->getChangedTime(), लेकिन $node->setChangedTime() नहीं है।
  • Self-descriptive method नामों का उपयोग करें, जैसे $node->status के लिए method का नाम $node->isPublished()।

समझदारी

यह पता लगाने के लिए कि कोई मॉड्यूल कौन-कौन से एंटिटी टाइप प्रदान करता है, उस मॉड्यूल के Entity namespace में उन क्लासेज़ को देखें जिनमें @EntityType annotation है। इसमें annotation key id के तहत नाम भी होता है।

जब यह पता लगाने की कोशिश कर रहे हों कि कोई विशेष एंटिटी टाइप कहाँ परिभाषित है, तो पहली चीज़ देखने लायक होती है एंटिटी टाइप का prefix। यदि मॉड्यूल इस नामकरण समझौते का पालन नहीं करता, तो इसे id = "$type" खोजकर पाया जा सकता है। यदि क्लास या इंटरफ़ेस ज्ञात है, तो namespace यह दर्शाता है कि यह कहाँ से आता है।

उदाहरण

core/modules/node/src/Entity/Node.php:

namespace Drupal\node\Entity;

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityChangedTrait;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\user\UserInterface;

/**
 * Defines the node entity class.
 *
 * @ContentEntityType(
 *   id = "node",
 *   label = @Translation("Content"),
 *   bundle_label = @Translation("Content type"),
 *   handlers = {
 *     "storage" = "Drupal\node\NodeStorage",
 *     "storage_schema" = "Drupal\node\NodeStorageSchema",
 *     "view_builder" = "Drupal\node\NodeViewBuilder",
 *     "access" = "Drupal\node\NodeAccessControlHandler",
 *     "views_data" = "Drupal\node\NodeViewsData",
 *     "form" = {
 *       "default" = "Drupal\node\NodeForm",
 *       "delete" = "Drupal\node\Form\NodeDeleteForm",
 *       "edit" = "Drupal\node\NodeForm"
 *     },
 *     "route_provider" = {
 *       "html" = "Drupal\node\Entity\NodeRouteProvider",
 *     },
 *     "list_builder" = "Drupal\node\NodeListBuilder",
 *     "translation" = "Drupal\node\NodeTranslationHandler"
 *   },
 *   base_table = "node",
 *   data_table = "node_field_data",
 *   revision_table = "node_revision",
 *   revision_data_table = "node_field_revision",
 *   translatable = TRUE,
 *   list_cache_contexts = { "user.node_grants:view" },
 *   entity_keys = {
 *     "id" = "nid",
 *     "revision" = "vid",
 *     "bundle" = "type",
 *     "label" = "title",
 *     "langcode" = "langcode",
 *     "uuid" = "uuid",
 *     "status" = "status",
 *     "uid" = "uid",
 *   },
 *   bundle_entity_type = "node_type",
 *   field_ui_base_route = "entity.node_type.edit_form",
 *   common_reference_target = TRUE,
 *   permission_granularity = "bundle",
 *   links = {
 *     "canonical" = "/node/{node}",
 *     "delete-form" = "/node/{node}/delete",
 *     "edit-form" = "/node/{node}/edit",
 *     "version-history" = "/node/{node}/revisions",
 *     "revision" = "/node/{node}/revisions/{node_revision}/view",
 *   }
 * )
 */
class Node extends ContentEntityBase implements NodeInterface {
  // ...
}

Drupal 8 में एंटिटी का पूरा चित्र देखने के लिए, हम निम्नलिखित आरेख को देख सकते हैं। यह एंटिटी क्लासेज़ को दर्शाता है। देखने के लिए इसे नई टैब में खोलें:

classDrupal_Entities