Передайте переменную в URL ресурса Assetic в Symfony2 - PullRequest
13 голосов
/ 27 ноября 2011

Есть ли способ передать переменную в метод Assetic в шаблонах

{% stylesheets
    '@SomeExampleBundle/Resources/views/ SOMEVAR /css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

Итак, я хочу передать SOMEVAR из контроллера.

Ответы [ 5 ]

25 голосов
/ 29 апреля 2012

Это возможно таким образом:

<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/' ) }}" />
18 голосов
/ 27 ноября 2011

Пока я не думаю, что это вообще возможно.Причиной этого является то, что Assetic запускается заранее для выгрузки ресурсов, поэтому он не запускает шаблон Twig для вычисления переменной.Это, вероятно, то же самое, если вы делаете это в шаблоне PHP.

Это означает, что переменные времени выполнения не будут вычисляться и расширяться.Таким образом, это делает невозможным генерирование активов, если используется переменная.Это может измениться в будущем, но это приведет к дополнительным издержкам при производстве каждый раз, когда пользователь запрашивает активы, потому что Assetic потребуется для генерации активов.

Я знаю, что можно программно определять игенерирует актив, используя код, найденный в Assetic напрямую (не используя AsseticBundle).Чтобы решить эту проблему, вам нужно будет поэкспериментировать, прочитать исходный код, а также проб и ошибок.

На данный момент документации по Assetic практически нет.Единственная ссылка, которую я могу дать - это README, найденная на странице github Assetic здесь .Я надеюсь, что это скоро изменится.

Надеюсь, это поможет.

3 голосов
/ 21 ноября 2013

Чтобы немного прояснить ответ Чопчопа:

Сначала вам нужно включить все файлы, которые нужна сборке, так как она должна знать, что вам нужно выбросить.Что вы можете сделать условным способом - это включить сам актив во время выполнения.

Итак, сначала поместите в сборочную часть:

{% javascripts 
'@ExampleComBundle/Resources/public/js/module1.js'
'@ExampleComBundle/Resources/public/js/module2.js'
%}
{% endjavascripts %} 

Теперь вы можете поставить условие, которое выв розыске.Оба этих сценария будут выгружены во время развертывания, но вы сможете выбрать во время выполнения, какой из них включить:

<link rel="stylesheet" href="{{ asset('bundles/examplecombundle/js/module' ~ WHICH_MODULE_TO_INCLUDE ~ '.js ) }}" />

Символ ~ является просто оператором объединения в шаблонах Twig.

Работает, конечно же, с CSS и JS.

1 голос
/ 15 сентября 2015

Другая альтернатива, которая работает с ограниченным диапазоном параметров (решение Петра не работает для меня в режиме разработки):

{% javascripts
    '@AcmeDemoBundle/Resources/public/js/module_A.js'
    output='js/module_A.js'
%}
    {% if myVar == "A" %}
        <script src="{{ asset_url }}"></script>
    {% endif %}
{% endjavascripts %}

{% javascripts
    '@AcmeDemoBundle/Resources/public/js/submodule1_B.js'
    '@AcmeDemoBundle/Resources/public/js/submodule2_B.js'
    '@AcmeDemoBundle/Resources/public/js/submodule3_B.js'
    output='js/module_B.js'
%}
    {% if myVar == "B" %}
        <script src="{{ asset_url }}"></script>
    {% endif %}
{% endjavascripts %}

...

Таким образом, каждый модуль будет выгружаться при развертывании или динамически обрабатыватьсясборка, И вы можете выбрать, какой модуль будет включен, используя myVar .

Примечание. Я использовал здесь блок javascripts, но он будет работать и со таблицами стилей.

0 голосов
/ 27 ноября 2011

Может быть, я не понял, но ... вы пытаетесь это сделать?

{% stylesheets
    '@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

Потому что, насколько я знаю, строка, переданная в stylesheets, является допустимым выражением Twigтак что вы можете свободно использовать переменную интерполяцию.

В любом случае, я не думаю, что иметь динамические активы - это хорошая практика.Чего именно вы хотите достичь?Там может быть лучшее решение.

...