Masalah
Saya memiliki file CSS dengan beberapa jalur di dalamnya (untuk gambar, font, dll .. url(..)
).
Struktur jalur saya seperti ini:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Saya ingin mereferensikan gambar saya di stylesheet.
Solusi Pertama
Saya mengubah semua jalur di file CSS menjadi jalur absolut. Ini bukan solusi, karena aplikasi harus (dan harus!) Bekerja di subdirektori juga.
Solusi Kedua
Gunakan Assetic dengan filter="cssrewrite"
.
Jadi saya mengubah semua jalur saya di file CSS saya menjadi
url("../../../../../../web/images/myimage.png")
untuk mewakili jalur sebenarnya dari direktori resource saya ke /web/images
direktori. Ini tidak berfungsi, karena cssrewrite menghasilkan kode berikut:
url("../../Resources/assets/")
yang jelas merupakan jalan yang salah.
Setelah assetic:dump
jalur ini dibuat, yang masih salah:
url("../../../web/images/myimage.png")
Kode ranting Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Solusi Saat Ini (Ketiga)
Karena semua file CSS berakhir /web/css/stylexyz.css
, saya mengubah semua jalur di file CSS menjadi relatif:
url("../images/myimage.png")
Solusi (buruk) ini berfungsi, kecuali di dev
lingkungan: Jalur CSS adalah /app_dev.php/css/stylexyz.css
dan oleh karena itu jalur gambar yang dihasilkan /app_dev.php/images/myimage.png
darinya, yang menghasilkan file NotFoundHttpException
.
Apakah ada solusi yang lebih baik dan berhasil?
app_dev.php
?Jawaban:
Saya telah menemukan masalah yang sama.
Pendeknya:
Saya telah menguji SEMUA kemungkinan kombinasi (waras) berikut ini:
Resources/public/css
) dengan CSS dan direktori "private" (asResources/assets/css
).Ini memberi saya total 14 kombinasi pada ranting yang sama, dan rute ini diluncurkan dari
sehingga memberikan 14 x 3 = 42 tes.
Selain itu, semua ini telah diuji bekerja di subdirektori, jadi tidak ada cara untuk menipu dengan memberikan URL absolut karena mereka tidak akan berfungsi.
Tesnya adalah dua gambar tanpa nama dan kemudian div dinamai dari 'a' hingga 'f' untuk CSS yang dibangun DARI folder publik dan diberi nama 'g ke' l 'untuk yang dibangun dari jalur internal.
Saya mengamati yang berikut:
Hanya 3 dari 14 pengujian yang ditampilkan secara memadai pada tiga URL. Dan TIDAK ADA dari folder "internal" (Sumber Daya / aset). Itu adalah prasyarat untuk memiliki cadangan CSS PUBLIK dan kemudian membangun dengan aset dari sana.
Inilah hasilnya:
Hasil diluncurkan dengan /app_dev.php/
Hasil diluncurkan dengan /app.php/
Hasil diluncurkan dengan /
Jadi ... HANYA - Gambar kedua - Div B - Div C adalah sintaks yang diizinkan.
Di sini ada kode TWIG:
Container.css:
Dan a.css, b.css, c.css, dll: semuanya identik, hanya mengubah warna dan pemilih CSS.
Struktur "direktori" adalah:
Direktori
Semua ini datang, karena saya tidak ingin file asli individu diekspos ke publik, khususnya jika saya ingin bermain dengan filter "kurang" atau "sass" atau serupa ... Saya tidak ingin "aslinya" dipublikasikan, hanya menyusun satu.
Tapi ada kabar baik . Jika Anda tidak ingin memiliki "CSS cadangan" di direktori publik ... jangan instal dengan
--symlink
, tetapi benar-benar membuat salinan. Setelah "assetic" membuat CSS gabungan, dan Anda dapat MENGHAPUS CSS asli dari sistem file, dan meninggalkan gambar:Proses kompilasi
Catatan Saya melakukan ini untuk
--env=prod
lingkungan.Hanya beberapa pemikiran terakhir:
Perilaku yang diinginkan ini dapat dicapai dengan memiliki gambar di direktori "publik" di Git atau Mercurial dan "css" di direktori "aset". Artinya, alih-alih menyimpannya di "publik" seperti yang ditunjukkan di direktori, bayangkan a, b, c ... berada di "aset" alih-alih "publik", daripada memiliki penginstal / penerapan Anda (mungkin skrip Bash ) untuk meletakkan CSS sementara di dalam direktori "public" sebelum
assets:install
dijalankan, laluassets:install
, kemudianassetic:dump
, dan kemudian secara otomatis menghapus CSS dari direktori publik setelahassetic:dump
dijalankan. Ini akan mencapai PERSIS perilaku yang diinginkan dalam pertanyaan itu.Solusi lain (tidak diketahui jika memungkinkan) adalah menyelidiki apakah "assets: install" hanya dapat mengambil "publik" sebagai sumber atau juga dapat mengambil "aset" sebagai sumber untuk dipublikasikan. Itu akan membantu saat dipasang dengan
--symlink
opsi saat mengembangkan.Selain itu, jika kita akan membuat skrip penghapusan dari direktori "public", maka kebutuhan untuk menyimpannya dalam direktori terpisah ("assets") menghilang. Mereka dapat hidup di dalam "publik" dalam sistem kontrol versi kami karena akan dibuang saat diterapkan ke publik. Ini memungkinkan juga untuk
--symlink
penggunaan.NAMUN, HATI-HATI SEKARANG: Karena sekarang yang asli sudah tidak ada lagi (
rm -Rf
), hanya ada dua solusi, bukan tiga. Div yang berfungsi "B" tidak berfungsi lagi karena itu adalah panggilan aset () dengan asumsi ada aset asli. Hanya "C" (yang telah dikompilasi) yang akan bekerja.Jadi ... HANYA ada PEMENANG AKHIR: Div "C" memungkinkan PERSIS apa yang diminta dalam topik: Untuk dikompilasi, hormati jalur ke gambar dan jangan paparkan sumber aslinya ke publik.
Pemenangnya adalah C
sumber
background-image: url('../images/devil.png');
inibackground-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 %}
Filter cssrewrite tidak kompatibel dengan notasi @bundle untuk saat ini. Jadi, Anda punya dua pilihan:
Referensi file CSS di folder web (setelah
console assets:install --symlink web
:)Gunakan filter cssembed untuk menyematkan gambar di CSS seperti ini.
sumber
Saya akan memposting apa yang berhasil untuk saya, terima kasih kepada @ xavi-montero.
Letakkan CSS Anda di
Resource/public/css
direktori bundel Anda , dan gambar Anda di katakanResource/public/img
.Ubah jalur aset ke formulir
'bundles/mybundle/css/*.css'
, di tata letak Anda.Di
config.yml
, tambahkan aturancss_rewrite
ke assetic:Sekarang instal aset dan kompilasi dengan assetic:
Ini cukup baik untuk kotak pengembangan, dan
--symlink
berguna, jadi Anda tidak perlu menginstal ulang aset Anda (misalnya, Anda menambahkan gambar baru) saat Anda masukapp_dev.php
.Untuk server produksi, saya baru saja menghapus opsi '--symlink' (dalam skrip penerapan saya), dan menambahkan perintah ini di akhir:
Semua sudah selesai. Dengan ini, Anda dapat menggunakan jalur seperti ini di file .css Anda:
../img/picture.jpeg
sumber
Saya memiliki masalah yang sama dan saya hanya mencoba menggunakan yang berikut ini sebagai solusi. Sepertinya bekerja sejauh ini. Anda bahkan dapat membuat template tiruan yang hanya berisi referensi ke semua aset statis tersebut.
Perhatikan kelalaian output apa pun yang berarti tidak ada yang muncul di template. Ketika saya menjalankan assetic: dump file akan disalin ke lokasi yang diinginkan dan css menyertakan pekerjaan seperti yang diharapkan.
sumber
Jika itu dapat membantu seseorang, kami telah berjuang keras dengan Assetic, dan kami sekarang melakukan hal berikut dalam mode pengembangan:
Siapkan seperti di Dumping Asset Files di dev Environmen jadi di
config_dev.yml
, kami telah berkomentar:Dan di routing_dev.yml
Tentukan URL sebagai absolut dari root web. Misalnya, gambar latar belakang:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Catatan: root web vhost kami mengarah keweb/
.Tidak ada penggunaan filter cssrewrite
sumber
http://example.org/sub/
.Saya tidak suka mengelola plugin css / js dengan komposer yang menginstalnya di bawah vendor. Saya menghubungkannya ke direktori web / bundles, yang memungkinkan komposer memperbarui bundel sesuai kebutuhan.
contoh:
1 - symlink sekali saja (gunakan perintah fromweb / bundles /
2 - gunakan aset jika diperlukan, dalam templat ranting:
Salam.
sumber