9.9.1. Drupal में कॉन्फ़िगरेशन प्रबंधन। कंटेंट और कॉन्फ़िगरेशन इम्पोर्ट करना।
जब आप एक साइट से दूसरी साइट पर एक कॉन्फ़िगरेशन इम्पोर्ट करते हैं, तो कुछ कॉन्फ़िगरेशन कंटेंट को आउटपुट करने के लिए आवश्यक होते हैं, लेकिन कॉन्फ़िगरेशन कंटेंट खुद में कोई डेटा नहीं होता। इस ट्यूटोरियल में, हम समझेंगे कि एक साइट से दूसरी साइट पर ब्लॉक्स, नोड्स और टैक्सोनॉमी टर्म्स को कैसे ट्रांसफर किया जा सकता है।
हम एक साइट पर एक ब्लॉक बनाएंगे और कॉन्फ़िगरेशन को दूसरी साइट पर ट्रांसफर करेंगे, आप एक साइट से दूसरी साइट पर कॉन्फ़िगरेशन ट्रांसफर करने के तरीके को पिछले लेख में देख सकते हैं 9.9. Drupal में कॉन्फ़िगरेशन के साथ काम करना। Active, Sync कॉन्फ़िगरेशन, DEV से LIVE तक कॉन्फ़िगरेशन ट्रांसफर। Active, Sync configures, DEV से LIVE तक कॉन्फ़िगरेशन का ट्रांसफर।
आप ऐसा एक एरर देखेंगे: "This block is broken or missing. You may be missing content or you might need to enable the original module.":
ब्लॉक को एक विशिष्ट UUID वाली एंटिटी ब्लॉक की आवश्यकता होती है। UUID एक यूनिक आइडेंटिफायर होता है, भले ही हम नई साइट पर वही ब्लॉक उसी कंटेंट के साथ बनाएं, यह ब्लॉक कॉन्फ़िगरेशन द्वारा नहीं पकड़ा जाएगा, क्योंकि नए ब्लॉक का UUID अलग होगा। आप ब्लॉक के लिए कॉन्फ़िगरेशन में आवश्यक UUID देख सकते हैं:
ब्लॉक के UUID को Config UUID से भ्रमित न करें। बात यह है कि कॉन्फ़िग्स भी Drupal में एंटिटी होती हैं, लेकिन ब्लॉक्स और नोड्स के विपरीत जो कंटेंट एंटिटीज होते हैं, कॉन्फ़िग्स कॉन्फ़िग एंटिटीज होते हैं। अगले पाठों में हम ContentEntity और ConfigEntity क्लासेस को देखेंगे।
अब आप जानते हैं कि ब्लॉक के लिए आपको कौन सा UUID चाहिए और आपको इस ब्लॉक को कोड के माध्यम से बनाना होगा ताकि जब आप अपना ब्लॉक सही UUID के साथ डिप्लॉय करें, तो वह बन सके। इसके लिए हम hook_update_n()
का उपयोग करेंगे:
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Extension%
hook_update_n()
आपको कस्टम मॉड्यूल के .install फाइल में जोड़ना होगा, ताकि अपडेट मॉड्यूल द्वारा पकड़ा जाए। इसे पहले से साइट में जोड़ा और सक्षम किया जाना चाहिए। हर नए hook_update_n()
को जब update.php या drush या drupal console के माध्यम से डेटाबेस अपडेट किया जाता है, तब निष्पादित किया जाएगा। अन्य hooks की तुलना में जहां आपको केवल hook के शुरुआत में शब्द बदलने की आवश्यकता होती है, hook_update_n()
में आपको हर अपडेट के लिए n को अंत में बदलना होता है ताकि प्रत्येक अपडेट का अपना संस्करण हो, आमतौर पर Drupal 8.x के लिए 8000 और अधिक, और Drupal 7.x के लिए 7000 और अधिक नंबरों का उपयोग करते हैं, यानी पहला अंक Drupal के संस्करण को दर्शाता है।
/modules/custom/drupalbook/drupalbook.install:
/**
* Add simple block with text and image.
*/
function drupalbook_update_8001(&$sandbox) {
$uuid = 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142';
$block = \Drupal::entityManager()->loadEntityByUuid('block_content', $uuid);
if (empty($block)) {
$block = \Drupal\block_content\Entity\BlockContent::create([
// Block title.
'info' => 'Simple text block with image',
// Block bundle.
'type' => 'basic',
'uuid' => 'dc0876cf-a242-4f4c-af0e-8a27fbe9e142'
]);
$block->body->value = 'Hello, World!';
$block->save();
}
}
अब आपको इस कोड को दूसरी साइट पर ले जाना होगा और फिर वहां update.php फाइल को रन करना होगा:
Drupal इस अपडेट को खोजेगा और आप अपना ब्लॉक देखेंगे जब यह पूरा हो जाएगा।
अगर आप उस कोड को देखें जो ब्लॉक बनाता है, तो इससे पहले कि आप ब्लॉक बनाएं, हम यह जांचते हैं कि ब्लॉक पहले से मौजूद है, ताकि जब आप अपनी सोर्स साइट को अपडेट करें, जहां ब्लॉक पहले से मौजूद है, तो उस UUID के साथ ब्लॉक बनाने की त्रुटि न हो।
यह भी ध्यान दें कि केवल ब्लॉक का टेक्स्ट ट्रांसफर होता है, जो छवियाँ टेक्स्ट में ऑनलाइन लोड की जाती हैं, वे CKEditor के इमेज ब्राउज़र के माध्यम से ट्रांसफर नहीं होतीं, क्योंकि फ़ाइलों को अलग से ट्रांसफर करना होगा। इसे drush, ssh, ftp के माध्यम से या git में डाले (यदि 1 या 2 फ़ाइलें हैं, यदि बड़ी हैं, तो git को इमेज फाइल्स से भरना बेहतर नहीं होता)। डिप्लॉयमेंट प्रक्रिया प्रोजेक्ट से प्रोजेक्ट में अलग-अलग होती है और हर जगह विभिन्न दृष्टिकोणों का उपयोग होता है, इसलिए प्रोजेक्ट के लिए कम से कम एक बुनियादी दस्तावेज़ होना महत्वपूर्ण है जो डिप्लॉयमेंट प्रक्रिया का वर्णन करता हो।
यह वही टैक्सोनॉमी टर्म्स के निर्माण पर भी लागू होता है, हम केवल डिक्शनरी सेटिंग्स और टैक्सोनॉमी टर्म फील्ड्स को कॉन्फ़िगरेशन्स में ट्रांसफर करते हैं, लेकिन टैक्सोनॉमी टर्म्स को अलग से बनाना चाहिए, उदाहरण के लिए, इस तरह:
\taxonomy\Entity\Term;
...
/**
* Create taxonomy term programmatically.
*/
function drupalbook_update_8002(&$sandbox) {
$term = Term::create([
'name' => 'Drupal 8',
'vid' => 'tags',
])->save();
}
vid फील्ड में आपको टैक्सोनॉमी डिक्शनरी का मशीन नाम (Vocabulary ID) निर्दिष्ट करना होता है।
नोड्स बनाने के लिए, आपको लगभग यह कोड उपयोग करना होगा:
/**
* Create node programmatically.
*/
function drupalbook_update_8003(&$sandbox) {
$node = Node::create(['type' => 'page']);
$node->set('title', 'About us');
$body = [
'value' => 'Text about us',
'format' => 'basic_html',
];
$node->set('body', $body);
$node->status = 1;
$node->enforceIsNew();
$node->save();
}
लगभग, क्योंकि आप set()
के बजाय बस बराबर भी लिख सकते हैं:
= [
'value' => 'Text about us',
'format' => 'basic_html',
];
$node->set('body', $body);
// or
$node->body->format = 'basic_html';
$node->body->value = 'Text about us',
हर बार जब आप नया hook_update_n()
जोड़ते हैं, तो आपको update.php
रन करना होगा। अगर आप Acquia या अन्य होस्टिंग का उपयोग करते हैं जिसमें ऑटो-डिप्लॉयमेंट है, तो यह प्रक्रिया स्वचालित होती है और आपको यह स्पष्ट करना होगा कि डिप्लॉयमेंट कैसे होगा।
कोड के उदाहरण आप github पर देख सकते हैं:
https://github.com/levmyshkin/drupalbook8