是否有可能從PHP訪問樹枝模板中定義的每個變量?訪問從PHP的樹枝模板變量
如:
Template:
...
{% set foo = 'foo' %}
...
而且從PHP:
echo $template->foo
或者類似的東西。
是否有可能從PHP訪問樹枝模板中定義的每個變量?訪問從PHP的樹枝模板變量
如:
Template:
...
{% set foo = 'foo' %}
...
而且從PHP:
echo $template->foo
或者類似的東西。
訪問每個變量是很麻煩的,所以我到底做的是創造它認爲我需要的數據擴展:
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
您在樹枝中設置的變量設置爲$context
陣列,您將其傳遞給Twig_Template->display()
。這個數組是通過值傳遞的,所以對它的任何修改都不會在外部(PHP)範圍中看到。
因此,沒有,您不能使用您在PHP中使用Twig設置的變量。
如果你想訪問模板變量,你可以發送這個變量作爲參考。
$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']);
此代碼打印: 主題的一封信
添加更多解釋 –
這可能,如果變量的工作在該數組內是引用。沒有測試過它,但從來沒有說過從來沒有:) – hakre
如果我在上下文數組中發送一個對象並使用自定義的小枝函數設置該對象的屬性,是否可能? – ZenMaster
@ ZenMaster是的,這是可能的;) – NikiC