Макросы в шаблонах Twig
Twig की आधिकारिक डाक्यूमेंटेशन से: «मैक्रोज़ सामान्य प्रोग्रामिंग भाषाओं में फ़ंक्शंस के समान होते हैं। ये बार-बार उपयोग होने वाले HTML पैटर्न को पुन: प्रयोज्य (reusable) एलिमेंट्स में रखने के लिए उपयोगी हैं, ताकि कोड को दोहराना न पड़े»।
{% macro input(name, value, type, size) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
मैक्रोज़ PHP की नैटिव फ़ंक्शंस से कुछ तरीकों से अलग होते हैं:
- आर्ग्युमेंट के डिफ़ॉल्ट मान default फ़िल्टर की मदद से मैक्रो के अंदर निर्धारित किए जाते हैं;
- मैक्रो के सभी आर्ग्युमेंट वैकल्पिक होते हैं।
- यदि अतिरिक्त पोज़िशनल आर्ग्युमेंट्स मैक्रो को पास किए जाते हैं, तो वे varargs नाम की विशेष वेरिएबल में मानों की सूची के रूप में पहुँचते हैं।
लेकिन, PHP फ़ंक्शंस की तरह, मैक्रोज़ को वर्तमान टेम्पलेट की वेरिएबल्स तक सीधा एक्सेस नहीं होता। आप पूरे कॉन्टेक्स्ट को विशेष वेरिएबल _context के रूप में आर्ग्युमेंट में पास कर सकते हैं।
मैक्रो कॉल करना
_self से
मैक्रो उसी Twig फ़ाइल में रखा जा सकता है, जहाँ से आप उसे कॉल कर रहे हैं। इस स्थिति में _self का उपयोग होता है...
{{ _self.input(name, value, type, size) }}
बाहरी फ़ाइल से
फिर भी, यह अनुशंसित है कि मैक्रोज़ को एक अलग फ़ाइल (जैसे macros.twig) में रखा जाए, ताकि वे कई टेम्पलेट्स में उपयोग किए जा सकें।
उदाहरण के लिए, एक कस्टम थीम «mytheme» में हम मैक्रो फ़ाइल यहाँ रखते हैं ...
[site_root]/themes/custom/mytheme/templates/macros.twig
नोट: मैक्रो फ़ाइल का नाम कुछ भी हो सकता है (any.twig), लेकिन उसका एक्सटेंशन .html नहीं होना चाहिए (यानी macros.html.twig काम नहीं करेगा)। फ़ाइल हमेशा «templates» डायरेक्टरी में होनी चाहिए, चाहे आप इसे कहीं भी उपयोग करें (जैसे Layout Builder लेआउट्स, जिन्हें आप .../mytheme/layouts में रखते हैं, फिर भी मैक्रो ../mytheme/templates में होना चाहिए)।
उस टेम्पलेट में जहाँ आप मैक्रो उपयोग करना चाहते हैं, यह import स्टेटमेंट जोड़ें:
{% import '@mytheme/macros.twig' as myMacros %}
@mytheme जादुई रूप से आपकी थीम की «templates» डायरेक्टरी को ढूंढ लेता है, लेकिन यदि आपकी फ़ोल्डर संरचना अतिरिक्त है, तो आपको उसे भी import स्टेटमेंट में लिखना होगा:
{% import '@mytheme/foo/bar/macros.twig' as myMacros %}
ध्यान दें कि इस डाक्यूमेंटेशन के पुराने वर्ज़न में कहा गया था कि nested डायरेक्टरी स्ट्रक्चर को परिभाषित करना ज़रूरी नहीं है, लेकिन व्यवहार अलग हो सकता है। यदि आप इसे किसी कस्टम मॉड्यूल में कर रहे हैं, तो वही तकनीक अपनाएँ, बस थीम के नाम की जगह मॉड्यूल का नाम उपयोग करें (जैसे @mycustommodule)।
फिर मैक्रो को इस तरह उपयोग करें...
{{ myMacros.input(name, value, type, size) }}
उदाहरण
Drupal 8 में मैक्रो का उपयोग मुख्य नेविगेशन बनाने के लिए किया जाता है (देखें menu.html.twig फ़ाइल)।