2011-11-27 64 views
12

有没有办法给一个变量传递给Assetic方法模板传递一个变量到Assetic资产URL中的Symfony2

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

所以我想要做的就是从控制器通过SOMEVAR

+0

使用PHP作为模板语言并编写脚本。否则,在PHP中实现逻辑并将其注入到树枝语言中。 – hakre

回答

18

现在,我认为根本不可能。其原因是Assetic预先运行以转储资产​​,因此它不运行Twig模板来计算变量。如果您在PHP模板中执行此操作,则这可能是相同的。

这意味着运行时变量将不会被计算和展开。因此,如果使用变量,这将无法生成资产。这可能会在将来发生变化,但这会在每次用户请求资产时产生生产开销,因为Assetic需要生成资产。

我知道有可能通过使用Assetic中的代码直接(不是使用AsseticBundle)以编程方式定义和生成资产。您需要进行实验,阅读源代码,并进行试验和错误以解决此问题。

目前几乎没有关于Assetic的文档。我可以给的唯一链接是在Assetic here的github页面上找到的README。我希望这会很快改变。

希望这会有所帮助。

+0

其中一些成为可能。 [Assetic中的资产变量](http://jmsyst.com/blog/asset-variables-in-assetic)显示在v1.1中,可以使用具有已知可能值集合的变量。 – roverwolf

-1

也许我不明白,但是......你在试图这样做吗?

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

,因为据我所知,传递给stylesheets的字符串是一个有效的嫩枝表达,所以你可以自由地使用变量代换。

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

+1

不!阅读马特的回答 –

+0

嗯,现在有点晚了,但是...感谢提醒! :) –

26

它通过这种方式是可能的:

<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/') }}" /> 
+0

非常好,非常感谢。 –

+5

这不使用'assetic',而是使用symfony的'资产'功能。你不能使用这个过滤器 – gondo

3

为了详细说明Chopchop的回答有点:

首先,你需要包括assetic需要转储所有的文件,因为它需要知道你的需要倾销。您可以以有条件的方式进行操作,即在运行时包含资产本身。

所以首先放在assetic部分:

{% 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) }}" /> 

〜字符只是在嫩枝模板连接运算符。

当然工程与CSS和JS一样。

1

另一种选择,这与选择范围有限(彼得的解决方案并没有在开发模式为我工作)工作原理:

{% 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块,但它与样式表一样工作。