104

問題

いくつかのパス(画像、フォントなど)を含むCSSurl(..)ファイルがあります。

私のパス構造は次のようになります。

...
+-src/
| +-MyCompany/
|   +-MyBundle/
|     +-Resources/
|       +-assets/
|         +-css/
|           +-stylesheets...
+-web/
| +-images/
|   +-images...
...

スタイルシートで自分の画像を参照したい。

最初の解決策

CSSファイルのすべてのパスを絶対パスに変更しました。アプリケーションもサブディレクトリで動作する必要があるため、これは解決策ではありません。

2番目の解決策

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 %}

現在の(3番目の)ソリューション

すべてのCSSファイルがで終わるので、CSSファイル/web/css/stylexyz.cssのすべてのパスを相対パスに変更しました。

url("../images/myimage.png")

この(悪い)解決策は、環境を除いて機能しdevます。CSSパスは/app_dev.php/css/stylexyz.cssであり、したがって、これから生じるイメージパスは/app_dev.php/images/myimage.pngであり、結果として。になりNotFoundHttpExceptionます。

より優れた実用的なソリューションはありますか?

4

6 に答える 6

196

私は非常に同じ問題に遭遇しました。

要するに:

  • 「内部」ディレクトリに元のCSSを入れても構わないと思っています(Resources / asset / css / a.css)
  • 「public」ディレクトリ(Resources / public / images / devil.png)に画像を入れてもよい
  • その小枝がそのCSSを取得し、それをweb / css / a.cssに再コンパイルして、/ web / bundles / mynicebundle / images/devil.png内の画像を指すようにします。

私は次のすべての可能な(正気の)組み合わせでテストを行いました:

  • @ notation、相対表記
  • cssrewriteを使用して、それを使用せずに解析します
  • CSS画像の背景と直接<img>タグsrc=をCSSとまったく同じ画像に
  • アセットを使用して解析されたCSSと、アセットの直接出力を使用して解析されたCSS
  • Resources/public/cssそして、CSSと「private」ディレクトリ(as )で「publicdir」(as)を試すことで、これがすべて倍増しResources/assets/cssます。

これにより、同じ小枝で合計14の組み合わせが得られ、このルートは

  • "/app_dev.php/"
  • 「/app.php/」
  • と "/"

したがって、14 x 3=42のテストが行​​われます。

さらに、これらはすべてサブディレクトリで機能することがテストされているため、絶対URLを指定しても機能しないため、だまされる方法はありません。

テストは、名前のない2つのイメージと、パブリックフォルダーからビルドされたCSSの場合は「a」から「f」まで、内部パスからビルドされたものの場合は「g」から「l」までの名前のdivでした。

私は次のことを観察しました:

14のテストのうち3つだけが3つのURLで適切に表示されました。そして、NONEは「内部」フォルダ(リソース/アセット)からのものでした。予備のCSSPUBLICを用意し、そこにアセットFROMを使用してビルドすることが前提条件でした。

結果は次のとおりです。

  1. /app_dev.php/で起動された結果 /app_dev.php/で起動された結果

  2. /app.php/で起動された結果 /app.php/で起動された結果

  3. /で起動された結果 ここに画像の説明を入力してください

つまり...のみ-2番目の画像-DivB-DivCが許可された構文です。

ここにTWIGコードがあります:

