सिम्फनी 2 में सीएसएस फाइलों में संपत्ति का पथ


101

संकट

मेरे पास इसमें कुछ पथों के साथ एक सीएसएस फ़ाइल है (चित्र, फ़ॉन्ट, आदि के लिए url(..))।

मेरी पथ संरचना इस प्रकार है:

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

मैं अपनी छवियों को स्टाइलशीट में संदर्भित करना चाहता हूं।

पहला उपाय

मैंने CSS फ़ाइल में सभी पथों को निरपेक्ष पथों में बदल दिया है। यह कोई समाधान नहीं है, क्योंकि एप्लिकेशन को एक उपनिर्देशिका में भी काम करना चाहिए (और करना चाहिए!)।

दूसरा उपाय

के साथ एसिटिक का प्रयोग करें filter="cssrewrite"

इसलिए मैंने अपने सीएसएस फ़ाइल में अपने सभी पथ बदल दिए

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

मेरे संसाधन निर्देशिका से निर्देशिका तक वास्तविक पथ का प्रतिनिधित्व करने के लिए /web/images। यह काम नहीं करता है, क्योंकि cssrewrite निम्नलिखित कोड का उत्पादन करता है:

url("../../Resources/assets/")

जो स्पष्ट रूप से गलत रास्ता है।

assetic:dumpइस पथ के बनने के बाद , जो अभी भी गलत है:

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

एसिटिक की टहनी कोड:

{% stylesheets
    '@MyCompanyMyBundle/Resources/assets/css/*.css'
    filter="cssrewrite"
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

वर्तमान (तीसरा) समाधान

चूंकि सभी सीएसएस फाइलें समाप्त हो जाती हैं /web/css/stylexyz.css, इसलिए मैंने रिश्तेदार होने के लिए सीएसएस फाइल में सभी रास्ते बदल दिए:

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

यह (खराब) समाधान काम करता है, devपर्यावरण को छोड़कर : सीएसएस पथ है /app_dev.php/css/stylexyz.cssऔर इसलिए इसके परिणामस्वरूप छवि पथ है /app_dev.php/images/myimage.png, जिसके परिणामस्वरूप ए NotFoundHttpException

क्या कोई बेहतर और कारगर उपाय है?


1
मैंने अपना समाधान यहां पोस्ट किया: stackoverflow.com/q/9501248/1146363
सेराड

क्या यह वास्तव में उपयोग करते समय पथ के साथ समस्या को हल करता है app_dev.php?
एपीफेलबॉक्स

जवाबों:


194

मैं बहुत ही एक ही समस्या को लेकर आया हूं।

संक्षेप में:

  • मूल सीएसएस को एक "आंतरिक" डायर (संसाधन / संपत्ति / सीएसएस / ए.के.एस) में रखने की इच्छा
  • "सार्वजनिक" dir (संसाधन / सार्वजनिक / चित्र / devil.png) में छवियां प्राप्त करना
  • उस सीवी को लेने से सीएसएस उस वेब / css / a.cs में पुन: जुड़ जाता है और इसे /web/bundles/mynicebundle/images/devil.png में छवि बनाता है

मैंने निम्नलिखित के सभी संभव (साने) संयोजनों के साथ एक परीक्षण किया है:

  • @ नोटेशन, सापेक्ष संकेतन
  • इसके बिना, crewrewrite के साथ पार्स करें
  • सीएसएस छवि पृष्ठभूमि बनाम प्रत्यक्ष <img> टैग src = सीएसएस की तुलना में बहुत ही छवि के लिए
  • सीएसएस ने एसिटिक के साथ पार्स किया और एसिटिक डायरेक्ट आउटपुट के साथ पार्स किए बिना भी
  • और यह सब Resources/public/cssसीएसएस और एक "निजी" निर्देशिका (के रूप में ) के साथ "सार्वजनिक डार" (के रूप में ) की कोशिश करके गुणा किया जाता है Resources/assets/css

इसने मुझे एक ही टहनी पर कुल 14 संयोजन दिए, और इस मार्ग से लॉन्च किया गया था

  • "/App_dev.php/"
  • "/App.php/"
  • तथा "/"

इस प्रकार 14 x 3 = 42 परीक्षण दे रहा है।

इसके अतिरिक्त, यह सब एक उपनिर्देशिका में काम करने के लिए परीक्षण किया गया है, इसलिए पूर्ण URL देकर मूर्ख बनाने का कोई तरीका नहीं है क्योंकि वे बस काम नहीं करेंगे।

परीक्षण दो अनाम छवियां थीं और फिर सीएसएस से सार्वजनिक फ़ोल्डर से निर्मित सी के लिए 'ए' से 'एफ' नाम दिया गया और आंतरिक पथ से निर्मित लोगों के लिए 'जी' से 'एल' नाम दिया गया।

मैंने निम्नलिखित देखा:

14 में से केवल 3 परीक्षण तीन URL पर पर्याप्त रूप से दिखाए गए थे। और कोई भी "आंतरिक" फ़ोल्डर (संसाधन / संपत्ति) से नहीं था। यह आवश्यक था कि सीएसएस पब्लिक पब्लिश हो और फिर वहां से एसिटिक एफएटी के साथ निर्माण किया जाए।

ये परिणाम हैं:

  1. परिणाम /app_dev.php/ के साथ लॉन्च किया गया परिणाम /app_dev.php/ के साथ लॉन्च किया गया

  2. परिणाम /app.php/ के साथ लॉन्च किया गया परिणाम /app.php/ के साथ लॉन्च किया गया

  3. परिणाम के साथ लॉन्च / यहां छवि विवरण दर्ज करें

इसलिए ... केवल - दूसरी छवि - Div B - Div C की अनुमति सिंटैक्स हैं।

यहाँ 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>

कंटेनर:

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');
}

