2011-10-28 12 views

risposta

3

Accesso ogni variabile è molto ingombrante, quindi quello che ho fatto, alla fine, è stato quello di creare un'estensione che contiene i dati che ho bisogno:

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; 
    } 
} 

E nella classe in cui avevo bisogno di dati:

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

Utilizzando questo modello:

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

Dopo il rendering:

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

Le variabili impostate in Twig sono impostate nell'array $context passato a Twig_Template->display(). Questo array viene passato in base al valore in modo che eventuali modifiche ad esso non vengano visualizzate nell'ambito (PHP) esterno.

Quindi, no, non è possibile utilizzare le variabili impostate in Twig in PHP.

+0

Questo potrebbe funzionare se le variabili all'interno di quell'array ci sono riferimenti. Non l'ho provato, ma non dico mai mai :) – hakre

+0

Sarebbe possibile se ho inviato nell'array di contesto un oggetto e impostato le proprietà di quell'oggetto con una funzione di ramoscello personalizzata? – ZenMaster

+0

@ZenMaster Sì, sarebbe possibile;) – NikiC

0

Se si desidera accedere alla variabile di modello, è possibile inviare questa variabile come riferimento.

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

Esempio: (l'obiettivo è quello di rendere il corpo e-mail e soggetti in un unico modello)

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']); 

Questo codice stampa: oggetto di una lettera

+0

Aggiungere ulteriori spiegazioni –

Problemi correlati