2011-10-28 45 views

回答

3

訪問每個變量是很麻煩的,所以我到底做的是創造它認爲我需要的數據擴展:

class SampleExtension extends Twig_Extension { 
    private $foo; 

    function getName() { 
     return 'sampleExtension'; 
    } 

    function getFunctions() { 
     return array(
      'setFoo' => new Twig_Function_Method($this, 'setFoo') 
     ); 
    } 

    function setFoo($value) { 
     $this->foo = $value; 
    } 

    function getFoo() { 
     return $this->foo; 
    } 
} 

而且在我需要的數據的類:

$this->sampleExtension = new SampleExtension(); 
$twigEnv->addExtension($this->sampleExtension); 
... 
$html = $twigEnv->render('myTemplate.tpt', ...); 

使用這個模板:

... 
{{ setFoo('bar') }} 
... 

渲染後:

echo $this->sampleExtension->getFoo(); // Prints bar 
0

您在樹枝中設置的變量設置爲$context陣列,您將其傳遞給Twig_Template->display()。這個數組是通過值傳遞的,所以對它的任何修改都不會在外部(PHP)範圍中看到。

因此,沒有,您不能使用您在PHP中使用Twig設置的變量。

+0

這可能,如果變量的工作在該數組內是引用。沒有測試過它,但從來沒有說過從來沒有:) – hakre

+0

如果我在上下文數組中發送一個對象並使用自定義的小枝函數設置該對象的屬性,是否可能? – ZenMaster

+0

@ ZenMaster是的,這是可能的;) – NikiC

0

如果你想訪問模板變量,你可以發送這個變量作爲參考。

$foo = ''; 
$args['foo'] = &$foo; 
$twig->render($template, $args); 
... 
echo $foo; 

例子:(我們的目標是讓電子郵件正文和主題中的一個模板)

Twig_Autoloader::register(); 
$loader = new Twig_Loader_String(); 
$twig = new Twig_Environment($loader); 
$tl = <<<EOL 
{% set subject = "Subject of a letter" %} 
Hello, {{ user }} 

This is a mail body 

-- 
Site 
EOL; 
$mail['to'] = '[email protected]'; 
$mail['subject'] = ''; 
$args = array(
    'user' => 'John', 
    'subject' => &$mail['subject'] 
); 
$mail['message'] = $twig->render($tl, $args); 
print_r($mail['subject']); 

此代碼打印: 主題的一封信

+0

添加更多解釋 –