সিমফনি 2-এ সিএসএস ফাইলগুলিতে সম্পদের পথ


101

সমস্যা

আমার কিছু সিএসএস ফাইল রয়েছে এতে কয়েকটি পাথ রয়েছে (চিত্র, ফন্ট ইত্যাদির জন্য url(..))।

আমার পথের কাঠামোটি এরকম:

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

আমি আমার চিত্রগুলি স্টাইলশিটে উল্লেখ করতে চাই।

প্রথম সমাধান

আমি সিএসএস ফাইলের সমস্ত পাথকে পরম পথে পরিবর্তন করেছি। এটি কোনও সমাধান নয়, কারণ অ্যাপ্লিকেশনটিরও একটি উপ-ডিরেক্টরিতে কাজ করা উচিত (এবং করতে হবে!)।

দ্বিতীয় সমাধান

সঙ্গে সম্পদ ব্যবহার করুন filter="cssrewrite"

সুতরাং আমি আমার সিএসএস ফাইলে আমার সমস্ত পাথ বদলেছি

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

আমার সংস্থান ডিরেক্টরি থেকে ডিরেক্টরিটিতে প্রকৃত পথ উপস্থাপন করতে /web/images। এটি কার্যকর হয় না, যেহেতু সিএসক্রয়েট নিম্নলিখিত কোডগুলি উত্পাদন করে:

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
Cerad

এটি ব্যবহার করার সময় পাথগুলির সাথে সমস্যাটি কি আসলেই সমাধান করে app_dev.php?
অ্যাপেলবক্স

উত্তর:


194

আমি খুব খুব একই সমস্যা জুড়ে এসেছি।

সংক্ষেপে:

  • একটি "অভ্যন্তরীণ" দির (সংস্থানসমূহ / সম্পদ / CSS / a.css) মূল আসল সিএসএস পেতে ইচ্ছুক
  • "সর্বজনীন" দিরে ছবিগুলি রাখতে ইচ্ছুক (সংস্থানসমূহ / পাবলিক / চিত্র / শয়তান.পিএনজি)
  • এই টুইগটি এই সিএসএসের জন্য প্রস্তুত, এটি ওয়েব / সিএসএস / এ সিএসএস-এ পুনরায় সংশ্লেষ করে এবং চিত্রটিকে /web/bundles/mynicebundle/images/devil.png এ নির্দেশ করুন

আমি নিম্নলিখিতগুলির সমস্ত সম্ভব (বুদ্ধিমান) সংমিশ্রণ দিয়ে একটি পরীক্ষা করেছি:

  • @ নোটেশন, আপেক্ষিক স্বরলিপি
  • Cssrewrite সঙ্গে পার্স, এটি ছাড়া
  • সিএসএস চিত্রের ব্যাকগ্রাউন্ড বনাম সরাসরি <img> ট্যাগ এসসিআর = সিএসএসের চেয়ে খুব একই চিত্রে
  • সিএসএস অ্যাসেটিকের সাথে পার্স করা হয়েছে এবং অ্যাসেটিক ডিরেক্ট আউটপুটকেও পার্সিং ছাড়াই
  • এবং এগুলি Resources/public/cssCSS এবং একটি "ব্যক্তিগত" ডিরেক্টরি (যেমন Resources/assets/css) দিয়ে একটি "পাবলিক দির" (যেমন ) চেষ্টা করে বহুগুণ হয়েছে ।

এটি আমাকে একই পাতায় মোট 14 টি সংমিশ্রণ দিয়েছে এবং এই রুটটি চালু হয়েছিল

  • "/App_dev.php/"
  • "/App.php/"
  • এবং "/"

এইভাবে 14 x 3 = 42 পরীক্ষা দেওয়া।

অধিকন্তু, এগুলি সমস্ত একটি উপ-ডিরেক্টরিতে কাজ করে পরীক্ষা করা হয়েছে, তাই নিখুঁত ইউআরএল দিয়ে বোকা বানানোর কোনও উপায় নেই কারণ এগুলি কেবল কার্যকর হবে না।

