2015-09-11 42 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

您是否正確定義了函數,如[here](http://twig.sensiolabs.org/doc/advanced.html#context-aware-filters)所述的'need_context'參數? – Matteo

+0

是的,我相信。這裏是一個pastebin - http://pastebin.com/D8ZnKKWm – Fyrebase

回答

4

這是不可能的功能,因爲上下文不通過引用傳遞。

在您的擴展,您甚至訪問$context['context'],這意味着一個名爲context,變量未上下文本身(_context是用於訪問上下文在模板的特殊變量的名字,但它不會出現在上下文數組發送功能,因爲它是數組本身)。

可能有一種方法可以通過更改節點類來自定義編譯函數來執行此操作。但我沒有嘗試過,並且可能最終難以維護表達語義。
無論如何,我會建議不要寫這樣的功能。在Twig中賦值變量沒有語義功能,不能作爲表達式的一部分來完成(函數在表達式中當然可用)。改變這種語義可能會導致怪異的行爲。

+0

謝謝@chris。當我得出結論時,我放棄了這種方法,這是錯誤的方法。 – Fyrebase

+0

您可以通過將函數定義更改爲'function setContextVar(&$ context,...)'所以現在可以改變樹枝的上下文。見[這裏](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 to {closure}()預計爲參考,值爲 ,在C:\ ... \ vendor \ twig \ twig \ lib \ Twig \ Environment.php(378)中給出: eval()'上線d代碼...

相反,你需要創建一個枝杈伸展:

$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" 
} 
相關問題