2011-08-12 15 views
58

Ho un CoreBundle che contiene file e immagini css principali. Ora ho un problema quando carico un'immagine da css; l'immagine non è mostrata.Symfony2 - Assetic - carica immagini in CSS

background-image:url(../images/file.png) 

(con un percorso completo funziona)

ho installato i beni con il comando: assets:install web e posso vedere i file di immagine e css sotto web/bundles/cmtcore/(css|images).

Ecco la struttura dei file all'interno del bundle di base:

/CoreBundle 
    /Resources 
     /public 
      /css 
       /main.css 
      /images 
       /file.png 

Ed ecco come si carica il file CSS nel modello:

{% stylesheets '@CmtCoreBundle/Resources/public/css/*' %} 
     <link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}" /> 
{% endstylesheets %} 

Grazie per il vostro aiuto in anticipo.

+0

Ho lo stesso problema. Cercando di risolverlo per cartella immagini in css, ma questo non ha funzionato – user257980

risposta

53

utilizzare il filtro cssrewrite da Assetic fascio

In config.yml:

assetic: 
    debug:   %kernel.debug% 
    use_controller: false 
    filters: 
     cssrewrite: ~ 

e quindi chiamare i tuoi fogli di stile come questo:

{% stylesheets 'bundles/cmtcore/css/*' filter='cssrewrite' %} 
     <link rel="stylesheet" type="text/css" media="screen" href="{{ asset_url }}" /> 
{% endstylesheets %} 

Oh, e non dimenticare di usare php app/console assetic:dump

+13

