Доступ к переменным шаблона twig из php
можно ли получить доступ к каждой переменной, определенной в шаблоне twig из php?
например:
Template:
...
{% set foo = 'foo' %}
...
и из PHP:
echo $template->foo
или что-то в этом роде.
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
переменные установить в Twig в $context
массив передать в Twig_Template->display()
. Этот массив передается по значению, поэтому любые изменения в нем не будут видны во внешней области (PHP).
и нет, вы не можете использовать переменные, установленные в Twig в PHP.
Если вы хотите получить доступ к переменной шаблона вы можете отправить эту переменную как ссылку.
$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'] = 'a@example.com';
$mail['subject'] = '';
$args = array(
'user' => 'John',
'subject' => &$mail['subject']
);
$mail['message'] = $twig->render($tl, $args);
print_r($mail['subject']);
этот код выводит: темой письма