सब-थीम्स
सब-थीम्स, किसी भी अन्य थीम की तरह ही होती हैं, केवल एक अंतर के साथ: वे अपनी पैरेंट थीम के संसाधनों (resources) को इनहेरिट करती हैं। सब-थीम्स और उनकी पैरेंट थीम्स को जोड़ने वाली चेन (श्रृंखला) की संभावनाओं पर कोई सीमा नहीं है। एक सब-थीम किसी दूसरी सब-थीम की चाइल्ड हो सकती है, और इसे आपकी ज़रूरत के अनुसार ब्रांच और ऑर्गनाइज़ किया जा सकता है। यही बात सब-थीम्स को बड़ी शक्ति देती है।
सब-थीम बनाने के लिए, उसे किसी अन्य थीम की तरह ही परिभाषित करें और «base theme» कुंजी का उपयोग करके उसकी बेस थीम घोषित करें। (ध्यान दें कि इस कुंजी में अंडरस्कोर नहीं होता।)
सब-थीम का उदाहरण: Fluffiness
Fluffiness — एक सब-थीम का उदाहरण है, जो Classy को बेस थीम के रूप में उपयोग करती है।
इसमें आपको यह फ़ोल्डर संरचना मिलेगी:
themes/
└── fluffiness/
├── fluffiness.info.yml
└── fluffiness.libraries.yml
जानकारी वाली फ़ाइल का नाम है fluffiness.info.yml:
name: Fluffiness type: theme description: This is a fluffy sub theme of Classy core: 8.x # बेस थीम को परिभाषित करता है base theme: classy # लाइब्रेरी ग्रुप को परिभाषित करता है जिसमें हम css/js जोड़ सकते हैं। libraries: - fluffiness/global-styling # क्षेत्र (Regions) regions: header: Header featured: Featured content: Content sidebar_first: First sidebar sidebar_second: Second sidebar footer: Footer
fluffiness.libraries.yml फ़ाइल शामिल करें ताकि आप ऊपर परिभाषित global-styling समूह में css/js जोड़ सकें:
global-styling:
css:
component:
css/style.css: {}
और जानें: Drupal 8 थीम में CSS और JavaScript जोड़ना।
यदि आप «fluffiness» की जगह कोई और नाम उपयोग करना चाहते हैं, तो हर जगह «fluffiness» को अपने नाम से बदलें (फ़ोल्डर नाम सहित)। उदाहरण:
themes/
└── my_custom_theme/
├── my_custom_theme.info.yml
└── my_custom_theme.libraries.yml
info.yml फ़ाइल में «name:» लाइन में आप कोई भी टेक्स्ट डाल सकते हैं; यह आवश्यक नहीं है कि वह आपकी सब-थीम के मशीन नाम से मेल खाए। उदाहरण:
name: My Custom Theme # (बाकी लाइनें संक्षेप में छोड़ी गई हैं)
सब-थीम की सब-थीम
यदि आप सब-थीम की भी सब-थीम बनाना चाहते हैं, तो base theme के रूप में उस सब-थीम को ही उपयोग करना होगा।
- Fluffiness: Classy की पहली सब-थीम
name: Fluffiness type: theme description: This is a fluffy sub theme of Classy core: 8.x # बेस थीम को परिभाषित करता है base theme: classy
- Shaved: Fluffiness की सब-थीम (Classy की सब-थीम की सब-थीम)
name: Shaved type: theme description: This is a reduced fluff sub theme of Fluffiness core: 8.x # बेस थीम को परिभाषित करता है base theme: fluffiness
ध्यान दें कि base theme: पैरामीटर बेस थीम का machine name होता है, जबकि name: पैरामीटर वर्णनात्मक नाम होता है।
थीम रीजन (Regions) का इनहेरिटेंस
थीम रीजन (regions) बेस थीम से इनहेरिट नहीं होते। यदि आपकी सब-थीम की info.yml फ़ाइल में region: पैरामीटर खाली छोड़ा गया है या उसमें बेस थीम के सभी रीजन शामिल नहीं हैं, तो Drupal डिफ़ॉल्ट रीजन का उपयोग ब्लॉक्स को प्लेस करने के लिए कर सकता है। हम सिफारिश करते हैं कि अपनी बेस थीम में परिभाषित सभी रीजन को अपनी सब-थीम की info.yml फ़ाइल में कॉपी करें।
# क्योंकि रीजन इनहेरिट नहीं होते, सब-थीम में सभी रीजन परिभाषित होने चाहिए। regions: header: 'Header' primary_menu: 'Main menu' secondary_menu: 'Secondary menu' highlighted: 'Highlighted' help: 'Help' section_nav: 'Section Nav' breadcrumb: 'Breadcrumb' page_title: 'Page Title' local_tasks: 'Local Tasks' content: 'Content (Constrained)' content_fullwidth: 'Content (Edge-to-edge)' colophon_first: 'Colophon First Col' colophon_second: 'Colophon Second Col' colophon_third: 'Colophon Third Col' footer: 'Footer'
ब्लॉक प्लेसमेंट का इनहेरिटेंस
Drupal 8 में थीम्स config/install/ फ़ोल्डर के साथ आ सकती हैं, जिसमें ब्लॉक्स की प्री-डिफ़ाइंड कॉन्फ़िगरेशन और उनके प्लेसमेंट शामिल होते हैं। यह कॉन्फ़िगरेशन बेस थीम से इनहेरिट हो सकती है। लेकिन यदि आपकी सब-थीम की info.yml फ़ाइल में परिभाषित रीजन बेस थीम में उपलब्ध रीजन से मेल नहीं खाते, तो ब्लॉक्स का अनिश्चित या गलत प्लेसमेंट हो सकता है।
ब्लॉक टेम्पलेट्स का इनहेरिटेंस
यदि विस्तारित की जा रही थीम में कस्टम ब्लॉक टेम्पलेट्स हैं, तो वे सीधे इनहेरिट नहीं होंगे, क्योंकि सब-थीम पैरेंट थीम के ब्लॉक्स की कॉपी बनाती है और उन्हें अपने प्रीफ़िक्स के साथ रीनेम कर देती है। Twig ब्लॉक टेम्पलेट्स ब्लॉक के नाम से प्राप्त होते हैं, इसलिए यह उनके लिंक को तोड़ देता है। इस समस्या को ठीक करने के लिए सब-थीम में हुक का उपयोग करना पड़ता है। ऊपर दिए गए उदाहरणों के अनुसार, हम सब-थीम डायरेक्टरी में shaved.theme नामक फ़ाइल बनाएँगे और उसमें यह हुक डालेंगे:
/**
* Implements hook_theme_suggestions_HOOK_alter for blocks.
*/
function shaved_theme_suggestions_block_alter(&$suggestions, $variables) {
// पैरेंट थीम से ब्लॉक्स के लिए थीम सुझाव लोड करें।
foreach ($suggestions as &$suggestion) {
$suggestion = str_replace('shaved_', 'fluffiness_', $suggestion);
}
}
अपनी खुद की सब-थीम्स के लिए «shaved» को अपनी सब-थीम के नाम से और «fluffiness» को अपनी बेस थीम के नाम से बदलें।
Drupal 7 से अंतर
Drupal 7 की तुलना में सबसे बड़ा अंतर यह है कि .info फ़ाइलें अब .info.yml फ़ाइलें हैं, जो YAML सिंटैक्स का उपयोग करती हैं।