9.11. Drupal एंटिटी API — कस्टम एंटिटी प्रकार बनाना।. Drupal Console का उपयोग करके एंटिटी प्रकार जनरेट करना।
हम पहले ही Form API, Fields API को समझ चुके हैं और जानते हैं कि Drupal में डेटा डेटाबेस में कैसे संग्रहीत होता है। अब आइए Drupal साइटों की नींव यानी Entity API को समझें।
आपने शायद देखा होगा कि फ़ील्ड्स अपने आप में मौजूद नहीं होते, बल्कि वे किसी Entity से “जुड़े” होते हैं — जैसे नोड (nodes), ब्लॉक (blocks), टैक्सोनॉमी शब्द (taxonomy terms), व्यूज़ (views) आदि। आप Bundle entities बना सकते हैं — जैसे सामग्री प्रकार (content types), ब्लॉक प्रकार (block types), टैक्सोनॉमी शब्दकोश (taxonomy vocabularies)। लेकिन अगर आपको अपनी खुद की नई एंटिटी और उसके बंडल्स बनाने की आवश्यकता है तो क्या होगा? ऐसी स्थिति में आपको नई एंटिटी बनाने के लिए Entity API की आवश्यकता होगी।
मैंने सारा कोड GitHub पर drupalbook_product मॉड्यूल में जोड़ा है। आप इस मॉड्यूल को डाउनलोड कर सकते हैं और अपनी वेबसाइट पर जोड़ सकते हैं:
https://github.com/levmyshkin/drupalbook8
नई एंटिटी प्रकार बनाना सबसे आसान है Drupal Console के माध्यम से, क्योंकि इसमें केवल एक कमांड चलानी होती है।
आपको अक्सर नई एंटिटी प्रकार बनाने की आवश्यकता नहीं होगी। अधिकांश छोटे और मध्यम आकार के प्रोजेक्ट्स contrib मॉड्यूल्स पर आधारित होते हैं, जैसे कि ऑनलाइन स्टोर के लिए Commerce मॉड्यूल:
https://www.drupal.org/project/commerce
यदि आप अपना स्वयं का प्लगइन मॉड्यूल बनाना चाहते हैं, तो हो सकता है कि आपको नई एंटिटी प्रकार बनाने की आवश्यकता पड़े। हालाँकि, अक्सर Drupal मॉड्यूल रिपॉज़िटरी में पहले से उपलब्ध कोई उपयुक्त मॉड्यूल मिल जाता है, जिसमें आपकी आवश्यकतानुसार कार्यक्षमता को जोड़ा या बढ़ाया जा सकता है।
इस लेख में हम Entity API का विश्लेषण करेंगे और अपनी खुद की Product Entity प्रकार बनाएँगे, जो एक छोटे कस्टम कैटलॉग या स्टोर की नींव के रूप में कार्य करेगी। लेकिन यदि आप वास्तव में एक पूर्ण स्टोर बनाना चाहते हैं, तो मैं दृढ़ता से अनुशंसा करता हूँ कि आप Commerce का उपयोग करें — यह आपके और आपके ग्राहकों के बहुत समय की बचत करेगा।
जब आप एक नई एंटिटी प्रकार बनाना चाहते हैं, तो प्रश्न उठता है — क्यों न एक नया “Product” सामग्री प्रकार बनाकर उसे कैटलॉग के लिए उपयोग किया जाए? हाँ, ऐसा एक छोटे कैटलॉग के लिए किया जा सकता है जहाँ Views और साधारण मूल्य या स्टॉक फ़िल्टर लगाए जाएँ। लेकिन जब उत्पादों की संख्या हज़ारों में पहुँच जाएगी, तो कंटेंट पेज पर आवश्यक उत्पाद ढूँढना असुविधाजनक हो जाएगा। प्रबंधक पृष्ठ पर article, category, color, name आदि जैसे फ़िल्टर जोड़ना चाहेगा:
/admin/content
यह अन्य सामग्री प्रकारों — जैसे समाचार (News), लेख (Articles), कार्यक्रम (Events) और पृष्ठों (Pages) — के साथ काम करने में बाधा डालेगा। इसलिए ऐसी स्थितियों में एक अलग Product Entity Type बनाई जाती है, जिसकी अपनी एडमिन पैनल और सेटिंग्स होती हैं।
अब चलिए एक अलग Product Entity Type बनाना शुरू करते हैं। लेकिन कमांड चलाने से पहले मैं दृढ़ता से सलाह दूँगा कि साइट का बैकअप बना लें — कम से कम डेटाबेस का। क्योंकि एंटिटी टाइप बनाने की प्रक्रिया में कुछ कॉन्फ़िगरेशन फाइलें डेटाबेस में लिखी जाती हैं, और यदि किसी कारण से ये कॉन्फ़िगरेशन अधूरी रह गईं, तो आपकी साइट काम करना बंद कर सकती है। इसलिए पहले बैकअप बनाना न भूलें।
अब हम एक नया मॉड्यूल बनाएँगे, जिसे आप Drupal Console के माध्यम से भी बना सकते हैं:
drupal generate:module
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-module.html
$ vendor/bin/drupal generate:module
// Welcome to the Drupal module generator
Enter the new module name:
> Drupalbook Product
Enter the module machine name [drupalbook_product]:
>
Enter the module Path [modules/custom]:
>
Enter module description [My Awesome Module]:
> Products catalog
Enter package name [Custom]:
>
Enter Drupal Core version [8.x]:
>
Do you want to generate a .module file? (yes/no) [yes]:
> no
Define module as feature (yes/no) [no]:
> no
Do you want to add a composer.json file to your module? (yes/no) [yes]:
> no
Would you like to add module dependencies? (yes/no) [no]:
> no
Do you want to generate a unit test class? (yes/no) [yes]:
> no
Do you want to generate a themeable template? (yes/no) [yes]:
> no
Do you want proceed with the operation? (yes/no) [yes]:
> yes
Generated or updated files
Generation path: /home/laptop/projects/drupalbook
1 - /modules/custom/drupalbook_product/drupalbook_product.info.yml
Generated lines: "5"
या बस एक मॉड्यूल मैन्युअली बनाइए जिसमें केवल यह फ़ाइल हो:
name: 'drupalbook_product'
type: module
description: 'Products catalog'
core: 8.x
package: 'Drupalbook'
अब हम Product entity type जनरेट करेंगे:
https://hechoendrupal.gitbooks.io/drupal-console/en/commands/generate-entity-content.html
$ vendor/bin/drupal generate:entity:content
// Welcome to the Drupal Content Entity generator
Enter the module name [admin_toolbar]:
> drupalbook_product
Enter the class of your new content entity [DefaultEntity]:
> DrupalbookProductEntity
Enter the machine name of your new content entity [drupalbook_product_entity]:
>
Enter the label of your new content entity [Drupalbook product entity]:
> Product
Enter the base-path for the content entity routes [/admin/structure]:
>
Do you want this (content) entity to have bundles? (yes/no) [no]:
> yes
Is your entity translatable? (yes/no) [yes]:
> yes
Is your entity revisionable? (yes/no) [yes]:
> no
अब जब मॉड्यूल जनरेट हो गया है, तो इसे सक्षम करें ताकि नई एंटिटी साइट पर दिखाई दे:

