2012-03-17 5 views
5

Sto usando ExposeTranslationBundle (esporre traduzioni a JavaScript) e JMSI18nRoutingBundle (esporre percorsi a JavaScript). Questo fa parte del mio tag <head>:Come combinare questi asset in 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> 

è possibile combinare gli ultimi due <script> importazioni nel primo Assetic e come?

+0

Hai un blocco javascript in un file e le ultime due righe in file diversi? – Axxiss

+0

@Axxiss le ultime due righe provengono da bundle di terze parti. – Polmonino

risposta

3

I cosa non è possibile perché il file javascript FOSJSRouting viene generato da un controller. Internaly i bundle memorizza nella cache i js ma in app/cache, quindi deve passare attraverso il controller ogni richiesta. Non ho familiarità con il pacchetto di traduzioni di expose, ma suppongo che sia lo stesso problema qui.

C'è stata una discussione in corso nel numero tracke di FOSJsRouterBundle su github e c'è anche una soluzione. Vedere il problema completo qui: https://github.com/FriendsOfSymfony/FOSJsRoutingBundle/issues/22

La soluzione è quella di avere uno script o un comando per scaricare l'output ai file nella directory web/js:

<?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()); 

Questo è un po 'un sollution soluzione. Stavo pensando di implementare un bundle generico il cui compito può essere configurato per diversi altri bundle usando i controller per produrre js. Le azioni del controllore dovrebbero essere configurate in un file yml e quindi un comando dovrebbe essere eseguito ad ogni distribuzione/modifica di route/stringhe. Ma io havn't avuto il tempo per questo ... ancora;)

+0

Bella soluzione grazie! –

1

Invece di importazione, si potrebbe tranquillamente mettere in linea, vale a dire:

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

{# JMSI18nRoutingBundle ... #} 

</script> 

è necessario controllare il file di routing per quei fasci.