Symfony2 - Assetic - 在 CSS 中加载图像

Posted

技术标签:

【中文标题】Symfony2 - Assetic - 在 CSS 中加载图像【英文标题】:Symfony2 - Assetic - load images in CSS 【发布时间】:2011-10-26 01:20:26 【问题描述】:

我有一个包含主要 css 文件和图像的 CoreBundle。现在我从 css 加载图像时遇到问题;图片未显示。

 background-image:url(../images/file.png)

(使用完整路径)

我使用以下命令安装了资产:assets:install web,我可以在web/bundles/cmtcore/(css|images) 下看到图像和 css 文件。

这是核心包中的文件结构:

/CoreBundle
    /Resources
        /public
            /css
                /main.css
            /images
                /file.png

下面是我将 css 文件加载到模板中的方法:

 % stylesheets '@CmtCoreBundle/Resources/public/css/*' %
        <link rel="stylesheet" type="text/css" media="screen" href=" asset_url " />
 % endstylesheets %

提前感谢您的帮助。

【问题讨论】:

我有同样的问题。试图通过图像文件夹到 css 来解决它,但这没有用 【参考方案1】:

我通过以不同方式加载 css 文件“解决了”这个问题:

<link rel="stylesheet" href=" asset('bundles/cmtcore/css/main.css') " type="text/css" media="all" />

这是在 Acme/DemoBundle 中完成的方式。

我将留下这个问题未解决,因为这看起来很愚蠢。

【讨论】:

此方法有效,但它不使用资产包来加载样式表,这意味着您不能添加像 yui_css 这样的酷过滤器。【参考方案2】:

使用 Assetic 捆绑包中的 cs-s-rewrite 过滤器

在 config.yml 中:

assetic:
    debug:          %kernel.debug%
    use_controller: false
    filters:
        cs-s-rewrite: ~

然后像这样调用你的样式表:

 % stylesheets 'bundles/cmtcore/css/*' filter='cs-s-rewrite' %
        <link rel="stylesheet" type="text/css" media="screen" href=" asset_url " />
 % endstylesheets %

哦,别忘了使用php app/console assetic:dump

【讨论】:

