2012-09-16 14 views
7

Attualmente sto sviluppando un'applicazione Web con Symfony 2.1.0.Symfony2: Come includere correttamente le risorse insieme all'ereditarietà dei modelli di Twig?

Ho letto il numero Templating chapter del libro e sto cercando di includere risorse (in questo momento, è solo un singolo foglio di stile) nelle mie pagine web.

sto usando il Three-level inheritance system menzionato nel libro, e la mia struttura applicazione attualmente assomiglia a questo:

  • app/Resources/views/
    • base.html.twig : Modello, contenente titolo, fogli di stile e corpo blocchi.
  • src/I miei/PageBundle/Resources/views
    • layout.html.twig: modello di layout (estendendo il modello di base), aggiungendo il foglio di stile principale al foglio di stile blocco, e sovrascrivendo il corpo blocco, compreso navigation.html.twig e definente una contenuto blocco
    • layout admin.html.twig: stessa cosa come sopra, ma compresi navigazione-admin.html.twig
    • src/My/PageBundle/Resources/views/principali
      • modelli standard, che si estende il modello di layout e sovrascrivendo il contenuto blocco
    • src/mio/PageBundle/Resources/views/Amministrazione
        modelli di amministrazione
      • . Stessa cosa sopra, ma estendendo il modello di layout di amministrazione.
  • src/mio/PageBundle/Resources/public/css
    • main.css: foglio di stile principale

Come potete vedere, ho metti il ​​foglio di stile nel mio pacchetto. Non so se questa è una buona pratica o no.

Ora, il punto è, nel layout.html ho aggiunto questo:

{% block stylesheets %} 
    {{ parent() }} 

    <link rel="stylesheet" type="text/css" href="{{ asset('css/main.css)' }}" /> 
{% endblock %} 

Ma asset('css/main.css') è solo il collegamento a /css/main.css, mentre ./app/console assets:install installa le attività in web/bundles/mypagebundle/. Non mi piace il fatto che in questo modo, il nome del mio bundle sarebbe pubblicamente visibile (il che potrebbe far sospettare che gli utenti stiano usando Symfony, e mi piace mantenere l'interno della mia pagina web, beh, interno). È possibile modificare la directory in cui assets:install installa le risorse? Mi sembra noioso installare manualmente le risorse nel web /.

Sto anche pensando di utilizzare Assetic per la gestione delle risorse, poiché personalmente mi piace la possibilità di ridimensionare automaticamente i miei script/fogli di stile e archiviarli tutti insieme in un unico file. Tuttavia, sento che questo non è possibile se includi fogli di stile a diversi livelli, cioè non funzionerebbe con il sistema di ereditarietà a tre livelli. È possibile aggirare il problema? Inoltre, usare Assetic mi consente di nascondere il nome del mio gruppo al pubblico?

risposta

4

L'utilizzo di assetic dovrebbe risolvere tutti i vostri problemi.

Ho sentito dire che questo non è possibile se si includono i fogli di stile a diversi livelli, vale a dire che non avrebbe funzionato con i tre a livello di sistema di successione

È possibile, ma verrà generato un file css per ogni livello (proprio come con asset(), in realtà).

Esempio:

la layout:

{% block stylesheets %} 
    {{ parent() }} 
    {% stylesheets 'main.css' %} 
     <link rel="stylesheet" type="text/css" href="{{ asset_url }}" /> 
    {% endstylesheets %} 
{% endblock %} 

sub-template:

{% block stylesheets %} 
    {{ parent() }} 
    {% stylesheets 'sub.css' %} 
     <link rel="stylesheet" type="text/css" href="{{ asset_url }}" /> 
    {% endstylesheets %} 
{% endblock %} 

risultato:

<link rel="stylesheet" type="text/css" href="..." /> 
<link rel="stylesheet" type="text/css" href="..." /> 

alternativa sub-modello può sostituire completamente i fogli di stile Blo ck, in modo che solo un foglio di stile si genera (ma è meno secca):

{% block stylesheets %} 
    {% stylesheets 'main.css' 'sub.css' %} 
     <link rel="stylesheet" type="text/css" href="{{ asset_url }}" /> 
    {% endstylesheets %} 
{% endblock %} 

risultato (in produzione/non debug):

<link rel="stylesheet" type="text/css" href="..." /> 
+0

Così non è in alcun modo possibile per avere la colla Assetic tutto fogli di stile a tutti i livelli insieme? Perché con il secondo metodo, dovrei cambiare TUTTI i sottotipi se decido di aggiungere un altro foglio di stile al massimo livello, giusto? –

+0

Giusto. Si potrebbe anche definire la risorsa "principale" in config.yml (consultare i documenti) e fare riferimento a questa risorsa anziché fare riferimento direttamente a main.css. In questo modo è possibile modificare l'asset principale senza dover modificare tutti i modelli. – arnaud576875

+0

Grazie. In una nota a margine, il resto della mia struttura applicativa ti sembra una buona pratica o c'è qualcosa che mi manca? –

Problemi correlati