【问题标题】:How to create dynamic route with parameter in a JavaScript function?如何在 JavaScript 函数中创建带参数的动态路由?
【发布时间】:2013-02-23 14:04:54
【问题描述】:

我的一条路线是这样定义的:

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()。所以这是我在树枝中的代码:

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

我该怎么做?

【问题讨论】:

  • path 函数总是对 url 进行编码。为了实现您想要做的事情,您必须做一些工作来创建一个新的url_decode 函数或等效函数。这应该会有所帮助:stackoverflow.com/questions/10633676/…

标签: symfony routing twig


【解决方案1】:

我的解决方案是:在 twig 中实现自定义 url_decode 函数(非常简单)。

然后使用format() 函数。

结果如下:

window.location ="{{ path('my_path', {'cp': "%s" }) | url_decode | format('"+monCP+"') | raw }}";

解释:path('my_path', {'cp': "AAAA" }) 将生成一个类似“/mypath/cp/AAAA/”的 URL,因此 path('my_path', {'cp': "%s" }) 将生成一个类似“/mypath/cp/%s/”的 URL

但是 '%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 宏之类的。

【讨论】:

    【解决方案2】:

    正如我所见,您需要在 JS 中生成路由。所以也许你需要FOSJsRoutingBundle

    【讨论】:

    • 嗨,谢谢你的回答,但我有两个问题:(1)它是 symfony 2.0,我很惊讶我们必须安装外部东西才能生成 URL JS 代码 (2) 我在 github.com/FriendsOfSymfony/FOSJsRoutingBundle/blob/master/… 的任何地方都没有找到该捆绑包的用法,它可以输出除“硬编码”值之外的其他内容(在链接 i 中搜索“你可以做:”提供)。也许这是唯一的解决方案,但我不知道如何使用它。
    • 我想问你,也许在这里,给我一个“动态”JavaScript 树枝模板的样本,它可以输出像ss="/symfony/web/app_dev.php/pizzas/search/cp/ 这样的行 "+tt+" /";
    • 我期待函数 path 的行为非常接近 sprintf() 函数...
    • 实际上,如果我执行{% set txt = '"+tt+"' %} 然后{{ txt|raw }} 之类的操作,它会正确输出"+tt+"。所以我与ss="{{ path('my_path', {'cp': txt }) }}"; 之类的东西非常接近,但它仍然逃脱了输出,给出了ss="/[blabla]/cp/%22+tt+%22";。我几乎在所有地方都尝试过|raw...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多