2015-12-10 4 views
6

के आस-पास प्रासंगिक एचटीएमएल लपेटें, मैं अपने एचटीएमएल टेम्पलेट में {{ product.name }} पर कॉल करते समय <span data-id=".."> कहता हूं, मैं कुछ एचटीएमएल स्वचालित रूप से लपेटना चाहता हूं।एक विशिष्ट टवीग वैरिएबल {{product.name}}

तो जब एक ट्वेंग टेम्पलेट में, मैं {{ product.name }} का उपयोग करता हूं, तो मैं आउटपुट होना चाहता हूं: <span data-type="product" data-id="8" data-prop="name">My product name</span>। मैं twig फ़िल्टर या मैक्रोज़ का उपयोग नहीं कर सकता, क्योंकि मुझे वास्तव में {{ product.name }} होने के लिए टेम्पलेट सिंटैक्स की आवश्यकता है, इसलिए अंतिम उपयोगकर्ता (टेम्पलेट डिज़ाइनर) को इसकी परवाह नहीं है।

कारण मुझे इसकी आवश्यकता है क्योंकि मैं ट्विग टेम्पलेट्स के लिए ऑन-पेज संपादन टूल बना रहा हूं, इसलिए मुझे HTML के भीतर से उन चर के संदर्भों को जानने की आवश्यकता है।

मैंने Compiler को ओवरराइड करने का प्रयास किया है कि Twig_Environment उपयोग करता है, लेकिन मैं twig variable node के आउटपुट को बदलने में प्रतीत नहीं कर सकता।

मैं यह कैसे कर सकता हूं?

संपादित

मैं मैं इस की जरूरत है कि {{ product.name }} सिंटैक्स का उपयोग करने के बाद से अन्य डिजाइनरों Symfony 2. के बाहर उन टेम्पलेट्स के साथ काम करेंगे मैं लगभग सभी टहनी चर सामने संपादन योग्य बनाना चाहते उल्लेखित करना चाहते थे -एंड, तो फिल्टर या मैक्रोज़ के साथ एक समाधान वास्तव में काम कर सकता है, लेकिन यह लिखने वाले मंच की उपयोगिता और पठनीयता को मारता है। वर्तमान में कोई सार्वजनिक एपीआई नहीं है जो कि मैं चाहता हूं कि मैं जो चाहता हूं उसे प्राप्त कर सकूं, यही कारण है कि मैं जुड़वां कंपाइलर के साथ झुका रहा हूं। मेरे पास यह प्राप्त करने के लिए टवीग आंतरिकों का आवश्यक ज्ञान नहीं है। अगर कोई मुझे एक दिशा में इंगित कर सकता है जो बहुत अच्छा होगा!

अद्यतन 2

मैं एक जगह जहाँ मैं प्राप्त कर सकते हैं जो मैं चाहता मिल गया है। प्रत्येक GetAttr नोड $this->getAttribute($someContext, "property") पर संकलित किया गया है। तो अगर मैं संकलित ट्विग टेम्पलेट के उप-वर्ग को बदल सकता हूं, तो मैं जो चाहता हूं उसे प्राप्त कर सकता हूं। डिफ़ॉल्ट रूप से सभी twig टेम्पलेट्स Twig_Template से बढ़ते हैं। मैं this method का विस्तार करना चाहता हूं।

मैं सभी संकलित ट्विग टेम्पलेट्स के सबक्लास को कैसे बदल सकता हूं?

अद्यतन 3 मुझे सभी संकलित ट्विग टेम्पलेट्स के लिए अपनी खुद की बेस क्लास का उपयोग करने का एक तरीका मिला है। मैं बस इसे टहन पर्यावरण पर एक विकल्प के रूप में सेट कर सकता हूं, this link देखें। मैं कल इसे काम करने की उम्मीद करता हूं और मैं एक उचित जवाब पोस्ट करूंगा कि मैंने इसे कैसे हल किया। सुनिश्चित नहीं है कि मैं भागने को कैसे संभालेगा, क्योंकि $this->getAttribute() के बाद ऐसा होगा।

+0

क्या आपने एक टवीग एक्सटेंशन लिखने की कोशिश की है? आपके पास कौन सी समस्या है? – Matteo

+0

हाँ मैंने किया, लेकिन वहां मेरे पास केवल पूरी फ़ाइल का संदर्भ है। लेकिन मुझे जो चाहिए वह संदर्भ है जो 'गेटएटर' नोड को दिया गया है और उस संपत्ति का उपयोग करें जो अंतिम टॉग आउटपुट के लिए इसे निकालने का प्रयास कर रहा है। जब मैं कंपाइलर का विस्तार करता हूं तो मैं उन नोड्स को प्राप्त करने के लिए 'सबकंपाइल' विधि का उपयोग कर सकता हूं, लेकिन मुझे उन लोगों के आउटपुट को बदलने का कोई तरीका नहीं मिल रहा है। टहलने के आंतरिक के लिए मेरा ज्ञान जो कुछ मैं चाहता हूं उसे पूरा करने के लिए पर्याप्त नहीं है। –

+0

डाउनवोट क्यों? अगर मेरा प्रश्न स्पष्ट नहीं है, तो कृपया ऐसा कहें, इसलिए मैं इसे बेहतर समझाने की कोशिश कर सकता हूं। –

उत्तर

2

मैं इसे अपने स्वयं के EditablePrintNode साथ कि जब एक VAR_START टोकन (टहनी पार्सर के अंदर) को पार्स बनाई गई है PrintNode लपेटकर द्वारा हल किया गया है। उस नोड में मैं प्रिंट नोड द्वारा संकलित अभिव्यक्ति को पार करता हूं और आवश्यक संपत्ति पथ प्राप्त करता हूं और PrintNode द्वारा संकलित डिफ़ॉल्ट ट्विग एस्केप फ़ंक्शन के आसपास एक रैपर फ़ंक्शन के लिए तर्क के रूप में पास करता है।

+0

कोड साझा करने के लिए देखभाल? मैं एक समान समस्या को हल करने के लिए देख रहा हूं, और आपके समाधान का एक उदाहरण वास्तव में सहायक होगा। – Andri

0

मैं एक कस्टम फ़िल्टर लिखने का सुझाव देता हूं। आप कैसे लिखने के बारे में दस्तावेज़ here खोजने के लिए और अपने वातावरण में कॉन्फ़िगर

// an anonymous function 
$filter = new Twig_SimpleFilter('my_custom_product_filter', function ($product) { 
    return '<span data-id="'.$product->getId().'" data-prop="name">'.$product->getName().'</span>'; 
}); 

आप दस्तावेज़

तो आप इस प्रकार का उपयोग कर सकते में वर्णित के रूप रजिस्टर करने की आवश्यकता कर सकते हैं:

{{ myProduct|my_custom_product_filter}} 

आशा यह मदद

2

मुझे लगता है कि macros उन प्रकार के लपेटन के लिए सर्वश्रेष्ठ उम्मीदवार हैं।

उदाहरण के लिए:

main.twig

{% import "macros.twig" as macros %} 

{{ macros.display_product(product) }} 

macros.twig

{% macro display_product(product) %} 

    <span data-id="{{ product.id }}" data-prop="name">{{ product.name }}</span> 

{% endmacro %} 

प्रसंग

product: 
    id: 8 
    name: My Georgeous Product 

परिणाम

<span data-id="8" data-prop="name">My Georgeous Product</span> 

देखें fiddle

+0

हाय @ एलेन लगता है कि एक ट्विग फ़िल्टर के बजाय मैक्रो बेहतर दृष्टिकोण लगता है। +1 – Matteo

संबंधित मुद्दे