Il mio problema con questa soluzione è che symfony cerca di trovare le immagini in/Resources/public/css/* quando dovrebbe cercare/bundles/mybundle/images/... qualche idea su quella? – Clint

+1

cssrewrite è usato per riscrivere i percorsi delle immagini in css. Non "cerca immagini", non sa nemmeno cos'è un'immagine. – Inoryy

+10

ok, beh, cssrewrite sta riscrivendo i miei percorsi alle mie immagini in/Resources/public/css/* Quando dovrebbe riscriverlo in/bundles/mybundle/images/Sai di un modo per cambiare quello in cssrewrite? – Clint

-1

I "risolto" questo caricando il file css in modo diverso:

<link rel="stylesheet" href="{{ asset('bundles/cmtcore/css/main.css') }}" type="text/css" media="all" /> 

questo è il modo si è fatto in Acme/DemoBundle.

Lascerò questa domanda irrisolta perché questo sembra sciocco.

+6

Questo metodo funziona, ma non usa il bundle assetic per caricare il foglio di stile, il che significa che non puoi aggiungere filtri interessanti come yui_css. – Clint

13

Ho risolto il problema seguendo le istruzioni su questo sito: http://www.craftitonline.com/2011/06/symfony2-beautify-with-assetic-and-a-template-part-ii/

Il vero problema è che si fa riferimento alle risorse del bundle in modo assoluto, ma devono fare riferimento a esse in relazione.

{% stylesheets filter='cssrewrite' output='css/*.css' 
    'bundles/blistercarerisikobewertung/css/*' %} 
    <link href="{{ asset_url }}" type="text/css" rel="stylesheet" /> 
{% endstylesheets %} 

svuotare la cache ed installare il vostro patrimonio di nuovo

+1

Non devi installare le risorse dopo ogni modifica (anche in ambiente dev) con questo metodo? lo proverò – LBridge

+0

@tobias, sì, ho appena provato questo ed è effettivamente necessario installare le risorse dopo ogni modifica. Eeek. – Clint

+0

questo ha funzionato per me. vorrei sviluppare le mie risorse in web/bundle ... e più tardi quando il bundle dovrebbe essere distribuito copiarle di nuovo al bundle per commettere – ivoba

6

Per quanto riguarda la risposta di Yann, in realtà non c'è bisogno di reinstallare le attività dopo ogni modifica, se si utilizza l'opzione --symlink.

Si noti, tuttavia, che l'esecuzione i venditori script di installazione sovrascrive i link simbolici, quindi avrete bisogno di eliminare i bundles/* cartelle e installare i beni con l'opzione --symlink di nuovo dopo l'esecuzione dello script fornitori.

+0

Oppure aggiungere un'opzione in composit.json per utilizzare --symlink invece (se si utilizza 2.1+) – ChocoDeveloper

17

C'era alcuni problemi con ccsrewrite:

il filtro CssRewrite non funziona quando si utilizza la sintassi @MyBundle in AsseticBundle per fare riferimento ai beni. Questa è una limitazione nota.

Ecco versione di PHP per cssrewrite:

<?php 
    foreach ($view['assetic']->stylesheets(array(
     'bundles/test/css/foundation/foundation.css', 
     'bundles/test/css/foundation/app.css', 
     'bundles/test/css/themes/adapzonManager.css'), array('cssrewrite')) as $url): 
?> 
    <link rel="stylesheet" href="<?php echo $view->escape($url) ?>" /> 
<?php endforeach; ?> 
+7

Perché non utilizzare il ramoscello? – ChocoDeveloper

0

Ho un problema simile, e ho guardato intorno per almeno un giorno, e io non sono convinto ci sia una buona soluzione pratica a questo problema. Raccomando di usare Assetic per gestire javascript e css, e quindi semplicemente mettendo le tue immagini nella docroot del tuo sito web. Ad esempio, se hai un file css che fa riferimento a ../images/file.png, crea semplicemente una cartella di immagini sotto la tua docroot e metti file.png lì. Questa non è sicuramente la migliore soluzione teorica, ma è l'unica che ho trovato che funzioni davvero.

+0

Leggi la risposta dell'utente257980 e il commento Clint. C'è un modo per farlo bene. – ChocoDeveloper

+0

Al momento del mio post, quei metodi non funzionavano. – adavea

6

Ho sviluppato un piccolo pacchetto con un filtro aggiuntivo per risolvere questo problema. Puoi trovarlo su github: https://github.com/fkrauthan/FkrCssURLRewriteBundle.git

Con questo pacchetto, @Notation per assetic funziona se hai percorsi relativ nel tuo file css.

+0

senza capire veramente quale sia il tuo codice devo dire che fa miracoli. Grazie mille =) – azzy81

1

Ho risolto questo usando .htaccess:

Le mie attività sono memorizzati in src/Datacode/BudgetBundle/Resources/public/(css | img | js) e il parametro di uscita Assetic è impostato per scrivere a: pacchi/datacodebudget /css/styles.css (nella directory web)

Nel mio css uso il percorso relativo ../ per fare riferimento alle immagini.

Ecco la regola .htaccess:

mio css viene caricato nel modo seguente:

{% stylesheets 
    '@DatacodeBudgetBundle/Resources/public/css/bootstrap.css' 
    '@DatacodeBudgetBundle/Resources/public/css/bootstrap-responsive.css' 
    '@DatacodeBudgetBundle/Resources/public/css/styles.css' 
    '@DatacodeBudgetBundle/Resources/public/css/chosen.css' output="bundles/datacodebudget/css/styles.css" 
%} 
<link href="{{ asset_url }}" rel="stylesheet" type="text/css" /> 
{% endstylesheets %} 

Nel mio file config.yml ho:

assetic: 
    use_controller: true 

Quale (senza la riscrittura htaccess) fa sì che le immagini non vengano caricate poiché il percorso relativo per l'immagine è in app_dev.php/bundles/datacodebudget/i mg/someimage.jpg. L'uso del filtro cssrewrite non funziona o perché riscrive ../img in ../../../../Resources/public/img/ che risolve in Resources/public/img.

Utilizzando il metodo htaccess, le immagini vengono caricate correttamente e ho solo bisogno di eseguire assetic: dump/assets: installa quando aggiungo nuove immagini o voglio apportare modifiche alla produzione.

1

Ho risolto questo problema creando permanentemente la cartella "images" con immagini all'interno della cartella "symfony_root/web /". Risultato: 'symfony_root/web/images /' - e diventa un grande lavoro!

+0

Cattivo consiglio se hai intenzione di condividere i tuoi pacchetti con gli altri. È meglio mantenere le risorse nei loro pacchetti. – k0pernikus

Problemi correlati