जब एंटिटी जनरेट की जाती है, तो Drupal Console यह पूछता है कि एंटिटी का प्रकार कैसा होगा।
Enter the class of your new content entity [DefaultEntity]: यह आपकी PHP क्लास का नाम है, और नाम के अंत में Entity जोड़ना बेहतर है।
Enter the machine name of your new content entity [drupalbook_product_entity]: यह क्लास नाम से स्वतः प्रस्तावित किया जाता है — Enter दबाने पर वही नाम उपयोग हो जाएगा।
Enter the base-path for the content entity routes [/admin/structure]: इससे आपकी एंटिटी के CRUD ऑपरेशन्स के लिए एक प्रशासनिक पृष्ठ तैयार होगा:

उत्पाद पेज का प्रदर्शन अभी बहुत साधारण है, लेकिन इसे भविष्य में सुधारा जा सकता है या Views के माध्यम से कस्टम रूप से बनाया जा सकता है:

नई एंटिटी बनाने से पहले, आपको पहले उस एंटिटी प्रकार का एक bundle बनाना होगा। हमने पहले ही कहा था कि यह bundable entity होगी:
Do you want this (content) entity to have bundles? (yes/no):
इसलिए हम एक नया उत्पाद प्रकार बनाएँगे — जैसे कपड़े (Clothes):

अब हमारे नए उत्पाद प्रकार के लिए हम आवश्यक फ़ील्ड्स को कॉन्फ़िगर कर सकते हैं:

कम से कम हमें एक price फ़ील्ड की आवश्यकता होगी।
अब कुछ उत्पाद बनाएँ और डेटाबेस देखें। हमारे पास drupalbook_product_entity नाम की टेबल है जिसमें हमारे उत्पादों के UUID संग्रहीत होते हैं:

इसके अलावा एक और टेबल है drupalbook_product_entity_field_data, जिसमें Properties संग्रहीत होते हैं। ये विशेष फ़ील्ड्स सीधे टेबल में स्टोर होते हैं क्योंकि ये फ़ील्ड्स — जैसे Name (Entity label, जैसे नोड का Title) — संशोधन (revision) के अनुसार नहीं बदलते।

यदि आप अतिरिक्त फ़ील्ड्स जोड़ते हैं, तो प्रत्येक फ़ील्ड के लिए दो टेबल बनाई जाएँगी, क्योंकि हमने इसे revisionable चुना था:
Is your entity revisionable? (yes/no) [yes]
मुझे लगता है कि अब आप समझ गए होंगे कि Drupal में नई एंटिटी प्रकार कैसे बनाई जाती है। अगले लेखों में हम अपने कस्टम कैटलॉग / स्टोर की क्षमताओं का विस्तार करेंगे।
मैंने सारा कोड GitHub पर drupalbook_product मॉड्यूल में जोड़ा है — आप इसे डाउनलोड कर सकते हैं और अपनी वेबसाइट पर उपयोग कर सकते हैं: