Problem
Ich habe eine CSS- Datei mit einigen Pfaden (für Bilder, Schriftarten usw.)url(..)
).
Meine Pfadstruktur ist wie folgt:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Ich möchte meine Bilder im Stylesheet referenzieren.
Erste Lösung
Ich habe alle Pfade in der CSS-Datei in absolute Pfade geändert. Dies ist keine Lösung, da die Anwendung auch in einem Unterverzeichnis arbeiten sollte (und muss!).
Zweite Lösung
Verwenden Sie Assetic mit filter="cssrewrite"
.
Also habe ich alle meine Pfade in meiner CSS-Datei in geändert
url("../../../../../../web/images/myimage.png")
um den tatsächlichen Pfad von meinem Ressourcenverzeichnis zum Verzeichnis darzustellen /web/images
. Dies funktioniert nicht, da cssrewrite den folgenden Code erzeugt:
url("../../Resources/assets/")
Das ist offensichtlich der falsche Weg.
Nachdem assetic:dump
dieser Pfad erstellt wurde, ist dies immer noch falsch:
url("../../../web/images/myimage.png")
Der Zweigcode von Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Aktuelle (dritte) Lösung
Da alle CSS-Dateien in enden /web/css/stylexyz.css
, habe ich alle Pfade in der CSS-Datei so geändert, dass sie relativ sind:
url("../images/myimage.png")
Diese (schlechte) Lösung funktioniert, außer in der dev
Umgebung: Der CSS-Pfad ist /app_dev.php/css/stylexyz.css
und daher der daraus resultierende Bildpfad /app_dev.php/images/myimage.png
, was zu a führt NotFoundHttpException
.
Gibt es eine bessere und funktionierende Lösung?
app_dev.php
?Antworten:
Ich bin auf das sehr, sehr gleiche Problem gestoßen.
Zusamenfassend:
Ich habe einen Test mit ALLEN möglichen (gesunden) Kombinationen der folgenden gemacht:
Resources/public/css
) mit dem CSS und einem "privaten" Verzeichnis (asResources/assets/css
).Dies gab mir insgesamt 14 Kombinationen auf demselben Zweig, und diese Route wurde von gestartet
Dies ergibt 14 x 3 = 42 Tests.
Darüber hinaus wurde all dies in einem Unterverzeichnis getestet, sodass es keine Möglichkeit gibt, sich durch Angabe absoluter URLs zu täuschen, da diese einfach nicht funktionieren würden.
Die Tests bestanden aus zwei unbenannten Bildern und Divs, die von 'a' bis 'f' für das aus dem öffentlichen Ordner erstellte CSS und von 'g bis' l 'für diejenigen, die aus dem internen Pfad erstellt wurden, benannt wurden.
Ich habe folgendes beobachtet:
Nur 3 der 14 Tests wurden auf den drei URLs angemessen angezeigt. Und NONE war aus dem "internen" Ordner (Ressourcen / Assets). Es war eine Voraussetzung, das Ersatz-CSS PUBLIC zu haben und dann mit assetic FROM von dort aus zu bauen.
Dies sind die Ergebnisse:
Ergebnis mit /app_dev.php/ gestartet
Ergebnis mit /app.php/ gestartet
Ergebnis mit / gestartet
Also ... NUR - Das zweite Bild - Div B - Div C sind die zulässigen Syntaxen.
Hier gibt es den TWIG-Code:
Die container.css:
Und a.css, b.css, c.css usw .: alle identisch, nur die Farbe und die CSS-Auswahl ändern.
Die Struktur "Verzeichnisse" lautet:
Verzeichnisse
All dies kam, weil ich nicht wollte, dass die einzelnen Originaldateien der Öffentlichkeit zugänglich gemacht wurden, insbesondere wenn ich mit "weniger" Filter oder "sass" oder ähnlichem spielen wollte ... Ich wollte nicht, dass meine "Originale" veröffentlicht wurden, sondern nur die einen zusammengestellt.
Aber es gibt gute Nachrichten . Wenn Sie das "Ersatz-CSS" nicht in den öffentlichen Verzeichnissen haben möchten ... installieren Sie sie nicht mit
--symlink
, sondern erstellen Sie wirklich eine Kopie. Sobald "assetic" das zusammengesetzte CSS erstellt hat, können Sie das ursprüngliche CSS aus dem Dateisystem löschen und die Bilder belassen:Kompilierungsprozess
Hinweis Ich mache das für die
--env=prod
Umwelt.Nur ein paar abschließende Gedanken:
Dieses gewünschte Verhalten kann erreicht werden, indem die Bilder im "öffentlichen" Verzeichnis in Git oder Mercurial und das "CSS" im "Assets" -Verzeichnis gespeichert werden. Das heißt, anstatt sie in "public" zu haben, wie in den Verzeichnissen gezeigt, stellen Sie sich a, b, c ... vor, die sich in den "Assets" statt "public" befinden, als Ihr Installationsprogramm / Deployer (wahrscheinlich ein Bash- Skript). Das CSS vorübergehend in das "öffentliche" Verzeichnis zu stellen, bevor
assets:install
es ausgeführt wird, dannassets:install
, dannassetic:dump
, und dann das Entfernen von CSS aus dem öffentlichen Verzeichnis zu automatisieren, nachdemassetic:dump
es ausgeführt wurde. Dies würde genau das in der Frage gewünschte Verhalten erreichen.Eine andere (wenn möglich unbekannte) Lösung wäre zu untersuchen, ob "Assets: Install" nur "public" als Quelle oder "Assets" als Quelle für die Veröffentlichung verwenden kann. Das würde bei der Installation mit der
--symlink
Option bei der Entwicklung helfen .Wenn wir das Entfernen aus dem "öffentlichen" Verzeichnis skripten, entfällt außerdem die Notwendigkeit, sie in einem separaten Verzeichnis ("Assets") zu speichern. Sie können in unserem Versionskontrollsystem in "public" leben, da diese bei der Bereitstellung für die Öffentlichkeit gelöscht werden. Dies ermöglicht auch die
--symlink
Verwendung.ABER JEDOCH, VORSICHT JETZT: Wie jetzt sind die Originale nicht mehr da (
rm -Rf
da sind ), gibt es nur zwei Lösungen, nicht drei. Der Arbeitsbereich "B" funktioniert nicht mehr, da es sich um einen Asset () -Aufruf handelte, sofern der ursprüngliche Asset vorhanden war. Nur "C" (das kompilierte) funktioniert.Also ... es gibt NUR einen ENDGÜLTIGEN GEWINNER: Div "C" erlaubt genau das, was im Thema gefragt wurde: Um kompiliert zu werden, respektieren Sie den Pfad zu den Bildern und setzen Sie die Originalquelle nicht der Öffentlichkeit aus.
Der Gewinner ist C.
quelle
background-image: url('../images/devil.png');
dieses zu verwendenbackground-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 %}
Der cssrewrite-Filter ist derzeit nicht mit der @ bundle-Notation kompatibel. Sie haben also zwei Möglichkeiten:
Verweisen Sie auf die CSS - Dateien im Web - Ordner (nach:
console assets:install --symlink web
)Verwenden Sie den cssembed-Filter, um Bilder wie folgt in das CSS einzubetten.
quelle
Ich werde dank @ xavi-montero posten, was für mich funktioniert hat.
Legen Sie Ihr CSS in das
Resource/public/css
Verzeichnis Ihres Bundles und Ihre Bilder inResource/public/img
.Ändern Sie die assetischen Pfade zum Formular
'bundles/mybundle/css/*.css'
in Ihrem Layout.In
config.yml
, fügt Regelcss_rewrite
zu assetic:Installieren Sie nun Assets und kompilieren Sie mit assetic:
Dies ist gut genug für die Entwicklungsbox und
--symlink
nützlich, sodass Sie Ihre Assets nicht neu installieren müssen (z. B. fügen Sie ein neues Image hinzu), wenn Sie durch die Box gehenapp_dev.php
.Für den Produktionsserver habe ich gerade die Option '--symlink' (in meinem Bereitstellungsskript) entfernt und diesen Befehl am Ende hinzugefügt:
Alles ist getan. Damit können Sie Pfade wie diesen in Ihren CSS-Dateien verwenden:
../img/picture.jpeg
quelle
Ich hatte das gleiche Problem und habe nur versucht, Folgendes als Problemumgehung zu verwenden. Scheint soweit zu funktionieren. Sie können sogar eine Dummy-Vorlage erstellen, die nur Verweise auf all diese statischen Assets enthält.
Beachten Sie, dass keine Ausgabe vorhanden ist, was bedeutet, dass in der Vorlage nichts angezeigt wird. Wenn ich assetic: dump ausführe, werden die Dateien an den gewünschten Speicherort kopiert und das CSS enthält die erwartete Arbeit.
quelle
Wenn es jemandem helfen kann, haben wir viel mit Assetic zu kämpfen und tun jetzt im Entwicklungsmodus Folgendes:
Richten Sie wie in Dumping Asset Files in der Entwicklerumgebung so ein
config_dev.yml
, dass wir Folgendes kommentiert haben:Und in routing_dev.yml
Geben Sie die URL im Webstamm als absolut an. Zum Beispiel Hintergrundbild:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Hinweis: Unser vhost-Webstamm zeigt aufweb/
.Keine Verwendung von Cssrewrite-Filter
quelle
http://example.org/sub/
.Ich verwalte das CSS / JS-Plugin mit dem Composer, der es unter dem Hersteller installiert. Ich verknüpfe diese mit dem Verzeichnis web / bundles, damit Composer Bundles nach Bedarf aktualisieren kann.
Beispiel:
1 - Symlink überhaupt einmal verwenden (Befehl fromweb / bundles / verwenden
2 - Verwenden Sie das Asset bei Bedarf in einer Zweigvorlage:
Grüße.
quelle