2011-10-28 13 views

Odpowiedz

3

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 
0

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.

+0

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

+0

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

+0

@ZenMaster Tak, to byłoby możliwe;) – NikiC

0

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

+0

Dodaj więcej objaśnień –

Powiązane problemy