2015-09-11 7 views
5

क्या Twig_SimpleFunction को कॉल करके वर्तमान ट्विग संदर्भ को संशोधित करना संभव है?क्या एक Twig_SimpleFunction संदर्भ को संशोधित कर सकता है?

मैं नीचे समारोह पंजीकृत है:

<?php 
namespace Craft; 

class TwiggedTwigExtension extends \Twig_Extension 
{ 
    public function getName() 
    { 
     return 'Twigged'; 
    } 

    public function getFunctions() 
    { 
     return array(
      'setContextVar' => new \Twig_SimpleFunction('setContextVar', array($this, 'setContextVar'), array('needs_context' => true)), 
     ); 
    } 

    public function setContextVar($context, $str, $val) 
    { 
     $context['context'][$str] = $val; 

     var_dump(array_keys($context['context'])); 
    } 
} 

जब ऐसा {{ setContextVar('hellow', 'world') }} की तरह एक टेम्पलेट से कहा जाता है, var_dump संशोधित संदर्भ को दर्शाता है। लेकिन {{ dump(_context|keys) }} जैसे टेम्पलेट में त्वरित जांच संशोधित संदर्भ नहीं दिखाती है।

क्या मैं इस बारे में गलत तरीके से जा रहा हूं?

+0

आप सही तरीके से के रूप में [यहां] वर्णित 'need_context' मानकों के साथ फंक्शन को परिभाषित कर (http://twig.sensiolabs.org/doc/advanced.html#context-aware-filters)? – Matteo

+0

हां, मुझे विश्वास है। यहां एक पेस्टबिन है - http://pastebin.com/D8ZnKKWm – Fyrebase

उत्तर

4

यह कार्यों के साथ संभव नहीं है क्योंकि संदर्भ संदर्भ द्वारा पारित नहीं किया गया है।

अपने विस्तार में, आप भी $context['context'], जो context, नाम के एक चर का मतलब होगा एक्सेस कर रहे हैं नहीं संदर्भ में ही (_context एक विशेष चर टेम्पलेट में संदर्भ का उपयोग करने के लिए प्रयोग किया जाता नाम है, लेकिन यह संदर्भ में प्रकट नहीं होता है सरणी फ़ंक्शन पर भेजी जाती है क्योंकि यह सरणी स्वयं ही है)।

नोड वर्ग को बदलकर फ़ंक्शन के कस्टम संकलन के साथ ऐसा करने का एक तरीका हो सकता है। लेकिन मैंने कोशिश नहीं की है और यह अभिव्यक्ति को अभिव्यक्ति बनाए रखने के लिए थोड़ा मुश्किल हो सकता है।
और वैसे भी, मैं इस तरह के समारोह लिखने के खिलाफ सिफारिश करेंगे। टवीग में एक चर को आवंटित करने में कोई फ़ंक्शन अर्थपूर्ण नहीं होता है और अभिव्यक्ति के हिस्से के रूप में नहीं किया जा सकता है (फ़ंक्शन पाठ्यक्रम के अभिव्यक्ति में उपयोग योग्य होते हैं)। इस अर्थपूर्ण को बदलने से अजीब व्यवहार हो सकते हैं।

+0

धन्यवाद @ क्रिस। मैंने इस दृष्टिकोण पर छोड़ दिया क्योंकि मैं निष्कर्ष पर आया था कि यह गलत दृष्टिकोण था। – Fyrebase

+0

आप फ़ंक्शन परिभाषा को 'function setContextVar (& $ संदर्भ, ... में फ़ंक्शन परिभाषा को बदलकर संदर्भ द्वारा संदर्भ को पारित कर सकते हैं ...) 'तो अब टहनी के संदर्भ को बदलना संभव है। [यहां] देखें (http://stackoverflow.com/questions/43978499/set-value-of-single-object-in-multidimensional-array-in-twig-template?noredirect=1#comment74986325_43978499) – DarkBee

1

तरह @DarkBee उसकी टिप्पणी में उल्लेख किया है, आप संदर्भ द्वारा यह पारित करके संदर्भ संशोधित कर सकते हैं:

function setContextVar(&$context, ...) 

हालांकि, टहनी करने के लिए सिर्फ एक समारोह जोड़ने काम करने के लिए प्रतीत नहीं होता है (मैं टहनी उपयोग कर रहा हूँ 2.4.4):

$twig->addFunction(new Twig_Function('setContextVar', function(&$context, $name, $value) { 
    $context[$name] = $value; 
}, ['needs_context' => true])); 

आप एक टहनी फ़ाइल में समारोह का उपयोग करते हैं, संदर्भ संशोधित नहीं होता है, और आपको यह चेतावनी मिलती है:

चेतावनी: पैरामीटर 1 से {बंद करें}() एक संदर्भ होने की उम्मीद है, मूल्य सी में दिया गया है: \ ... \ विक्रेता \ twig \ twig \ lib \ Twig \ environment.php (378): eval() '

$twig->addExtension(new class extends Twig_Extension { 
    public function getFunctions() { 
     return [ 
      new Twig_Function('setContextVar', [$this, 'setContextVar'], ['needs_context' => true]), 
     ]; 
    } 

    public function setContextVar(&$context, $name, $value) { 
     $context[$name] = $value; 
    } 
}); 

तो फिर तुम एक चेतावनी प्राप्त किए बिना टहनी में इसका इस्तेमाल कर सकते हैं:: लाइन पर घ कोड ...

इसके बजाय, आप एक टहनी एक्सटेंशन बनाने के लिए की जरूरत है

{{ dump() }} 
{% do setContextVar('foo', 'bar') %} 
{{ dump() }} 

उपरोक्त प्रिंट्स उदाहरण:

array(0) { 
} 

array(1) { 
    ["foo"]=> 
    string(3) "bar" 
} 
संबंधित मुद्दे