পরীক্ষাগুলি দুটি নামবিহীন চিত্র ছিল এবং তারপরে সিএসএসের জন্য 'a' থেকে 'f' নামক পাবলিক ফোল্ডারটি ডিভ করে এবং অভ্যন্তরীণ পথ থেকে নির্মিত যন্ত্রে 'g থেকে' l 'নামকরণ করা হয়েছিল।

আমি নিম্নলিখিত পর্যবেক্ষণ:

১৪ টি পরীক্ষার মধ্যে কেবল তিনটিই তিনটি ইউআরএলে পর্যাপ্ত পরিমাণে প্রদর্শিত হয়েছিল। এবং কোনটি "অভ্যন্তরীণ" ফোল্ডার (সংস্থানসমূহ / সম্পদ) থেকে এসেছিল। স্পেয়ার সিএসএস পাবলিক রাখা এবং তারপরে সেখানে অ্যাসেটেটিক দিয়ে তৈরি করা পূর্ব শর্ত ছিল।

এগুলি ফলাফল:

  1. ফলাফলটি /app_dev.php/ দিয়ে চালু করা হয়েছে ফলাফলটি /app_dev.php/ দিয়ে চালু করা হয়েছে

  2. /App.php/ দিয়ে ফলাফল চালু করা হয়েছে /App.php/ দিয়ে ফলাফল চালু করা হয়েছে

  3. / এর সাথে ফলাফল চালু করা হয়েছে এখানে চিত্র বর্ণনা লিখুন

সুতরাং ... কেবলমাত্র - দ্বিতীয় চিত্র - ডি বি - ডিভ সি হ'ল অনুমোদিত বাক্য গঠন।

এখানে 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>

ধারক। 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, ইত্যাদি: সমস্ত অভিন্ন, কেবল রঙ এবং সিএসএস নির্বাচক পরিবর্তন করে।

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

"ডিরেক্টরিগুলি" কাঠামোটি হ'ল:

ডিরেক্টরি ডিরেক্টরি

এই সমস্ত কিছু এসেছিল, কারণ আমি পৃথক মূল ফাইলগুলি জনসাধারণের সামনে প্রকাশ করতে চাইনি, বিশেষত যদি আমি "কম" ফিল্টার বা "স্যাস" বা অনুরূপ নিয়ে খেলতে চাইতাম ... আমি আমার "মূল" প্রকাশিত চাই না, কেবলমাত্র সংকলিত একটি।

তবে সুসংবাদ রয়েছে । আপনি যদি পাবলিক ডিরেক্টরিতে "অতিরিক্ত সিএসএস" রাখতে না চান ... এগুলি ইনস্টল করুন না --symlink, তবে সত্যই একটি অনুলিপি তৈরি করুন। একবার "অ্যাসেটেটিক" যৌগিক সিএসএস তৈরি করে, এবং আপনি ফাইল সিস্টেম থেকে মূল সিএসএস মুছে ফেলতে এবং চিত্রগুলি ছেড়ে দিতে পারেন:

সংকলন প্রক্রিয়া সংকলন প্রক্রিয়া

নোট আমি --env=prodপরিবেশের জন্য এটি না ।

