如何在JavaScript函数中创建带参数的动态路由?

时间:2013-02-23 14:04:55

标签: symfony routing twig

我的一条路线定义如下:

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;
}

我该怎么办?

2 个答案:

答案 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