2012-02-13 16 views
8

¿Cómo se puede obtener una variable global twig para mantener la modificación después de cambiarla con includes? Mi salida deseada es "set @ deeper" aunque obtengo "configuración original".Symfony 2 + Twig variables globales

app/config/config.yml

twig: 
    globals: 
     testvar: "original setting" 

root.html.twig

{% include "MyBundle::levelone.html.twig" %} 
{{ testvar }} 

levelone.html.twig

{% set testvar = "set @ levelone" %} 
{% include "MyBundle::deeper.html.twig" %} 

deeper.html.twig

{% set testvar = "set @ deeper" %} 
+0

¿Has probado dentro de los bloques? Quiero decir, envuelva todo su '{% set testvar%}' y '{{testvar}}' con '{% block global_test%}'. – Florian

Respuesta

6

Pregunta interesante y no sé una respuesta, pero no hay cantidad de tonterías con bloques y cosas que funcionen. Busqué en los archivos de plantillas de caché de php generados. Cuando hace eco de una variable, se ve así:

// {{ testvar }} 
echo twig_escape_filter($this->env, $this->getContext($context, "testvar"), "html", null, true); 

Así que, básicamente, primero busca testvar en su contexto local. Si no se encuentra, se ve en el contexto global.

Cuando se establece el valor de var test que se obtiene:

// {% set testvar = 'level one' }} 
$context["testvar"] = "level one"; 

lo que sólo el contexto local se actualiza. El valor cambiado desaparece cuando regresa la plantilla incluida.

De manera predeterminada, al menos parece que las variables globales son solo de lectura.

Es posible hacerlo a través de una extensión. No sé lo suficiente sobre los aspectos internos.

1

¿Ha intentado definir una variable global a través de Twig? Puede hacerlo en su archivo config.yml de la siguiente manera:

twig: 
    globals: 
     my_global_var : myvalue 

Así {{my_global_var}} en su plantilla imprimirá myvalue

Para más información leer el official docs.

+0

cómo tengo que poner esas 2 líneas: "$ twig = new Twig_Environment ($ loader); $ twig-> addGlobal ('text', new Text());" en mi proyecto symfony2.1? – linuxatico

+0

Bueno, todavía no estoy usando Symfony2.1, ya que es una versión beta. Sin embargo, puedo decir que con Symfony2.016 puede definir una variable global en su archivo config.yml como se proporciona [aquí] (http://symfony.com/doc/current/cookbook/templating/global_variables.html). – JeanValjean

+1

el hecho es que de esta manera la variable es de solo lectura, es decir, en una plantilla puede cambiar su valor, pero cuando accede desde otra plantilla, encontrará que su valor ahora es el predeterminado establecido en la configuración .yml – linuxatico

8

de un objeto al tanto de contenedores:

$this->get('twig')->addGlobal('ThomasDecauxIsAwsome', 4); 
0

Es posible mediante la definición de una ramita de extensión a través deServicios, comprobar here