Czy można uzyskać dostęp do każdej zmiennej zdefiniowanej w szablonie gałązki z php?Dostęp do zmiennych szablonu twig z php
Np
Template:
...
{% set foo = 'foo' %}
...
A z PHP:
echo $template->foo
Albo coś w tym stylu.
Czy można uzyskać dostęp do każdej zmiennej zdefiniowanej w szablonie gałązki z php?Dostęp do zmiennych szablonu twig z php
Np
Template:
...
{% set foo = 'foo' %}
...
A z PHP:
echo $template->foo
Albo coś w tym stylu.
Dostęp każdą zmienną jest bardzo uciążliwe, więc to, co zrobiłem w końcu było stworzenie rozszerzenia, która przechowuje dane, które muszę:
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;
}
}
A w klasie, gdzie potrzebne dane:
$this->sampleExtension = new SampleExtension();
$twigEnv->addExtension($this->sampleExtension);
...
$html = $twigEnv->render('myTemplate.tpt', ...);
Korzystanie z tego szablonu:
...
{{ setFoo('bar') }}
...
Po render:
echo $this->sampleExtension->getFoo(); // Prints bar
Zmienne ustawione w gałązce są ustawiane w macierzy $context
, którą przechodzą na Twig_Template->display()
. Ta tablica jest przekazywana przez wartość, więc żadna modyfikacja nie będzie widoczna w zakresie zewnętrznym (PHP).
Tak, no, nie można używać zmiennych ustawionych w Twig w PHP.
Jeśli chcesz uzyskać dostęp do zmiennej szablonu, możesz wysłać tę zmienną jako odniesienie.
$foo = '';
$args['foo'] = &$foo;
$twig->render($template, $args);
...
echo $foo;
Przykład: (celem jest, aby ciało e-mail i temat w jednym szablonie)
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']);
Ten kod drukuje: Temat listu
Dodaj więcej objaśnień –
To może działać, jeśli zmiennych wewnątrz tej tablicy są odniesienia. Nie testowałem tego, ale nigdy nie mów nigdy :) – hakre
Czy byłoby możliwe, gdybym wysłał w tablicy kontekstowej obiekt i ustawił właściwości tego obiektu za pomocą niestandardowej funkcji gałązki? – ZenMaster
@ZenMaster Tak, to byłoby możliwe;) – NikiC