2011-11-27 3 views
12

C'è un modo per passare una variabile al metodo Assetic nei modellipassare una variabile a un URL risorsa Assetic in Symfony2

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

Quindi quello che voglio fare è passare SOMEVAR dal controller.

+0

Usa PHP come linguaggio modello e lo script solo. Altrimenti implementa la logica in PHP e inseriscila nel linguaggio ramoscello. – hakre

risposta

18

Per ora, non penso che sia possibile. La ragione di ciò è che Assetic viene eseguito in anticipo per eseguire il dump delle risorse, quindi non esegue il modello Twig per calcolare la variabile. Questo è probabilmente lo stesso se lo fai in un template PHP.

Ciò significa che le variabili di runtime non verranno calcolate ed espanse. Pertanto, ciò rende impossibile generare le risorse se viene utilizzata una variabile. Questo potrebbe cambiare in futuro, ma ciò comporterebbe un sovraccarico di produzione ogni volta che le risorse vengono richieste dall'utente perché Assetic avrebbe bisogno di generare le risorse.

So che è possibile definire e generare la risorsa in modo programmatico utilizzando direttamente il codice trovato in Assetic (non utilizzando AsseticBundle). Avrai bisogno di sperimentare, leggere il codice sorgente e fare prove ed errori per risolvere questo problema.

Al momento non è disponibile documentazione su Assetic. L'unico link che posso dare è lo README trovato nella pagina github di Assetic here. Spero che questo cambi presto.

Spero che questo aiuti.

+0

Parte di questo sta diventando possibile. [Asset Variable in Assetic] (http://jmsyst.com/blog/asset-variables-in-assetic) mostra che nella v1.1 sarà possibile utilizzare variabili con un insieme noto di possibili valori. – roverwolf

-1

Forse non ho capito, ma ... stai provando a farlo?

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

Perché, per quanto ne so, la stringa passata a stylesheets è un'espressione Ramoscello valida, così sei libero di utilizzare l'interpolazione variabile.

In ogni caso, non penso che sia una buona pratica disporre di risorse dinamiche. Cosa vuoi esattamente raggiungere? Potrebbe esserci una soluzione migliore.

+1

no! leggi la risposta di Matt –

+0

Beh, è ​​un po 'tardi ma ... grazie per l'heads-up! :) –

26

E 'possibile attraverso questo modo:

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

Eccellente, grazie mille. –

+5

questo non usa 'assetic', ma la funzione' asset' di symfony. non puoi usare filtri con questo – gondo

3

di elaborare un po' la risposta di Chopchop:

In primo luogo è necessario includere tutti i file che le esigenze Assetic a discarica, come ha bisogno di sapere cosa si bisogno di dumping. Quello che puoi fare in modo condizionale è l'inclusione del bene stesso in fase di runtime.

Quindi, prima messo nella parte Assetic:

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

Ora si può mettere in condizione che si voleva. Sia quelli script verrà scaricato in fase di distribuzione, ma si sarà in grado di scegliere in fase di esecuzione quale includere:

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

Il ~ personaggio è proprio l'operatore di concatenazione di template Twig.

Ovviamente funziona lo stesso con CSS e JS.

1

Un'altra alternativa, che lavora con gamme limitato di opzioni (soluzione di Piotr non ha funzionato per me in modalità 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 %} 

... 

In questo modo, ogni modulo verrà scaricato sulla distribuzione o dinamicamente gestita da Assetic E puoi scegliere quale modulo includere, usando myVar.

Nota: ho utilizzato il blocco javascripts qui, ma funzionerà allo stesso modo con i fogli di stile.