Symfony2 分页:在超链接中序列化表单

Posted

技术标签:

【中文标题】Symfony2 分页:在超链接中序列化表单【英文标题】:Symfony2 pagination: serializing a form in a hyperlink 【发布时间】:2014-01-07 11:11:55 【问题描述】:

这应该很容易,但找不到解决此问题的方法。我想对搜索查询的结果进行分页。用户将使用具有多个条件的表单,他们可以浏览每页的结果页面。

我不想使用 KnpPaginatorBundle,因为搜索会返回数以千计的结果,我不想将它们全部混合。我使用Doctrine paginator,如果搜索条件是硬编码的,则分页部分效果很好。

我的问题是 next page 按钮是一个传递正确 page GET 变量的超链接,而我正在努力传递链接中的搜索条件.

提交时表单运行良好,所有条件都通过 GET 或 POST 传递,具体取决于我的配置,并且当我调用 $form->handleRequest() 时表单数据会更新。我希望能够在我的 下一页 超链接上使用相同的 GET 变量,这样handleRequest 将允许我获取搜索条件,并在每个页面上显示搜索表单页面,显示正确。

如何生成 url 编码字符串以添加到 下一页 超链接?我也愿意找到更好的解决方案来保留每个页面之间的搜索条件,但无法在会话中保存它们。

【问题讨论】:

出于好奇,为什么不能在会话中保存搜索条件? 有两个主要理由:首先是我们需要在浏览器的不同选项卡中同时进行搜索(可以通过某种搜索键来克服跨标签会有所不同,但对我来说这听起来更像是一种黑客攻击)。出于第一个原因,我们尽量避免会话。其次,我们需要链接是可共享的。 【参考方案1】:

我猜你正在使用 Symfony 路由器来生成你的上一页和下一页 URL。因此,您只需将您的搜索条件作为附加参数。由于这些条件不是路由参数,Symfony 会将它们放在 GET 参数中。

$this->get('router')->generate('search_page', $criteria, true);

http://symfony.com/doc/current/book/routing.html#generating-absolute-urls

【讨论】:

我不知道,非常少!由于我的表单有实体字段,我应该有一些代码来将表单数据(将包含一个实体)转换为更适合路由器的东西(带有 id)。我希望存在$form->handleRequest() 的“反向”功能,但显然没有。 您的意思是$form->getData() 将您的表单数据作为数组返回吗? 是的,这就是我想做的:首先$data = $form->getData()。由于我的表单有类似'$builder->add('product','entity',array('class'=>'MyBundle:Product','property'=>'name')); 的内容,$data 将包含一个以实体为值的关联数组。然后我会在这个数组上循环,用它们的 ID 替换实体,并将结果数组传递给路由器。有没有更简单的方法? 这是我能看到的唯一方式:)

以上是关于Symfony2 分页:在超链接中序列化表单的主要内容,如果未能解决你的问题,请参考以下文章

鼠标悬停时如何将url隐藏在超链接中

在超链接中传递参数/数据 - laravel Blade

R在超链接中添加变量

如何在超链接函数中连接字符串

自链接在超媒体 API 中的重要性是啥?

如何在超链接单击 [重复] 上将浏览器从 IE 更改为 Chrome