Problema
Tengo un archivo CSS con algunas rutas (para imágenes, fuentes, etc. url(..)
).
Mi estructura de ruta es así:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Quiero hacer referencia a mis imágenes en la hoja de estilo.
Primera solucion
Cambié todas las rutas en el archivo CSS a rutas absolutas. Esto no es una solución, ya que la aplicación también debería (¡y tiene que hacerlo!) Estar trabajando en un subdirectorio.
Segunda solución
Utilice Assetic con filter="cssrewrite"
.
Así que cambié todas mis rutas en mi archivo CSS a
url("../../../../../../web/images/myimage.png")
para representar la ruta real desde mi directorio de recursos al /web/images
directorio. Esto no funciona, ya que cssrewrite produce el siguiente código:
url("../../Resources/assets/")
que obviamente es el camino equivocado.
Después de assetic:dump
crear esta ruta, que sigue siendo incorrecta:
url("../../../web/images/myimage.png")
El código de ramita de Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Solución actual (tercera)
Dado que todos los archivos CSS terminan /web/css/stylexyz.css
, cambié todas las rutas en el archivo CSS para que sean relativas:
url("../images/myimage.png")
Esta (mala) solución funciona, excepto en el dev
entorno: la ruta CSS es /app_dev.php/css/stylexyz.css
y, por lo tanto, la ruta de la imagen resultante de esto es /app_dev.php/images/myimage.png
, lo que da como resultado un NotFoundHttpException
.
¿Existe una solución mejor y que funcione?
app_dev.php
?Respuestas:
Me he encontrado con el mismo problema.
En breve:
He hecho una prueba con TODAS las combinaciones posibles (sensatas) de lo siguiente:
Resources/public/css
) con el CSS y un directorio "privado" (asResources/assets/css
).Esto me dio un total de 14 combinaciones en la misma ramita, y esta ruta se lanzó desde
dando así 14 x 3 = 42 pruebas.
Además, todo esto ha sido probado trabajando en un subdirectorio, por lo que no hay forma de engañar al dar URL absolutas porque simplemente no funcionarían.
Las pruebas fueron dos imágenes sin nombre y luego divs nombrados de 'a' a 'f' para el CSS construido DESDE la carpeta pública y nombrados 'g a' l 'para los construidos a partir de la ruta interna.
Observé lo siguiente:
Solo 3 de las 14 pruebas se mostraron adecuadamente en las tres URL. Y NINGUNO era de la carpeta "interna" (Recursos / activos). Era un requisito previo tener el CSS PUBLIC de repuesto y luego compilar con assetic FROM allí.
Estos son los resultados:
Resultado lanzado con /app_dev.php/
Resultado lanzado con /app.php/
Resultado lanzado con /
Entonces ... SOLAMENTE - La segunda imagen - Div B - Div C son las sintaxis permitidas.
Aquí está el código TWIG:
El container.css:
Y a.css, b.css, c.css, etc: todos idénticos, solo cambiando el color y el selector de CSS.
La estructura de "directorios" es:
Directorios
Todo esto vino, porque no quería que los archivos originales individuales se expusieran al público, especialmente si quería jugar con el filtro "menos" o "sass" o similar ... No quería que se publicaran mis "originales", solo los compilado uno.
Pero hay buenas noticias . Si no desea tener el "CSS de repuesto" en los directorios públicos ... no lo instale con
--symlink
, sino haciendo una copia. Una vez que "assetic" ha creado el CSS compuesto, puede BORRAR el CSS original del sistema de archivos y dejar las imágenes:Proceso de compilación
Tenga en cuenta que hago esto por el
--env=prod
medio ambiente.Solo algunos pensamientos finales:
Este comportamiento deseado se puede lograr teniendo las imágenes en el directorio "público" en Git o Mercurial y el "css" en el directorio "activos". Es decir, en lugar de tenerlos en "público" como se muestra en los directorios, imagina a, b, c ... residiendo en los "activos" en lugar de "público", que tu instalador / implementador (probablemente un script Bash ) para poner el CSS temporalmente dentro del directorio "público" antes de que
assets:install
se ejecute, luegoassets:install
, luegoassetic:dump
, y luego automatizar la eliminación de CSS del directorio público después de queassetic:dump
se haya ejecutado. Esto lograría EXACTAMENTE el comportamiento deseado en la pregunta.Otra solución (desconocida si es posible) sería explorar si "assets: install" solo puede tomar "public" como fuente o también podría tomar "assets" como fuente para publicar. Eso ayudaría cuando se instala con la
--symlink
opción al desarrollar.Además, si vamos a realizar un script para eliminarlos del directorio "público", entonces, desaparece la necesidad de almacenarlos en un directorio separado ("activos"). Pueden vivir dentro de "público" en nuestro sistema de control de versiones, ya que se eliminarán cuando se implementen al público. Esto también permite el
--symlink
uso.PERO DE TODOS MODOS, PRECAUCIÓN AHORA: Como ahora los originales ya no están allí (
rm -Rf
), solo hay dos soluciones, no tres. El div activo "B" ya no funciona ya que era una llamada de activo () asumiendo que existía el activo original. Sólo funcionará "C" (el compilado).Entonces ... SOLO HAY UN GANADOR FINAL: Div "C" permite EXACTAMENTE lo que se pidió en el tema: Para ser compilado, respetar el camino a las imágenes y no exponer la fuente original al público.
El ganador es C
fuente
background-image: url('../images/devil.png');
use estobackground-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 %}
El filtro cssrewrite no es compatible con la notación @bundle por ahora. Entonces tienes dos opciones:
Referencia a los archivos CSS en la carpeta web (después:
console assets:install --symlink web
)Utilice el filtro cssembed para incrustar imágenes en el CSS de esta manera.
fuente
Publicaré lo que me funcionó, gracias a @ xavi-montero.
Pon tu CSS en el
Resource/public/css
directorio de tu paquete y tus imágenes en digamosResource/public/img
.Cambie las rutas aséticas al formulario
'bundles/mybundle/css/*.css'
, en su diseño.En
config.yml
, agregue la reglacss_rewrite
a assetic:Ahora instale los activos y compile con assetic:
Esto es lo suficientemente bueno para el cuadro de desarrollo y
--symlink
es útil, por lo que no tiene que reinstalar sus activos (por ejemplo, agrega una nueva imagen) cuando ingresaapp_dev.php
.Para el servidor de producción, acabo de eliminar la opción '--symlink' (en mi script de implementación) y agregué este comando al final:
Todo esta hecho. Con esto, puede usar rutas como esta en sus archivos .css:
../img/picture.jpeg
fuente
Tuve el mismo problema y solo intenté usar lo siguiente como solución. Parece funcionar hasta ahora. Incluso puede crear una plantilla ficticia que solo contenga referencias a todos esos activos estáticos.
Observe la omisión de cualquier resultado, lo que significa que no aparece nada en la plantilla. Cuando ejecuto assetic: dump, los archivos se copian en la ubicación deseada y el css incluye el trabajo como se esperaba.
fuente
Si puede ayudar a alguien, hemos tenido muchos problemas con Assetic y ahora estamos haciendo lo siguiente en el modo de desarrollo:
Configurado como en Dumping Asset Files en Dev Environmen, así
config_dev.yml
que hemos comentado:Y en routing_dev.yml
Especifique la URL como absoluta desde la raíz web. Por ejemplo, background-image:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Nota: nuestra raíz web vhost apunta aweb/
.Sin uso de filtro cssrewrite
fuente
http://example.org/sub/
.A menudo administro el complemento css / js con el compositor que lo instala bajo el proveedor. Los enlazo simbólicamente al directorio web / bundles, lo que permite al compositor actualizar los paquetes según sea necesario.
ejemplo:
1 - enlace simbólico una vez (use el comando fromweb / bundles /
2 - use el activo donde sea necesario, en la plantilla de ramitas:
Saludos.
fuente