মাত্র কয়েকটি চূড়ান্ত চিন্তাভাবনা:

  • এই পছন্দসই আচরণটি গিট বা মার্চুরিয়ালে "পাবলিক" ডিরেক্টরিতে এবং "সম্পদ" ডিরেক্টরিতে "সিএসএস" ছবি থাকাতে অর্জন করা যেতে পারে । এটি হ'ল ডিরেক্টরিগুলিতে প্রদর্শিত হিসাবে "সর্বজনীন" না হয়ে, আপনার ইনস্টলার / স্থাপনক (সম্ভবত কোনও বাশ স্ক্রিপ্ট) না করে "জনসাধারণের" পরিবর্তে "সম্পদে" বাস করে একটি, বি, সি ... কল্পনা করুন ) assets:installমৃত্যুদন্ড কার্যকর করার আগে সিএসএসকে সাময়িকভাবে "পাবলিক" দির ভিতরে রেখে assets:install, তারপরে assetic:dumpএবং তারপরে assetic:dumpমৃত্যুদন্ড কার্যকর হওয়ার পরে পাবলিক ডিরেক্টরি থেকে সিএসএস অপসারণকে স্বয়ংক্রিয় করে তোলা হয়। এটি প্রশ্নের মধ্যে পছন্দসই আচরণটি হুবহু অর্জন করবে।

  • আরেকটি (সম্ভব হলে অজানা) সমাধানটি যদি "সম্পদ: ইনস্টল" কেবলমাত্র উত্স হিসাবে "জনসাধারণ" নিতে পারে বা "সম্পদ" প্রকাশের জন্য উত্স হিসাবে নিতে পারে তা অন্বেষণ করতে হবে। এটি --symlinkযখন বিকাশ করার সময় বিকল্পের সাথে ইনস্টল করা হবে তখন সহায়তা করবে ।

  • তদতিরিক্ত, যদি আমরা "সর্বজনীন" দির থেকে অপসারণের স্ক্রিপ্ট করতে যাচ্ছি, তবে, তাদের পৃথক ডিরেক্টরিতে ("সম্পদ") সংরক্ষণের প্রয়োজনীয়তা অদৃশ্য হয়ে যায়। তারা আমাদের সংস্করণ-নিয়ন্ত্রণ সিস্টেমে "পাবলিক" এর ভিতরে থাকতে পারে কারণ জনসাধারণের কাছে মোতায়েন করার পরে সেখানে নামানো হবে। এটি --symlinkব্যবহারের জন্যও অনুমতি দেয় ।

যাইহোক, এখনই সতর্কতা: এখন যেমন মূলগুলি আর নেই ( rm -Rf), তিনটি নয়, কেবল দুটি সমাধান রয়েছে। ওয়ার্কিং ডিভ "বি" আর কাজ করে না কারণ এটি একটি সম্পদ () কল ছিল যে আসল সম্পদ ছিল ধরে নিয়েছিল। কেবলমাত্র "সি" (সংকলিত) কাজ করবে।

সুতরাং ... কেবলমাত্র একটি চূড়ান্ত বিজয়ী রয়েছে: ডিভ "সি" বিষয়টিতে যা জিজ্ঞাসা করা হয়েছিল তা হুবহু অনুমতি দেয়: সংকলন করার জন্য, চিত্রগুলির পথটিকে সম্মান করুন এবং মূল উত্সটি জনসাধারণের কাছে প্রকাশ করবেন না।

বিজয়ী সি

বিজয়ী সি


3
পূর্ববর্তী পোস্টের জন্য ছবিগুলির লিঙ্কগুলি: 1) /app_dev.php/ , 2) ফলাফল চালু হয়েছে /app.php/ লিঙ্কের সাথে প্রবর্তিত ফলাফল , 3) ফলাফল / লিঙ্ক সহ প্রবর্তিত , 4) ডিরেক্টরিগুলি লিঙ্ক , 5) সংকলন প্রক্রিয়া লিঙ্ক , 6) বিজয়ী লিঙ্কটি
জাভি মন্টেরো

1
এবং আপনি অন্য বান্ডিল থেকে একটি চিত্র যোগ করার জন্য, পরিবর্তে ব্যবহার করার চান তাহলে background-image: url('../images/devil.png');ব্যবহার এইbackground-image: url('../../../bundles/frontendlayout/images/devil.png');
জাভি Montero

1
এছাড়াও "কম" সাথে "সিএস্রুরাইট" সংযুক্ত করে কাজ করে:{% stylesheets filter="cssrewrite,less" "bundles/frontendlayout/less/layout.less" %} <link href="{{ asset_url }}" rel="stylesheet" type="text/css" /> {% endstylesheets %}
জাভি মন্টেরো