<html>
    <head>
            {% stylesheets 'bundles/commondirty/css_original/container.css' filter="cssrewrite" %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

    {# First Row: ABCDEF #}

            <link href="{{ '../bundles/commondirty/css_original/a.css' }}" rel="stylesheet" type="text/css" />
            <link href="{{ asset( 'bundles/commondirty/css_original/b.css' ) }}" rel="stylesheet" type="text/css" />

            {% stylesheets 'bundles/commondirty/css_original/c.css' filter="cssrewrite" %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

            {% stylesheets 'bundles/commondirty/css_original/d.css' %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

            {% stylesheets '@CommonDirtyBundle/Resources/public/css_original/e.css' filter="cssrewrite" %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

            {% stylesheets '@CommonDirtyBundle/Resources/public/css_original/f.css' %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

    {# First Row: GHIJKL #}

            <link href="{{ '../../src/Common/DirtyBundle/Resources/assets/css/g.css' }}" rel="stylesheet" type="text/css" />
            <link href="{{ asset( '../src/Common/DirtyBundle/Resources/assets/css/h.css' ) }}" rel="stylesheet" type="text/css" />

            {% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/i.css' filter="cssrewrite" %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

            {% stylesheets '../src/Common/DirtyBundle/Resources/assets/css/j.css' %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

            {% stylesheets '@CommonDirtyBundle/Resources/assets/css/k.css' filter="cssrewrite" %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

            {% stylesheets '@CommonDirtyBundle/Resources/assets/css/l.css' %}
                <link href="{{ asset_url }}" rel="stylesheet" type="text/css" />
            {% endstylesheets %}

    </head>
    <body>
        <div class="container">
            <p>
                <img alt="Devil" src="../bundles/commondirty/images/devil.png">
                <img alt="Devil" src="{{ asset('bundles/commondirty/images/devil.png') }}">
            </p>
            <p>
                <div class="a">
                    A
                </div>
                <div class="b">
                    B
                </div>
                <div class="c">
                    C
                </div>
                <div class="d">
                    D
                </div>
                <div class="e">
                    E
                </div>
                <div class="f">
                    F
                </div>
            </p>
            <p>
                <div class="g">
                    G
                </div>
                <div class="h">
                    H
                </div>
                <div class="i">
                    I
                </div>
                <div class="j">
                    J
                </div>
                <div class="k">
                    K
                </div>
                <div class="l">
                    L
                </div>
            </p>
        </div>
    </body>
</html>

container.css:

div.container
{
    border: 1px solid red;
    padding: 0px;
}

div.container img, div.container div 
{
    border: 1px solid green;
    padding: 5px;
    margin: 5px;
    width: 64px;
    height: 64px;
    display: inline-block;
    vertical-align: top;
}

そして、a.css、b.css、c.cssなど:すべて同じで、色とCSSセレクターを変更するだけです。

.a
{
    background: red url('../images/devil.png');
}

「ディレクトリ」構造は次のとおりです。

ディレクトリ ディレクトリ

これはすべて、個々のオリジナルファイルを公開したくないためです。特に、「less」フィルターや「sass」などでプレイしたい場合は、「オリジナル」を公開したくありませんでした。コンパイルされたもの。

しかし、良いニュースがあります。パブリックディレクトリに「スペアCSS」を含めたくない場合は、を使用せずにインストールしてください--symlink。実際にコピーを作成してください。「assetic」が複合CSSを構築したら、ファイルシステムから元のCSSを削除して、画像を残すことができます。

コンパイルプロセス コンパイルプロセス

--env=prod私は環境のためにこれを行うことに注意してください。

ほんの少しの最終的な考え:

  • この望ましい動作は、 GitまたはMercurialの「public」ディレクトリに画像を配置し、「assets」ディレクトリに「css」を配置することで実現できます。つまり、ディレクトリに表示されているように「パブリック」に配置する代わりに、インストーラー/デプロイヤー(おそらくBashスクリプト)を使用するよりも、「パブリック」ではなく「アセット」に存在するa、b、c...を想像してください。assets:install実行前にCSSを一時的に「public」ディレクトリ内に配置し、assets:install次に、、そして実行assetic:dump後に​​パブリックディレクトリからのCSSの削除を自動化しますassetic:dump。これにより、質問で必要な動作が正確に実現されます。

  • 別の(可能であれば不明な)解決策は、「assets:install」がソースとして「public」のみを取得できるか、または公開するソースとして「assets」を取得できるかどうかを調査することです。--symlinkこれは、開発時にオプションを付けてインストールすると役立ちます。

  • さらに、「public」ディレクトリからの削除をスクリプト化する場合、それらを別のディレクトリ(「assets」)に保存する必要はなくなります。それらは、パブリックにデプロイされるとドロップされるため、バージョン管理システムの「パブリック」内に存在できます。これにより、--symlink使用も可能になります。

しかし、とにかく、今注意してください:現在、オリジナルはもう存在しないので(rm -Rf)、3つではなく2つの解決策しかありません。元のアセットがあったと仮定すると、asset()呼び出しであったため、作業div"B"は機能しなくなりました。「C」(コンパイルされたもの)のみが機能します。

だから...最終的な勝者だけがあります:Div "C"は、トピックで求められたものを正確に許可します:コンパイルするには、画像へのパスを尊重し、元のソースを公開しないでください。

勝者はCです

勝者はCです

于 2012-04-24T00:32:05.433 に答える
17

現在、cssrewriteフィルターは@bundle表記と互換性がありません。したがって、2つの選択肢があります。

  • Webフォルダー内のCSSファイルを参照します(後console assets:install --symlink web:)

    {% stylesheets '/bundles/myCompany/css/*." filter="cssrewrite" %}
    
  • cssembedフィルターを使用して、このようにCSSに画像を埋め込みます。

    {% stylesheets '@MyCompanyMyBundle/Resources/assets/css/*.css' filter="cssembed" %}
    
于 2012-03-26T00:09:44.843 に答える
9

@ xavi-monteroのおかげで、うまくいったことを投稿します。

CSSをバンドルのResource/public/cssディレクトリに配置し、画像をたとえばに配置しますResource/public/img

レイアウトで、アセットパスをフォーム'bundles/mybundle/css/*.css'に変更します。

で、アセットconfig.ymlにルールcss_rewriteを追加します。

assetic:
    filters:
        cssrewrite:
            apply_to: "\.css$"

次に、アセットをインストールし、asseticでコンパイルします。

$ rm -r app/cache/* # just in case
$ php app/console assets:install --symlink
$ php app/console assetic:dump --env=prod

これは開発ボックスには十分であり、--symlink便利なので、を入力するときにアセットを再インストールする(たとえば、新しいイメージを追加する)必要はありませんapp_dev.php

本番サーバーの場合、(展開スクリプトで)'--symlink'オプションを削除し、最後に次のコマンドを追加しました。

$ rm -r web/bundles/*/css web/bundles/*/js # all this is already compiled, we don't need the originals

すべて完了です。これにより、.cssファイルで次のようなパスを使用できます。../img/picture.jpeg

于 2012-08-22T05:05:15.960 に答える
5

私は同じ問題を抱えていましたが、回避策として次のものを使用してみました。これまでのところうまくいくようです。これらすべての静的アセットへの参照のみを含むダミーテンプレートを作成することもできます。

{% stylesheets
    output='assets/fonts/glyphicons-halflings-regular.ttf'
    'bundles/bootstrap/fonts/glyphicons-halflings-regular.ttf'
%}{% endstylesheets %}

テンプレートに何も表示されないことを意味する出力の省略に注意してください。Assetic:dumpを実行すると、ファイルが目的の場所にコピーされ、cssに期待どおりの作業が含まれます。

于 2013-10-19T22:19:17.637 に答える
3

それが誰かを助けることができるなら、私たちはAsseticと多くの苦労をしてきました、そして私たちは現在開発モードで次のことをしています:

  • devEnvironmenのDumpingAssetFilesのように設定するのでconfig_dev.yml、次のようにコメントしました。

    #assetic:
    #    use_controller: true
    

    そしてrouting_dev.ymlで

    #_assetic:
    #    resource: .
    #    type:     assetic
    
  • Webルートからの絶対URLとしてURLを指定します。たとえば、background-image:url("/bundles/core/dynatree/skins/skin/vline.gif");注:vhostWebルートはを指していweb/ます。

  • cssrewriteフィルターを使用しません

于 2012-08-22T20:18:51.017 に答える
1

私はしばしばcss/jsプラグインをcomposerで管理します。composerはそれをベンダーの下にインストールします。それらをweb/bundlesディレクトリにシンボリックリンクします。これにより、composerは必要に応じてバンドルを更新できます。

例:

1-シンボリックリンクを1回だけ使用します(コマンドfromweb /bundles/を使用します

ln -sf vendor/select2/select2/dist/ select2

2-必要に応じて、小枝テンプレートでアセットを使用します。

{{ asset('bundles/select2/css/fileinput.css) }}

よろしく。

于 2016-06-19T12:42:51.980 に答える