2013-02-27 136 views
8

मैं TWIG मैक्रो में टेम्पलेट चर का उपयोग करने में सक्षम नहीं हूं।मैं TWIG मैक्रो में टेम्पलेट चर का उपयोग कैसे कर सकता हूं?

{% set myname = "Ligio" %} 
{{ _self.pagedurl(1) }} 

{% macro pagedurl(page) %} 
    Hi {{ _self.myname }}! This is Page Num {{ page }} 
{% endmacro %} 

मैं इसे कैसे मैक्रो को गुज़रे बिना चर myname पहुँच सकते हैं:

यहाँ एक सरल उदाहरण है?

+0

क्या आपने एक सरल '{{myname}}' कोशिश की? {{Myname}} के साथ – Maerlyn

+1

मैं चर के दायरे में नहीं हूं ... यह काम नहीं कर रहा है! – Ligio

उत्तर

16

आप नहीं कर सकते।

के रूप में दस्तावेज में कहा गया है:

पीएचपी कार्यों के रूप में, मैक्रो वर्तमान टेम्पलेट चर के लिए उपयोग नहीं है।

आपका एकमात्र समाधान macro लिए पैरामीटर पारित करने के लिए है:

{% import _self as flow %} 
{{ flow.pagedurl(1, "Ligio") }} 

{% macro pagedurl(page, myname) %} 
    Hi {{ myname }}! This is Page Num {{ page }} 
{% endmacro %} 

महत्वपूर्ण नोट:

तुम मेरे उदाहरण में देखा हो, मैं फोन {% import _self as flow %}

जब आप टेम्पलेट में किसी मैक्रो जहां आप इसे उपयोग करने के लिए जा रहे हैं, आप _self.input के माध्यम से सीधे मैक्रो फोन करने के लिए परीक्षा हो सकती है (परिभाषित) :
यह कुछ आप MUST करना है इसे आयात करने के बजाय; भले ही काम करने लगता है, यह वर्तमान कार्यान्वयन के साइड इफेक्ट है और यह अब Twig 2.x में काम नहीं करेगा।

http://twig.sensiolabs.org/doc/tags/macro.html

+1

एक समाधान जो आपके "ग्लोबल्स" को "हैक" कर सकता है, अपने महत्वपूर्ण चरों की एक सरणी के रूप में एक ट्विग var (या _context का उपयोग करें) बनाना है और फिर इस एकल ट्विग var को आपके द्वारा उपयोग किए जाने वाले किसी भी मैक्रो के अंतिम तर्क के रूप में पास करना है। --------- जब आपके मैक्रो के दायरे में आप varargs प्रॉपर्टी के माध्यम से इस अंतिम तर्क तक पहुंच सकते हैं। उदाहरण के लिए: {% सेट MyGlobals = varargs [0]%} –

5

आप मैक्रो में एक से अधिक वैश्विक चर पारित करने के लिए की जरूरत है, तो आप _context चर उपयोगी लग सकते:

{% macro mymacro(globalvars) %} 
    Value of the global variable pi is {{ globalvars.pi }} 
{% endmacro %} 

{% set pi = 3.14159 %} 
{{ _self.mymacro(_context) }} 

रेफरी: this या this जवाब।