Problem
Mam plik CSS z pewnymi ścieżkami (dla obrazów, czcionek itp. url(..)
).
Struktura mojej ścieżki jest następująca:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Chcę odwoływać się do moich obrazów w arkuszu stylów.
Pierwsze rozwiązanie
Zmieniłem wszystkie ścieżki w pliku CSS na ścieżki bezwzględne. To nie jest rozwiązanie, ponieważ aplikacja powinna (i musi!) Pracować również w podkatalogu.
Drugie rozwiązanie
Użyj Assetic z filter="cssrewrite"
.
Więc zmieniłem wszystkie moje ścieżki w moim pliku CSS na
url("../../../../../../web/images/myimage.png")
do reprezentowania rzeczywistej ścieżki z katalogu zasobów do /web/images
katalogu. To nie działa, ponieważ cssrewrite generuje następujący kod:
url("../../Resources/assets/")
co jest oczywiście złą ścieżką.
Po assetic:dump
utworzeniu tej ścieżki, która nadal jest błędna:
url("../../../web/images/myimage.png")
Kod gałązki Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Obecne (trzecie) rozwiązanie
Ponieważ wszystkie pliki CSS kończą się na /web/css/stylexyz.css
, zmieniłem wszystkie ścieżki w pliku CSS na względne:
url("../images/myimage.png")
To (złe) rozwiązanie działa, z wyjątkiem dev
środowiska: ścieżka CSS jest, /app_dev.php/css/stylexyz.css
a zatem ścieżka obrazu wynikająca z tego jest /app_dev.php/images/myimage.png
, co powoduje, że plik NotFoundHttpException
.
Czy jest lepsze i działające rozwiązanie?
app_dev.php
?Odpowiedzi:
Natknąłem się na ten sam problem.
W skrócie:
Wykonałem test z WSZYSTKIMI możliwymi (rozsądnymi) kombinacjami następujących elementów:
Resources/public/css
„katalogu publicznego” (as ) z CSS i katalogu „prywatnego” (asResources/assets/css
).Dało mi to w sumie 14 kombinacji na tej samej gałązce, a ta trasa została wypuszczona z
dając w ten sposób 14 x 3 = 42 testy.
Ponadto wszystko to zostało przetestowane pod kątem działania w podkatalogu, więc nie ma sposobu, aby oszukać, podając bezwzględne adresy URL, ponieważ po prostu by nie działały.
Testy obejmowały dwa nienazwane obrazy, a następnie elementy div nazwane od „a” do „f” dla CSS zbudowanego z folderu publicznego i nazwane od „g do„ l ”dla plików zbudowanych ze ścieżki wewnętrznej.
Zauważyłem, co następuje:
Tylko 3 z 14 testów zostały poprawnie wyświetlone na trzech adresach URL. ŻADNE nie pochodziło z folderu „wewnętrznego” (zasoby / zasoby). Warunkiem wstępnym było posiadanie wolnego CSS PUBLIC, a następnie zbudowanie go z wykorzystaniem Assetic FROM.
Oto wyniki:
Wynik uruchomiony z /app_dev.php/
Wynik uruchomiony z /app.php/
Wynik uruchomiony z /
Więc ... TYLKO - Drugi obraz - Div B - Div C to dozwolone składnie.
Tutaj jest kod TWIG:
Plik container.css:
Oraz a.css, b.css, c.css itd .: wszystkie identyczne, wystarczy zmienić kolor i selektor CSS.
Struktura „katalogów” jest następująca:
Katalogi
Wszystko to przyszło, ponieważ nie chciałem, aby poszczególne oryginalne pliki były ujawniane publicznie, szczególnie gdybym chciał grać z filtrem „less”, „sass” lub podobnym… Nie chciałem, aby moje „oryginały” były publikowane, tylko skompilowany.
Ale są dobre wieści . Jeśli nie chcesz mieć „wolnego CSS” w publicznych katalogach ... zainstaluj je nie z
--symlink
, ale naprawdę wykonując kopię. Gdy „assetic” zbuduje złożony CSS, możesz USUNĄĆ oryginalny CSS z systemu plików i pozostawić obrazy:Proces kompilacji
Uwaga Robię to dla
--env=prod
środowiska.Tylko kilka myśli końcowych:
To pożądane zachowanie można osiągnąć, umieszczając obrazy w katalogu „public” w Git lub Mercurial, a „css” w katalogu „asset”. Oznacza to, że zamiast umieszczać je „publicznie”, jak pokazano w katalogach, wyobraź sobie a, b, c ... rezydujące w „aktywach” zamiast „publiczne”, niż mieć swój instalator / wdrażający (prawdopodobnie skrypt Bash ) umieszczenie CSS tymczasowo w katalogu „public”, zanim
assets:install
zostanie wykonane,assets:install
następnieassetic:dump
, a następnie automatyzacja usuwania CSS z katalogu publicznego poassetic:dump
wykonaniu. Dałoby to DOKŁADNIE zachowanie pożądane w pytaniu.Innym (nieznanym, jeśli to możliwe) rozwiązaniem byłoby zbadanie, czy „zasoby: instalacja” może przyjmować tylko „publiczne” jako źródło, czy też „zasoby” jako źródło do publikacji. Pomogłoby to w przypadku zainstalowania z
--symlink
opcją podczas programowania.Dodatkowo, jeśli zamierzamy skrypty usuwania z katalogu „publicznego”, to znika potrzeba przechowywania ich w osobnym katalogu („asset”). Mogą żyć jako „publiczne” w naszym systemie kontroli wersji, ponieważ zostaną upuszczone po wdrożeniu do publicznego. Pozwala to również na
--symlink
użytkowanie.ALE ZAWSZE, OSTROŻNIE TERAZ: Ponieważ obecnie nie ma już oryginałów (
rm -Rf
), są tylko dwa rozwiązania, a nie trzy. Działający element „B” już nie działa, ponieważ było wywołaniem asset () przy założeniu, że był oryginalny zasób. Tylko "C" (skompilowana) będzie działać.Więc ... jest TYLKO KOŃCOWY ZWYCIĘZCA: Div "C" pozwala DOKŁADNIE o to, o co proszono w temacie: Kompilować, szanować ścieżkę do obrazów i nie ujawniać publicznie oryginalnego źródła.
Zwycięzcą jest C
źródło
background-image: url('../images/devil.png');
używać tegobackground-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 %}
Filtr cssrewrite nie jest na razie zgodny z notacją @bundle. Masz więc dwie możliwości:
Odwołaj się do plików CSS w folderze internetowym (po
console assets:install --symlink web
:)Użyj filtra cssembed, aby osadzić obrazy w CSS w ten sposób.
źródło
Opublikuję, co zadziałało, dzięki @ xavi-montero.
Umieść swój CSS w
Resource/public/css
katalogu pakietu i powiedzmy swoje obrazyResource/public/img
.Zmień asetyczne ścieżki do formularza
'bundles/mybundle/css/*.css'
w swoim układzie.W
config.yml
, dodaj regułęcss_rewrite
do assetic:Teraz zainstaluj zasoby i skompiluj za pomocą assetic:
Jest to wystarczająco dobre dla pola programistycznego i
--symlink
jest przydatne, więc nie musisz ponownie instalować swoich zasobów (na przykład, dodawać nowy obraz) po wejściu przezapp_dev.php
.W przypadku serwera produkcyjnego właśnie usunąłem opcję `` --symlink '' (w moim skrypcie wdrożeniowym) i na końcu dodałem następujące polecenie:
Wszystko skończone. Dzięki temu możesz używać takich ścieżek w plikach .css:
../img/picture.jpeg
źródło
Miałem ten sam problem i właśnie próbowałem użyć następującego rozwiązania jako obejścia. Wydaje się, że jak dotąd działa. Możesz nawet utworzyć fikcyjny szablon, który zawiera tylko odniesienia do wszystkich tych statycznych zasobów.
Zwróć uwagę na pominięcie jakiegokolwiek wyjścia, co oznacza, że nic nie pojawia się w szablonie. Kiedy uruchamiam assetic: dump, pliki są kopiowane do żądanej lokalizacji, a css zawiera pracę zgodnie z oczekiwaniami.
źródło
Jeśli może to komuś pomóc, bardzo się zmagaliśmy z Assetic i teraz robimy następujące rzeczy w trybie deweloperskim:
Skonfiguruj tak, jak w przypadku zrzucania plików aktywów w środowisku deweloperskim, więc
config_dev.yml
skomentowaliśmy:A w routing_dev.yml
Określ adres URL jako bezwzględny z katalogu głównego sieci. Na przykład background-image:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Uwaga: wskazuje na nasz katalog główny sieci vhostweb/
.Brak użycia filtra cssrewrite
źródło
http://example.org/sub/
.Często zarządzam wtyczką css / js za pomocą programu Composer, który instaluje go u dostawcy. Dowiązuję je do katalogu web / bundles, co pozwala kompozytorowi aktualizować pakiety w razie potrzeby.
przykład:
1 - dowiązanie symboliczne raz w ogóle (użyj polecenia fromweb / bundles /
2 - użyj zasobu w razie potrzeby, w szablonie gałązki:
Pozdrowienia.
źródło