将变量传递给Symfony2中的Assetic资产URL

时间:2011-11-27 12:32:12

标签: php symfony assetic

有没有办法将变量传递给模板中的Assetic方法

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

所以我想做的是从控制器传递SOMEVAR

5 个答案:

答案 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表达式,所以你可以自由地使用变量插值。

无论如何,我认为拥有动态资产并不是一个好习惯。你到底想要达到什么目的?可能有更好的解决方案。