2011-11-27 26 views
12

¿Hay una manera de pasar una variable al método Assetic en las plantillaspasar una variable a una URL activo Assetic en Symfony2

{% stylesheets 
    '@SomeExampleBundle/Resources/views/ SOMEVAR /css/*' 
%} 
<link rel="stylesheet" href="{{ asset_url }}" /> 
{% endstylesheets %} 

Así que lo que quiero hacer es pasar SOMEVAR desde el controlador.

+0

Use PHP como lenguaje de plantilla y simplemente guíelo. De lo contrario, implemente la lógica en PHP e inyéctelo en el lenguaje twig. – hakre

Respuesta

18

Por ahora, no creo que sea posible en absoluto. La razón detrás de esto es que Assetic se ejecuta por adelantado para volcar los activos, por lo que no ejecuta la plantilla de Twig para calcular la variable. Esto es probablemente lo mismo si lo haces en una plantilla de PHP.

Esto significa que las variables de tiempo de ejecución no se computarán y expandirán. Por lo tanto, esto hace que sea imposible generar los activos si se usa una variable. Esto puede cambiar en el futuro, pero esto supondría una sobrecarga en la producción cada vez que el usuario solicite los activos porque Assetic necesitaría generar los activos.

Sé que es posible definir programáticamente y genera el activo utilizando el código encontrado en Assetic directamente (no usando el AsseticBundle). Deberá experimentar, leer el código fuente y realizar pruebas y errores para resolver este problema.

Hay poca o ninguna documentación sobre Assetic en este momento. El único vínculo que puedo dar es el README que se encuentra en la página github de Assetic here. Espero que esto cambie pronto

Espero que esto ayude.

+0

Algo de esto se está haciendo posible. [Variables de activos en Assetic] (http://jmsyst.com/blog/asset-variables-in-assetic) muestra que en v1.1 será posible utilizar variables con un conjunto conocido de valores posibles. – roverwolf

-1

Tal vez no lo entendí, pero ... ¿estás tratando de hacer esto?

{% stylesheets 
    '@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*' 
%} 
<link rel="stylesheet" href="{{ asset_url }}" /> 
{% endstylesheets %} 

Porque, por lo que yo sé, la cadena que se pasa a stylesheets es una expresión válida de la ramita, por lo que es libre de usar la interpolación de variables.

De todos modos, no creo que sea una buena práctica tener activos dinámicos. ¿Qué es exactamente lo que quieres lograr? Puede haber una mejor solución.

+1

¡no! lea la respuesta de Matt –

+0

Bueno, ya es un poco tarde pero ... ¡gracias por el aviso! :) –

26

Es posible a través de la siguiente manera:

<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/') }}" /> 
+0

Excelente, muchas gracias. –

+5

esto no usa 'assetic', sino la función' asset' de symfony. no puedes usar filtros con esto – gondo

3

Para elaborar un poco sobre la respuesta de Chopchop:

primer lugar es necesario incluir todos los archivos que las necesidades Assetic para volcar, ya que necesita saber lo que necesidad de dumping. Lo que puede hacer de forma condicional es la inclusión del activo en tiempo de ejecución.

Así que primero puso en la parte Assetic:

{% javascripts 
'@ExampleComBundle/Resources/public/js/module1.js' 
'@ExampleComBundle/Resources/public/js/module2.js' 
%} 
{% endjavascripts %} 

Ahora usted puede poner en la condición que usted quería. Tanto los script se vierten en tiempo de despliegue, pero usted será capaz de elegir en tiempo de ejecución que se incluyen a:

<link rel="stylesheet" href="{{ asset('bundles/examplecombundle/js/module' ~ WHICH_MODULE_TO_INCLUDE ~ '.js) }}" /> 

El carácter ~ es sólo el operador de concatenación de plantillas Twig.

Obra por supuesto lo mismo con CSS y JS.

1

Otra alternativa, que trabaja con rangos limitados de opciones (solución de Piotr no funcionó para mí en el modo dev):

{% javascripts 
    '@AcmeDemoBundle/Resources/public/js/module_A.js' 
    output='js/module_A.js' 
%} 
    {% if myVar == "A" %} 
     <script src="{{ asset_url }}"></script> 
    {% endif %} 
{% endjavascripts %} 

{% javascripts 
    '@AcmeDemoBundle/Resources/public/js/submodule1_B.js' 
    '@AcmeDemoBundle/Resources/public/js/submodule2_B.js' 
    '@AcmeDemoBundle/Resources/public/js/submodule3_B.js' 
    output='js/module_B.js' 
%} 
    {% if myVar == "B" %} 
     <script src="{{ asset_url }}"></script> 
    {% endif %} 
{% endjavascripts %} 

... 

esta forma, cada módulo se vierten sobre el despliegue o dinámicamente manejado por Assetic , Y puede elegir qué módulo incluir, utilizando myVar.

Nota: utilicé el bloque javascripts aquí, pero funcionará igual con las hojas de estilo.

Cuestiones relacionadas