Подтвердить что ты не робот

Передайте переменную в URL ресурса Assetic в Symfony2

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

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

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

4b9b3361

Ответ 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, поэтому вы можете использовать переменную интерполяцию.

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