Передайте переменную в URL ресурса Assetic в Symfony2
Есть ли способ передать переменную методу Assetic в шаблонах
{% stylesheets
'@SomeExampleBundle/Resources/views/ SOMEVAR /css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Итак, что я хочу сделать, это передать SOMEVAR
с контроллера.
Ответы
Ответ 1
Пока, я не думаю, что это возможно вообще. Причина этого заключается в том, что Assetic
запускается заранее, чтобы сбрасывать активы, поэтому он не запускает шаблон Twig для вычисления переменной. Это, вероятно, то же самое, если вы делаете это в шаблоне PHP.
Это означает, что переменные времени выполнения не будут вычисляться и расширяться. Таким образом, это делает невозможным создание активов, если используется переменная. Это может измениться в будущем, но это может повлечь за собой накладные расходы при производстве каждый раз, когда активы запрашиваются пользователем, поскольку Assetic
должен будет генерировать активы.
Я знаю, что можно программно определять и генерировать актив, используя код, найденный в Assetic
напрямую (не используя AsseticBundle
). Вам нужно будет поэкспериментировать, прочитать исходный код и выполнить проб и ошибок, чтобы решить эту проблему.
В настоящее время практически нет документации по Assetic
. Единственная ссылка, которую я могу дать, - это README
, найденная на странице github Assetic здесь. Я надеюсь, что это скоро изменится.
Надеюсь, что это поможет.
Ответ 2
Это возможно через:
<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/' ) }}" />
Ответ 3
Чтобы немного рассказать о Чопчхопе:
Сначала вам нужно включить все файлы, которые необходимо сбрасывать в assetic, поскольку он должен знать, что вам нужно сбросить. То, что вы можете сделать условным образом, - это включение самого актива во время выполнения.
Итак, сначала положите в условленную часть:
{% javascripts
'@ExampleComBundle/Resources/public/js/module1.js'
'@ExampleComBundle/Resources/public/js/module2.js'
%}
{% endjavascripts %}
Теперь вы можете установить необходимое условие. Оба этих script будут сброшены во время развертывания, но вы сможете выбрать во время выполнения, в который можно включить:
<link rel="stylesheet" href="{{ asset('bundles/examplecombundle/js/module' ~ WHICH_MODULE_TO_INCLUDE ~ '.js ) }}" />
Символ ~ - это просто оператор конкатенации в шаблонах Twig.
Работает, конечно же, с CSS и JS.
Ответ 4
Другая альтернатива, которая работает с ограниченным диапазоном опций (решение Piotr не работает для меня в режиме dev):
{% 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 %}
...
Таким образом, каждый модуль будет сбрасываться при развертывании или динамически обрабатываться assetic, и вы можете выбрать, какой модуль будет включен, используя myVar.
Примечание. Здесь я использовал блок javascripts, но он будет работать с таблицами стилей.
Ответ 5
Возможно, я не понял, но... вы пытаетесь это сделать?
{% stylesheets
'@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
Поскольку, насколько мне известно, строка, переданная в stylesheets
, является допустимым выражением Twig, поэтому вы можете использовать переменную интерполяцию.
В любом случае, я не считаю хорошей практикой иметь динамические активы. Чего именно вы хотите достичь? Может быть лучшее решение.