Problème
J'ai un fichier CSS avec quelques chemins (pour les images, les polices, etc. url(..)
).
Ma structure de chemin est comme ceci:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Je souhaite référencer mes images dans la feuille de style.
Première solution
J'ai changé tous les chemins du fichier CSS en chemins absolus. Ce n'est pas une solution, car l'application devrait (et doit!) Fonctionner également dans un sous-répertoire.
Deuxième solution
Utilisez Assetic avec filter="cssrewrite"
.
J'ai donc changé tous mes chemins dans mon fichier CSS en
url("../../../../../../web/images/myimage.png")
pour représenter le chemin réel de mon répertoire de ressources vers le /web/images
répertoire. Cela ne fonctionne pas, car cssrewrite produit le code suivant:
url("../../Resources/assets/")
ce qui est évidemment le mauvais chemin.
Une fois assetic:dump
ce chemin créé, ce qui est toujours faux:
url("../../../web/images/myimage.png")
Le code brindille d'Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Solution actuelle (troisième)
Étant donné que tous les fichiers CSS aboutissent /web/css/stylexyz.css
, j'ai changé tous les chemins du fichier CSS pour qu'ils soient relatifs:
url("../images/myimage.png")
Cette (mauvaise) solution fonctionne, sauf dans l' dev
environnement: le chemin CSS est /app_dev.php/css/stylexyz.css
et donc le chemin de l'image qui en résulte est /app_dev.php/images/myimage.png
, ce qui entraîne un NotFoundHttpException
.
Existe-t-il une solution meilleure et efficace?
app_dev.php
?Réponses:
J'ai rencontré le même problème.
En bref:
J'ai fait un test avec TOUTES les combinaisons (saines) possibles des éléments suivants:
Resources/public/css
"répertoire public" (as ) avec le CSS et un répertoire "privé" (asResources/assets/css
).Cela m'a donné un total de 14 combinaisons sur la même brindille, et cette route a été lancée à partir de
donnant ainsi 14 x 3 = 42 tests.
De plus, tout cela a été testé en travaillant dans un sous-répertoire, il n'y a donc aucun moyen de tromper en donnant des URL absolues car elles ne fonctionneraient tout simplement pas.
Les tests étaient deux images sans nom, puis des divs nommés de 'a' à 'f' pour le CSS construit à partir du dossier public et nommés 'g à' l 'pour ceux construits à partir du chemin interne.
J'ai observé ce qui suit:
Seuls 3 des 14 tests ont été montrés de manière adéquate sur les trois URL. Et NONE provenait du dossier "interne" (Ressources / actifs). C'était une condition préalable pour avoir le CSS PUBLIC de rechange et ensuite construire avec assetic FROM là-bas.
Voici les résultats:
Résultat lancé avec /app_dev.php/
Résultat lancé avec /app.php/
Résultat lancé avec /
Alors ... UNIQUEMENT - La deuxième image - Div B - Div C sont les syntaxes autorisées.
Voici le code TWIG:
Le container.css:
Et a.css, b.css, c.css, etc: tous identiques, il suffit de changer la couleur et le sélecteur CSS.
La structure "répertoires" est:
Répertoires
Tout cela est venu, parce que je ne voulais pas que les fichiers originaux individuels soient exposés au public, spécialement si je voulais jouer avec "moins" filtre ou "sass" ou similaire ... Je ne voulais pas que mes "originaux" soient publiés, seulement le compilé un.
Mais il y a de bonnes nouvelles . Si vous ne voulez pas avoir le "CSS de rechange" dans les répertoires publics ... ne les installez pas avec
--symlink
, mais faites vraiment une copie. Une fois que "assetic" a construit le CSS composé, vous pouvez SUPPRIMER le CSS d'origine du système de fichiers et laisser les images:Processus de compilation
Notez que je fais cela pour l'
--env=prod
environnement.Quelques réflexions finales:
Ce comportement souhaité peut être obtenu en ayant les images dans le répertoire "public" dans Git ou Mercurial et le "css" dans le répertoire "assets". Autrement dit, au lieu de les avoir dans "public" comme indiqué dans les répertoires, imaginez a, b, c ... résidant dans les "assets" au lieu de "public", que votre installateur / déployeur (probablement un script Bash ) mettre temporairement le CSS dans le répertoire "public" avant d'
assets:install
être exécuté, puisassets:install
, puisassetic:dump
, automatiser la suppression du CSS du répertoire public aprèsassetic:dump
avoir été exécuté. Cela atteindrait EXACTEMENT le comportement souhaité dans la question.Une autre solution (inconnue si possible) serait d'explorer si «assets: install» ne peut prendre que «public» comme source ou pourrait également prendre «assets» comme source de publication. Cela aiderait une fois installé avec l'
--symlink
option lors du développement.De plus, si nous allons programmer la suppression du répertoire "public", alors le besoin de les stocker dans un répertoire séparé ("assets") disparaît. Ils peuvent vivre à l'intérieur du "public" dans notre système de contrôle de version, car ils seront supprimés lors du déploiement au public. Cela permet également l'
--symlink
utilisation.MAIS DE TOUTE FAÇON, ATTENTION MAINTENANT: Comme maintenant les originaux ne sont plus là (
rm -Rf
), il n'y a que deux solutions, pas trois. La division de travail "B" ne fonctionne plus car il s'agissait d'un appel asset () en supposant qu'il y avait l'actif d'origine. Seul "C" (celui compilé) fonctionnera.Donc ... il y a UNIQUEMENT UN GAGNANT FINAL: la Div "C" permet EXACTEMENT ce qui était demandé dans le sujet: Pour être compilé, respectez le chemin d'accès aux images et n'exposez pas la source originale au public.
Le gagnant est C
la source
background-image: url('../images/devil.png');
utilisez cecibackground-image: url('../../../bundles/frontendlayout/images/devil.png');
{% stylesheets filter="cssrewrite,less" "bundles/frontendlayout/less/layout.less" %} <link href="{{ asset_url }}" rel="stylesheet" type="text/css" /> {% endstylesheets %}
Le filtre cssrewrite n'est pas compatible avec la notation @bundle pour le moment. Vous avez donc deux choix:
Référence les fichiers CSS dans le dossier Web (après:
console assets:install --symlink web
)Utilisez le filtre cssembed pour incorporer des images dans le CSS comme ceci.
la source
Je posterai ce qui a fonctionné pour moi, grâce à @ xavi-montero.
Mettez votre CSS dans le
Resource/public/css
répertoire de votre bundle , et vos images par exempleResource/public/img
.Changez les chemins assétiques vers le formulaire
'bundles/mybundle/css/*.css'
, dans votre mise en page.Dans
config.yml
, ajoutez une règlecss_rewrite
à assetic:Maintenant, installez les actifs et compilez avec assetic:
C'est assez bon pour la boîte de développement et
--symlink
utile, vous n'avez donc pas à réinstaller vos actifs (par exemple, vous ajoutez une nouvelle image) lorsque vous entrezapp_dev.php
.Pour le serveur de production, je viens de supprimer l'option '--symlink' (dans mon script de déploiement), et j'ai ajouté cette commande à la fin:
Tout est fait. Avec cela, vous pouvez utiliser des chemins comme celui-ci dans vos fichiers .css:
../img/picture.jpeg
la source
J'ai eu le même problème et j'ai juste essayé d'utiliser ce qui suit comme solution de contournement. Semble fonctionner jusqu'à présent. Vous pouvez même créer un modèle factice contenant uniquement des références à tous ces actifs statiques.
Notez l'omission de toute sortie, ce qui signifie que rien n'apparaît sur le modèle. Lorsque j'exécute assetic: dump, les fichiers sont copiés à l'emplacement souhaité et le css inclut le travail comme prévu.
la source
Si cela peut aider quelqu'un, nous avons beaucoup lutté avec Assetic, et nous faisons maintenant ce qui suit en mode développement:
Configuré comme dans Dumping Asset Files dans les environnements de développement
config_dev.yml
, nous avons commenté:Et dans routing_dev.yml
Spécifiez l'URL comme absolue à partir de la racine Web. Par exemple, background-image:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Remarque: notre racine Web vhost pointe surweb/
.Aucune utilisation du filtre cssrewrite
la source
http://example.org/sub/
.Je gère offen css / js plugin avec composer qui l'installe sous le vendeur. Je les lie symboliquement au répertoire web / bundles, ce qui permet au compositeur de mettre à jour les bundles si nécessaire.
exemple:
1 - lien symbolique une fois du tout (utilisez la commande fromweb / bundles /
2 - utilisez l'actif si nécessaire, dans le modèle de brindille:
Cordialement.
la source