我的一条路线定义如下:
society_mybundle_searchpage:
pattern: /search/cp/{cp}
defaults: { _controller: SocietyMyBundle:Search:searchByCP }
所以它需要一个参数:{cp}
。
现在我想创建一个带有输入小部件的表单。所以我的代码是这样的:
<form onsubmit="return search();" action="#">
{{ form_rest(form) }}
</form>
(没什么具体的,我让symfony为我做所有的工作)。请注意,此表单调用JS函数:search()
。所以这是我在twig中的代码:
<script type="text/javascript">
<!--
function verif_formulaire(){
/* some code to get the value of the cp */
...
/* then: */
ss="{{ path('society_mybundle_searchpage', {'cp': '+cp+'}) }}";
return true;
}
-->
</script>
输出结果为:
function verif_formulaire(){
ss="/symfony/web/app_dev.php/pizzas/search/cp/+tt+";
return true;
}
这不是我需要的输出。我希望输出完全像这样:
function verif_formulaire(){
ss="/symfony/web/app_dev.php/pizzas/search/cp/"+tt+"/";
return true;
}
我该怎么办?
答案 0 :(得分:2)
我的解决方案是:在twig中实现自定义url_decode
函数(非常简单)。
然后使用format()
函数。
结果如下:
window.location ="{{ path('my_path', {'cp': "%s" }) | url_decode | format('"+monCP+"') | raw }}";
说明:path('my_path', {'cp': "AAAA" })
会生成类似“/mypath/cp/AAAA/
”的网址,因此path('my_path', {'cp': "%s" })
会生成类似“/mypath/cp/%s/
”的网址
但'%s
'将被转义。所以我通过'| url_decode
'解码它:
path('my_path', {'cp': "%s" }) | url_decode
将生成正确的字符串“/mypath/cp/%s/
”。
然后我使用format()
函数传递一个字符串。
示例:“"/mypath/cp/%s/" | format('OLIVIER')
”会给出“"/mypath/cp/OLIVIER/"
”
所以,在这里,我传递一个特定的字符串:'"+monCP+"'
(仔细注意引号和双引号)。
所以:'"/mypath/cp/%s/" | format('"+monCP+"')
'会给'/mypath/cp/"+monCP+"/
'
最后一个问题:整个字符串再次转义。这一次,经典的“| raw
”就足够了。
因此,总结一下,这个:
var xx ="{{ path('my_path', {'cp': "%s" }) | url_decode | format('"+monCP+"') | raw }}";
将导致完整的普通JavaScript代码:
var xx ="/my-symfony-url/cp/"+monCP+"/";
这可能看起来很复杂,但哇。无需外部JavaScript文件。这就是我想要的。只是纯粹的快速Symfony 2 php生成的缓存。我可以把它变成Twig宏或其他东西。
答案 1 :(得分:0)
我可以看到你需要在JS中生成路由。所以也许你需要一个FOSJsRoutingBundle?