2011-11-18 8 views
7

Estoy trabajando en un tipo de mini sitio de tablero que tiene bloques con cierta funcionalidad. Utilizando Symfony2 tengo una ruta/instagram dedicado que obtiene un fragmento html que muestra todas las imágenes tomadas en nuestro lugar.Uso de Twig para archivos Javascript dinámicos

Quiero actualizar este bloque cada 10 minutos, así que necesito ejecutar el siguiente javascript, en una función con un setTimeout, omitido para mayor claridad.

jQuery('.gallery').load("/instagram", function() { 
    jQuery('.gallery').cycle({ 
     fx: 'fade' 
    }); 
}); 

Este es el código de "@ KunstmaanDashboardBundle/Recursos/públicas/JS/instagram.js" que corro por Assetic para la concatenación y la optimización.

{% javascripts 
    '@KunstmaanDashboardBundle/Resources/public/js/thirdparty/jquery-1.7.min.js' 
    '@KunstmaanDashboardBundle/Resources/public/js/thirdparty/jquery.cycle.lite.js' 
    '@KunstmaanDashboardBundle/Resources/public/js/*' 
    filter='closure' 
%} 
    <script src="{{ asset_url }}"></script> 
{% endjavascripts %} 

Esto funciona, pero no me siento como este es un enfoque óptimo porque tengo que codificar la ruta en función de la carga(). Para solucionar este problema Necesito mover el contenido instagram.js a la plantilla de la ramita y el cambio a:

jQuery('.gallery').load("{{ path('KunstmaanDashboardBundle_instagram') }}", function() { 
    jQuery('.gallery').cycle({ 
     fx: 'fade' 
    }); 
}); 

Pero de esta manera pierdo la optimización y la separación de los beneficios de contenido de Assetic. Y nuestro código personalizado es el que más necesita esta optimización.

Así que mi pregunta es, ¿Cómo puedo combinar Assetic Javascript (y CSS para el caso) con el analizador de la ramita para que pueda poner el código anterior en el archivo instagram.js y hacer que funcione :)

Respuesta

8

Usted actualmente no se puede procesar el resultado de las plantillas de Twig con Assetic porque Assetic vacia los activos estáticamente para producción mientras que las plantillas de Twig se procesan en tiempo de ejecución.

Para este problema, usted puede usar el FOSJsRoutingBundle para exponer la ruta y procesarla desde el lado del cliente, entonces su JavaScript podría procesarse con Assetic.

+0

Esto funciona perfectamente. ¡Gracias! – Roderik

0

he encontrado la solución gracias a este post How to use YUI compressor in Symfony2 routing/controller:

$response = $this->renderView('template.html.twig'); 

    $path = $this->container->getParameter('kernel.root_dir'); 
    $ac = new \Assetic\Asset\StringAsset($response , array(new \Assetic\Filter\Yui\JsCompressorFilter($path . '/Resources/java/yuicompressor-2.4.7.jar'))); 

    $compressJS = $ac->dump(); 
    return new Response($compressJS, 200, array('Content-Type' => 'text/javascript')); 
Cuestiones relacionadas