1
সিমফনি ডকুমেন্টেশনে এটি উল্লেখ করা হয়েছে। এখানে
নূহ ডানকান

17

সিএস্রুরাইট ফিল্টার আপাতত @ বান্ডেল নোটেশনের সাথে সামঞ্জস্যপূর্ণ নয়। সুতরাং আপনার দুটি পছন্দ আছে:

  • ওয়েব ফোল্ডারে সিএসএস ফাইলগুলি উল্লেখ করুন (এর পরে console assets:install --symlink web:)

    {% stylesheets '/bundles/myCompany/css/*." filter="cssrewrite" %}
  • সিএসএসে চিত্রগুলি এম্বেড করতে সাসেমব্যাড ফিল্টারটি ব্যবহার করুন।

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

আপনার মন্তব্যের জন্য ধন্যবাদ. দ্বিতীয় সমাধানটি বেশ ভাল শোনাচ্ছে যদি আপনার কাছে কেবল ছোট চিত্র থাকে। যদিও আমি সিএসএস ফাইলে কিছু 100 কে + ইমেজ লাগাতে স্বাচ্ছন্দ্য বোধ করি না।
অ্যাপলবক্স

9

আমি আমার জন্য যা কাজ করেছি তা পোস্ট করব, @ জাভি-মন্টেরোকে ধন্যবাদ।

আপনার বান্ডেলের Resource/public/cssডিরেক্টরিতে আপনার সিএসএস এবং আপনার চিত্রগুলি বলুন Resource/public/img

'bundles/mybundle/css/*.css'আপনার লেআউটে ফর্মটিতে অ্যাসেটিক পাথগুলি পরিবর্তন করুন ।

ইন config.yml, সম্পত্তিতে নিয়ম যুক্ত করুন css_rewrite:

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

এটি যদি কাউকে সহায়তা করতে পারে তবে আমরা অ্যাসেটেটিকের সাথে অনেক লড়াই করেছি এবং আমরা এখন বিকাশ মোডে নিম্নলিখিতগুলি করছি:

  • মত সেট আপ করুন দেব Environmen সম্পদ ফাইল ডাম্পিং তাই config_dev.yml, আমরা মন্তব্য করেছেন:

    #assetic:
    #    use_controller: true

    এবং রাউটিং_দেভ.আইএমএল এ

    #_assetic:
    #    resource: .
    #    type:     assetic
  • ওয়েব রুট থেকে নিখুঁত হিসাবে URL নির্দিষ্ট করুন। উদাহরণস্বরূপ, পটভূমি-চিত্র: url("/bundles/core/dynatree/skins/skin/vline.gif");দ্রষ্টব্য: আমাদের vhost ওয়েব রুট নির্দেশ করছে web/

  • Cssrewrite ফিল্টার কোন ব্যবহার


3
এটিকে একটি বৈধ সমাধান, কিন্তু শুধুমাত্র যদি আপনি একটি সাব, উদাহরণস্বরূপ ফাইল পরিবেশন করা হবে না: http://example.org/sub/
এফেলবক্স

1

আমি সুরকারের সাথে সিএসএস / জেএস প্লাগইন পরিচালনা করি যা এটি বিক্রেতার অধীনে ইনস্টল করে। আমি সেগুলিকে ওয়েব / বান্ডিল ডিরেক্টরিতে সিমিলিঙ্ক করি, যা প্রয়োজন অনুসারে সুরকারকে আপডেট বান্ডিল দেয়।

উদাহরণস্বরূপ:

1 - একবারে একবারে সিমিলিংক করুন (ওয়েবে / বান্ডেল /

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

2 - পাতলা টেম্পলেটটিতে যেখানে প্রয়োজন সেখানে সম্পদ ব্যবহার করুন:

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

শুভেচ্ছা।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.