有没有办法将变量传递给模板中的Assetic方法
{% stylesheets
'@SomeExampleBundle/Resources/views/ SOMEVAR /css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
所以我想做的是从控制器传递SOMEVAR
。
答案 0 :(得分:25)
可以通过这种方式:
<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/' ) }}" />
答案 1 :(得分:18)
目前,我认为根本不可能。这背后的原因是Assetic
预先运行以转储资产,因此它不会运行Twig模板来计算变量。如果你在PHP模板中这样做,这可能是相同的。
这意味着不会计算和扩展运行时变量。因此,如果使用变量,则无法生成资产。这可能在将来发生变化,但每次用户请求资产时都会产生生产开销,因为Assetic
需要生成资产。
我知道可以通过直接使用Assetic
中的代码(而不是使用AsseticBundle
)以编程方式定义和生成资产。您将需要进行实验,阅读源代码,并进行试验和错误以解决此问题。
目前在Assetic
上几乎没有任何文档。我能给出的唯一链接是在Assetic here的github页面上找到的README
。我希望这会很快改变。
希望这有帮助。
答案 2 :(得分:3)
详细说明Chopchop的回答:
首先,您需要包含资产需要转储的所有文件,因为它需要知道您需要转储的内容。您可以以条件方式制作的是在运行时包含资产本身。
首先介绍资产部分:
{% 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一样。
答案 3 :(得分:1)
另一种选择,适用于有限范围的选项(Piotr的解决方案在开发模式下对我没有用):
{% 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块,但它与样式表的作用相同。
答案 4 :(得分:-1)
也许我不明白,但是......你想要这样做吗?
{% stylesheets
'@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
因为据我所知,传递给stylesheets
的字符串是一个有效的Twig表达式,所以你可以自由地使用变量插值。
无论如何,我认为拥有动态资产并不是一个好习惯。你到底想要达到什么目的?可能有更好的解决方案。