"निर्देशिका" संरचना है:

निर्देशिकाएँ निर्देशिकाएँ

यह सब इसलिए आया, क्योंकि मैं नहीं चाहता था कि व्यक्तिगत मूल फाइलें जनता के सामने उजागर हों, खासकर अगर मैं "कम" फिल्टर या "सैस" या समान के साथ खेलना चाहता था ... मैं नहीं चाहता था कि मेरे "मूल" प्रकाशित हों, केवल संकलित एक।

लेकिन अच्छी खबरें हैं । यदि आप सार्वजनिक निर्देशिकाओं में "स्पेयर सीएसएस" नहीं रखना चाहते हैं ... उन्हें स्थापित न करें --symlink, लेकिन वास्तव में एक प्रतिलिपि बना रहे हैं। एक बार "एसेटिक" ने यौगिक सीएसएस का निर्माण किया है, और आप फाइल सिस्टम से मूल सीएसएस को हटा सकते हैं, और छवियों को छोड़ सकते हैं:

संकलन की प्रक्रिया संकलन की प्रक्रिया

नोट मैं यह --env=prodपर्यावरण के लिए करता हूं ।

बस कुछ अंतिम विचार:

  • यह वांछित व्यवहार Git या Mercurial में "सार्वजनिक" निर्देशिका में चित्र और "संपत्ति" निर्देशिका में "css" होने से प्राप्त किया जा सकता है । कि निर्देशिकाओं में दिखाए अनुसार उन्हें "सार्वजनिक" करने के बजाय, अपने इंस्टॉलर / तैनातीकर्ता (शायद एक बैश स्क्रिप्ट) की तुलना में "सार्वजनिक" के बजाय "संपत्ति" में रहने वाले, ए, बी, सी ... की कल्पना करें। "सार्वजनिक" डीआईआर के अंदर अस्थायी रूप से सीएसएस को लगाने से पहले assets:installनिष्पादित किया जाता है assets:install, फिर assetic:dump, और फिर सीएसएस को हटाने के बाद सार्वजनिक निर्देशिका से स्वचालित रूप से assetic:dumpनिष्पादित किया जाता है। यह प्रश्न में वांछित व्यवहार को प्राप्त करेगा।

  • एक और (अज्ञात यदि संभव हो तो) समाधान यह पता लगाने के लिए होगा कि "संपत्ति: स्थापित" केवल स्रोत के रूप में "सार्वजनिक" ले सकता है या प्रकाशित करने के लिए स्रोत के रूप में "संपत्ति" भी ले सकता है। --symlinkविकसित होने पर विकल्प के साथ स्थापित करने में मदद मिलेगी ।

  • इसके अतिरिक्त, यदि हम "पब्लिक" डायर से हटाने की स्क्रिप्ट करने जा रहे हैं, तो, उन्हें एक अलग निर्देशिका ("संपत्ति") में संग्रहीत करने की आवश्यकता गायब हो जाती है। वे हमारे संस्करण-नियंत्रण प्रणाली में "सार्वजनिक" के अंदर रह सकते हैं क्योंकि जनता को वहां तैनात किया जाएगा। यह --symlinkउपयोग के लिए भी अनुमति देता है ।

लेकिन, अभी नहीं: क्योंकि अब मूल वहाँ नहीं हैं ( rm -Rf), वहाँ केवल दो समाधान हैं, तीन नहीं। काम करने वाला div "B" अब काम नहीं करता है क्योंकि यह एक परिसंपत्ति थी () यह मानते हुए कि मूल संपत्ति थी। केवल "सी" (संकलित एक) काम करेगा।

तो ... केवल एक अंतिम विजेता है: Div "C" वास्तव में इस विषय में जो पूछा गया था, वह अनुमति देता है: संकलित होने के लिए, छवियों के लिए पथ का सम्मान करें और मूल स्रोत को जनता के सामने उजागर न करें।

विजेता C है

विजेता C है


3
पिछली पोस्ट के लिए छवियों के लिंक: 1) /app_dev.php/ , 2 के साथ लॉन्च किया गया परिणाम) /app.php/ लिंक के साथ लॉन्च किया गया परिणाम , 3) / लिंक के साथ लॉन्च किया गया परिणाम , 4) निर्देशिकाएँ लिंक , 5) संकलन प्रक्रिया लिंक , 6) विजेता लिंक
Xavi मोंटेरो