我对这个解决方案的问题是 symfony 试图在 /Resources/public/css/* 上找到图像,而它应该寻找 /bundles/mybundle/images/ ...关于此的任何想法一个? cs-s-rewrite 用于重写 css 中图像的路径。它不“寻找图像”,它甚至不知道图像是什么。 好的,cs-s-rewrite 正在将我的图像路径重写为 /Resources/public/css/* 何时应该将其重写为 /bundles/mybundle/images/ 你知道改变的方法吗在 cs-s-rewrite 中? Inor - 使用默认的资产配置(这是您在上面使用的)我遇到了与 Clint 相同的问题。 css 和 js 文件很好,但在 css 文件中,它会在“../../Resources/Public/css/img”中查找图像,而它应该在“bundle/bundlename/img”中查找? 然后真正的问题就出来了……资产的限制。 github.com/kriswallsmith/assetic/issues/53【参考方案3】:

我按照这个网站上的说明解决了这个问题: http://www.craftitonline.com/2011/06/symfony2-beautify-with-assetic-and-a-template-part-ii/

实际的问题是你绝对引用你的包资源,但必须相对引用它们。

% stylesheets filter='cs-s-rewrite' output='css/*.css'
    'bundles/blistercarerisikobewertung/css/*'  %
    <link href=" asset_url " type="text/css" rel="stylesheet" />
% endstylesheets %

清除缓存并重新安装资源

【讨论】:

您不必在每次更改后(甚至在开发环境中)使用此方法安装资产吗?我试试看。 @tobias,是的,我刚刚尝试过,您确实需要在每次更改后安装资产。哎呀。 这对我有用。我会在 web/bundles 中开发我的资产......然后在分发包时将它们复制回包中以提交 您可以像往常一样使用php app/console assets:install --symlink 来开发您的包中的文件,并且每次更改后都不需要安装它们【参考方案4】:

关于 Yann 的回答,如果您使用 --symlink 选项,实际上您不必在每次更改后重新安装资产。

但请注意,运行供应商安装脚本会覆盖符号链接,因此您需要在运行供应商脚本后删除 bundles/* 文件夹并使用 --symlink 选项再次安装资产。

【讨论】:

或者在 composer.json 中添加一个选项以使用 --symlink 代替(如果您使用的是 2.1+)【参考方案5】:

ccsrewrite 的问题很少:

在 AsseticBundle 中使用 @MyBundle 语法来引用资产时,CssRewrite 过滤器不起作用。这是一个已知的限制。

这里是cs-s-rewrite的php版本:

<?php 
    foreach ($view['assetic']->stylesheets(array(
        'bundles/test/css/foundation/foundation.css',
        'bundles/test/css/foundation/app.css',
        'bundles/test/css/themes/adapzonManager.css'), array('cs-s-rewrite')) as $url):
?>
    <link rel="stylesheet" href="<?php echo $view->escape($url) ?>" />
<?php endforeach; ?>

【讨论】:

【参考方案6】:

我有一个类似的问题,我已经环顾了至少一天,但我不相信有一个很好的实用解决方案来解决这个问题。我建议使用 Assetic 来处理 javascript 和 css,然后将您的图像放在您网站的 docroot 中。例如,如果您有一个引用 ../images/file.png 的 css 文件,只需在您的 docroot 下创建和 images 文件夹并将 file.png 放在那里。这绝对不是最好的理论解决方案,但它是我能找到的唯一一个真正有效的解决方案。

【讨论】:

阅读 user257980 的回答和 Clint 评论。有一种方法可以做到这一点。【参考方案7】:

我开发了一个带有额外过滤器的小包来解决这个问题。你可以在github上找到:https://github.com/fkrauthan/FkrCssURLRewriteBundle.git

如果您的 css 文件中有相对路径,则使用此捆绑包,资产的 @Notation 可以工作。

【讨论】:

在没有真正理解您的代码的情况下,我不得不说它可以创造奇迹。非常感谢=)【参考方案8】:

我使用 htaccess 解决了这个问题:

我的资产存储在 src/Datacode/BudgetBundle/Resources/public/(css|img|js) 并且资产输出参数设置为写入:bundles/datacodebudget/css/styles.css(在 web 目录中)

在我的 css 中,我使用相对路径 ../ 来引用图像。

这是 .htaccess 规则:

# Make image path work on dev
# i.e. /app_dev.php/bundles/datacodebudget/img/glyphicons-halflings-white.png rewrites to /bundles/datacodebudget/img/glyphicons-halflings-white.png
RewriteRule ^app_dev\.php/(.*)/(.*)/img/(.*)$ /$1/$2/img/$3 [L]

我的css加载如下:

% stylesheets
    '@DatacodeBudgetBundle/Resources/public/css/bootstrap.css'
    '@DatacodeBudgetBundle/Resources/public/css/bootstrap-responsive.css'
    '@DatacodeBudgetBundle/Resources/public/css/styles.css' 
    '@DatacodeBudgetBundle/Resources/public/css/chosen.css' output="bundles/datacodebudget/css/styles.css"
%
<link href=" asset_url " rel="stylesheet" type="text/css" />
% endstylesheets %

在我的 config.yml 文件中:

assetic:
    use_controller: true

这(没有 htaccess 重写)导致图像无法加载,因为图像的相对路径位于 app_dev.php/bundles/datacodebudget/img/someimage.jpg。使用 cs-s-rewrite 过滤器也不起作用,因为它会将 ../img 重写为 ../../../../Resources/public/img/ 解析为 Resources/public/img。

通过使用 htaccess 方法,图像可以正常加载,当我添加新图像或想要将更改推送到生产环境时,我只需要运行 assets:dump / assets:install。

【讨论】:

【参考方案9】:

我通过在 'symfony_root/web/' 文件夹中永久创建带有图像的 'images' 文件夹解决了这个问题。结果:'symfony_root/web/images/' - 它变得很棒!

【讨论】:

如果您打算与其他人共享您的捆绑包,建议您这样做。最好将资源保存在它们的包中。

以上是关于Symfony2 - Assetic - 在 CSS 中加载图像的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 - Assetic - 在 CSS 中加载图像

如何让 Assetic + sass 在 Windows 中与 Symfony2 一起工作?

在 Symfony2 中使用 Compass 和 Assetic 的 Foundation5

方法 Assetic\AssetWriter::getCombinations() 在 symfony2 使用 capifony 部署时不存在异常

Symfony2 cs-s-rewrite 过滤器的图像路径很遥远

使用 Assetic / Twig / Symfony2,我可以定义前端库吗?