2012-03-17 9 views
5

estoy usando ExposeTranslationBundle (exponer traducciones a javascript) y JMSI18nRoutingBundle (exponer rutas a JavaScript). Esto es parte de mi etiqueta de <head>:¿Cómo combinar estos activos en Symfony2?

{% javascripts filter='?yui_js' output='js/app.js' 
     '../app/Resources/public/js/jquery-*.js' 
     '../app/Resources/public/js/jquery/*' 
     '../app/Resources/public/js/app.js' 
     'bundles/fosjsrouting/js/router.js' 
     'bundles/bazingaexposetranslation/js/translation.js' %} 
     <script src="{{ asset_url }}" ></script> 
    {% endjavascripts %} 

    <!-- ExposeTranslationBundle and JMSI18nRoutingBundle --> 
    <script src="{{ path('fos_js_routing_js', 
     {"callback": "fos.Router.setData"}) }}"></script> 
    <script src="{{ url('bazinga_exposetranslation_js') }}"></script> 

es posible combinar los dos últimos <script> importaciones en primera Assetic y cómo?

+0

¿Tiene el bloque javascript en un archivo y las últimas dos líneas en archivos diferentes? – Axxiss

+0

@Axxiss las dos últimas líneas provienen de paquetes de terceros. – Polmonino

Respuesta

3

Creo que no es posible porque el archivo javascript FOSJSRouting es generado por un controlador. Internamente, los paquetes almacenan en caché el js pero en la aplicación/caché, por lo que debe pasar por el controlador cada solicitud. No estoy familiarizado con el paquete de traducción de exposición, pero supongo que es el mismo problema aquí.

Ha habido una discusión en curso en el tema tracke de FOSJsRouterBundle en github y también hay una solución. Véase el número completo aquí: https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/issues/22

La solución es tener un script o comando para mandar la salida a archivos en web/js directorio:

<?php 

require_once __DIR__.'/../app/bootstrap.php.cache'; 
require_once __DIR__.'/../app/AppKernel.php'; 

use Symfony\Component\HttpFoundation\Request; 

$kernel = new AppKernel('stage', false); 
$kernel->loadClassCache(); 
$response = $kernel->handle(Request::create('/js/routing?callback=fos.Router.setData')); 

file_put_contents(__DIR__.'/../web/js/routes.js', $response->getContent()); 

Esto es algo de un sollution solución. He estado pensando en implementar un paquete genérico que esta tarea puede configurarse para varios otros paquetes utilizando controladores para producir js. Las acciones del controlador deberían configurarse en un archivo yml y luego se tendría que ejecutar un comando en cada implementación/modificación de rutas/cadenas. Pero yo no te has tenido tiempo para esto ... todavía;)

+0

Buena solución thx! –

1

En lugar de importación, que podría felizmente ponerlo en línea, es decir:

<script type="text/javascript"> 
{# BazingaExposeTranslation #} 
{% render 'bazinga.exposetranslation.controller:exposeTranslationAction' 
    with { domain_name: "messages", _locale:app.session.locale, _format: "js" } %} 

{# JMSI18nRoutingBundle ... #} 

</script> 

Es necesario comprobar el archivo de enrutamiento para esos paquetes.

Cuestiones relacionadas