1
और यदि आप उपयोग background-image: url('../images/devil.png');करने के बजाय एक और बंडल से एक छवि जोड़ना चाहते हैंbackground-image: url('../../../bundles/frontendlayout/images/devil.png');
Xavi Montero

1
"कम" के साथ "crewrewrite" के संयोजन के लिए भी काम करता है:{% stylesheets filter="cssrewrite,less" "bundles/frontendlayout/less/layout.less" %} <link href="{{ asset_url }}" rel="stylesheet" type="text/css" /> {% endstylesheets %}
Xavi मोंटेरो

1
यह सिम्फनी प्रलेखन में नोट किया गया है। यहां
नूह डंकन

17

Crewrewrite फ़िल्टर अभी के लिए @bundle संकेतन के साथ संगत नहीं है। तो आपके पास दो विकल्प हैं:

  • वेब फ़ोल्डर में CSS फाइलों को देखें (बाद में console assets:install --symlink web) :

    {% stylesheets '/bundles/myCompany/css/*." filter="cssrewrite" %}
  • इस तरह से CSS में इमेज एम्बेड करने के लिए cssembed फ़िल्टर का उपयोग करें।

    {% stylesheets '@MyCompanyMyBundle/Resources/assets/css/*.css' filter="cssembed" %}

आपकी टिप्पणी के लिये धन्यवाद। यदि आप केवल छोटी छवियां रखते हैं तो दूसरा समाधान काफी अच्छा लगता है। मैं सीएसएस फ़ाइल में कुछ 100k + छवियों को रखने के लिए सहज महसूस नहीं करूंगा, हालांकि।
एपफ्लोबॉक्स

9

मैं @ xavi-montero के लिए धन्यवाद, मेरे लिए क्या काम करता हूँ पोस्ट करूँगा।

अपने सीएसएस को अपनी बंडल Resource/public/cssनिर्देशिका में, और अपनी छवियों को कहें Resource/public/img

'bundles/mybundle/css/*.css'अपने लेआउट में, फ़ॉर्म को एसिटिक पथ बदलें ।

में config.yml, नियम जोड़ने css_rewriteassetic रहे हैं:

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

अब संपत्ति स्थापित करें और एसिटिक के साथ संकलित करें:

$ 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


5

मेरे पास एक ही समस्या थी और मैंने केवल वर्कअराउंड के रूप में निम्नलिखित का उपयोग करने की कोशिश की। अभी तक तो काम कर रहा है। आप एक डमी टेम्पलेट भी बना सकते हैं जिसमें सिर्फ उन सभी स्थिर संपत्तियों का संदर्भ होता है।

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

किसी भी आउटपुट के चूक की सूचना दें जिसका मतलब है कि टेम्पलेट पर कुछ भी नहीं दिखता है। जब मैं एसेटिक चलाता हूं: डंप फ़ाइलों को वांछित स्थान पर कॉपी किया जाता है और सीएसएस में अपेक्षित रूप से काम शामिल होता है।


1
आप नामांकित संपत्ति के लिए एक विन्यास प्रविष्टि का उपयोग कर सकते हैं और आपको इसे टेम्प्लेट में शामिल करने की आवश्यकता नहीं है। यह वैसे भी symfony.com/doc/current/cookbook/assetic/…
शिरापरक जूल

3

यदि यह किसी की मदद कर सकता है, तो हमने एसिटिक के साथ बहुत संघर्ष किया है, और हम अब विकास मोड में निम्नलिखित कर रहे हैं:

  • देव एसेटमेन में डंपिंग एसेट फाइल की तरह सेट करें config_dev.yml, इसलिए हमने टिप्पणी की है:

    #assetic:
    #    use_controller: true

    और routing_dev.yml में

    #_assetic:
    #    resource: .
    #    type:     assetic
  • URL को वेब रूट से निरपेक्ष बताएं। उदाहरण के लिए, पृष्ठभूमि-छवि: url("/bundles/core/dynatree/skins/skin/vline.gif");नोट: हमारी vhost वेब रूट इंगित कर रही है web/

  • किसी भी तरह का उपयोग नहीं किया गया है


3
यह एक वैध समाधान है, लेकिन केवल तभी जब आप फ़ाइलों को उपनिर्देशिका से सेवा नहीं देंगे, उदाहरण के लिए http://example.org/sub/:।
एपफ्लोबॉक्स

1

मैं संगीतकार के साथ सीएसएस / जेएस प्लगइन का प्रबंधन करता हूं जो इसे विक्रेता के नीचे स्थापित करता है। मैं उन वेब / बंडलों निर्देशिका के लिए सहानुभूति रखता हूं, जो संगीतकार को बंडलों को आवश्यकतानुसार अपडेट करने देते हैं।

उदाहरण के लिए:

1 - सभी में एक बार सीलिंक (उपयोग कमांड fromweb / बंडलों /

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

2 - जहां आवश्यक हो, परिसंपत्ति का उपयोग करें

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

सादर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.