Проблема
У меня есть файл CSS с некоторыми путями в нем (для изображений, шрифтов и т. Д. url(..)
).
Моя структура пути такая:
...
+-src/
| +-MyCompany/
| +-MyBundle/
| +-Resources/
| +-assets/
| +-css/
| +-stylesheets...
+-web/
| +-images/
| +-images...
...
Я хочу сослаться на свои изображения в таблице стилей.
Первое решение
Я изменил все пути в файле CSS на абсолютные. Это не решение, поскольку приложение также должно (и должно!) Работать в подкаталоге.
Второе решение
Используйте Assetic с filter="cssrewrite"
.
Поэтому я изменил все пути в моем файле CSS на
url("../../../../../../web/images/myimage.png")
для представления фактического пути от моего каталога ресурсов до /web/images
каталога. Это не работает, поскольку cssrewrite создает следующий код:
url("../../Resources/assets/")
что явно неверный путь.
После assetic:dump
создания этого пути, который все еще неверен:
url("../../../web/images/myimage.png")
Код веточки Assetic:
{% stylesheets
'@MyCompanyMyBundle/Resources/assets/css/*.css'
filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Текущее (третье) решение
Поскольку все файлы CSS попадают внутрь /web/css/stylexyz.css
, я изменил все пути в файле CSS на относительные:
url("../images/myimage.png")
Это (плохое) решение работает, за исключением dev
среды: путь CSS /app_dev.php/css/stylexyz.css
и, следовательно, путь к изображению, полученный в результате этого, есть /app_dev.php/images/myimage.png
, что приводит к созданию файла NotFoundHttpException
.
Есть ли лучшее и рабочее решение?
app_dev.php
?Ответы:
Я столкнулся с той же проблемой.
Коротко:
Я провел тест со ВСЕМИ возможными (разумными) комбинациями из следующего:
Resources/public/css
каталога » (as ) с помощью CSS и «частного» каталога (asResources/assets/css
).Это дало мне в общей сложности 14 комбинаций на одной ветке, и этот маршрут был запущен из
Таким образом, получаем 14 x 3 = 42 теста.
Кроме того, все это было протестировано для работы в подкаталоге, поэтому невозможно обмануть, указав абсолютные URL-адреса, потому что они просто не будут работать.
Тесты представляли собой два безымянных изображения, а затем div с именами от «a» до «f» для CSS, созданным ИЗ общей папки, и с именами от «g до« l »для изображений, построенных по внутреннему пути.
Я заметил следующее:
Только 3 из 14 тестов были адекватно показаны на трех URL. И НЕТ было из «внутренней» папки (Ресурсы / активы). Предварительным условием было иметь запасной CSS PUBLIC, а затем строить с помощью Assetic FROM.
Вот результаты:
Результат запущен с /app_dev.php/
Результат запущен с /app.php/
Результат запущен с /
Итак ... ТОЛЬКО - второе изображение - Div B - Div C - допустимые синтаксисы.
Вот код TWIG:
Container.css:
И a.css, b.css, c.css и т. Д.: Все идентичны, просто меняя цвет и селектор CSS.
Структура «справочников» такова:
Справочники
Все это произошло, потому что я не хотел, чтобы отдельные исходные файлы были доступны публике, особенно если я хотел поиграть с фильтром "меньше", или с "sass" или подобным ... Я не хотел, чтобы мои "оригиналы" публиковались, только составлен один.
Но есть и хорошие новости . Если вы не хотите иметь "запасной CSS" в общедоступных каталогах ... устанавливайте их не вместе
--symlink
, а действительно создавая копию. После того, как "Assetic" построил составной CSS, вы можете УДАЛИТЬ исходный CSS из файловой системы и оставить изображения:Процесс компиляции
Обратите внимание, я делаю это для
--env=prod
окружающей среды.Несколько заключительных мыслей:
Это желаемое поведение может быть достигнуто, если изображения находятся в «общедоступном» каталоге в Git или Mercurial, а «css» - в каталоге «assets». То есть, вместо того, чтобы иметь их в "общедоступных", как показано в каталогах, представьте, что a, b, c ... находятся в "активах" вместо "общедоступных", чем ваш установщик / средство развертывания (возможно, сценарий Bash ) временно поместить CSS в "общедоступный" каталог перед
assets:install
выполнением, затемassets:install
, затемassetic:dump
, а затем автоматизировать удаление CSS из общедоступного каталога послеassetic:dump
выполнения. Это обеспечит ТОЧНО то поведение, которое требуется в вопросе.Другое (если возможно, неизвестное) решение - выяснить, может ли «assets: install» использовать только «public» в качестве источника или также использовать «assets» в качестве источника для публикации. Это поможет при установке с
--symlink
опцией при разработке.Вдобавок, если мы собираемся сценарий удаления из «общедоступного» каталога, тогда отпадает необходимость хранить их в отдельном каталоге («активах»). Они могут находиться внутри «общедоступных» в нашей системе контроля версий, поскольку они будут удалены при развертывании для публики. Это также позволяет
--symlink
использовать.НО В любом случае, ВНИМАНИЕ! Поскольку теперь оригиналов больше нет (
rm -Rf
), есть только два решения, а не три. Рабочий div "B" больше не работает, поскольку это был вызов asset () при условии, что был исходный актив. Только "C" (скомпилированный) будет работать.Итак ... есть ТОЛЬКО ФИНАЛЬНЫЙ ПОБЕДИТЕЛЬ: Div "C" позволяет ТОЧНО то, что было задано в теме: для компиляции, соблюдайте путь к изображениям и не раскрывайте исходный код публике.
Победитель C
источник
background-image: url('../images/devil.png');
этоbackground-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 %}
Фильтр cssrewrite пока несовместим с обозначением @bundle. Итак, у вас есть два варианта:
Ссылочная файлы CSS в веб - папку (после:
console assets:install --symlink web
)Используйте фильтр cssembed, чтобы вставлять изображения в CSS следующим образом.
источник
Я опубликую, что у меня сработало, спасибо @ xavi-montero.
Поместите свой CSS в вашем Bundle в
Resource/public/css
каталоге, а также изображения, скажемResource/public/img
.Измените ассетические пути к форме
'bundles/mybundle/css/*.css'
в макете.В
config.yml
, добавьте правилоcss_rewrite
к ассетике:Теперь установите активы и скомпилируйте с помощью сборки:
Этого достаточно для окна разработки и
--symlink
полезно, так что вам не нужно переустанавливать ваши активы (например, вы добавляете новое изображение) при входеapp_dev.php
.Для производственного сервера я просто удалил параметр --symlink (в моем сценарии развертывания) и добавил эту команду в конце:
Все готово. При этом вы можете использовать такие пути в своих файлах .css:
../img/picture.jpeg
источник
У меня была та же проблема, и я просто попытался использовать следующее в качестве временного решения. Кажется, пока работает. Вы даже можете создать фиктивный шаблон, который просто содержит ссылки на все эти статические ресурсы.
Обратите внимание на отсутствие вывода, что означает, что в шаблоне ничего не отображается. Когда я запускаю Assetic: dump, файлы копируются в желаемое место, и css включает работу, как ожидалось.
источник
Если это может кому-то помочь, мы много боролись с Assetic, и теперь мы делаем следующее в режиме разработки:
Настроить как в Dumping Asset Files в среде разработки, так что
config_dev.yml
мы прокомментировали:И в routing_dev.yml
Укажите абсолютный URL-адрес из корневого веб-сайта. Например, background-image:
url("/bundles/core/dynatree/skins/skin/vline.gif");
Примечание: на наш веб-корень vhost указываетweb/
.Не использовать фильтр cssrewrite
источник
http://example.org/sub/
.Я обычно управляю плагином css / js с помощью композитора, который устанавливает его от поставщика. Я символически привязываю их к каталогу web / bundles, что позволяет композитору обновлять пакеты по мере необходимости.
пример:
1 - символическая ссылка один раз (используйте команду fromweb / bundles /
2 - использовать актив там, где это необходимо, в шаблоне веточки:
С уважением.
источник