Php Symfony 2:跨重定向保留表单数据

Php Symfony 2:跨重定向保留表单数据,php,forms,symfony,Php,Forms,Symfony,在symfony2应用程序中,我试图实现一个带有搜索框和一些附加过滤器(choice小部件)的表单。搜索框在数据库中查找记录,然后显示有关该记录的详细信息。过滤器用于显示或隐藏某些类型的详细信息 如果找不到任何记录或一条记录,则此操作有效,因为我可以停留在同一控制器和操作中。但是,如果找到多条记录,我将呈现另一个显示选择对话框的模板。列表中的每条记录都是指向原始页面的链接,但以记录id作为参数 当我点击这个链接时,我丢失了表单数据。在此处通过重定向保留表单数据的最佳方式是什么(或有条件地显示选择

在symfony2应用程序中,我试图实现一个带有搜索框和一些附加过滤器(choice小部件)的表单。搜索框在数据库中查找记录,然后显示有关该记录的详细信息。过滤器用于显示或隐藏某些类型的详细信息

如果找不到任何记录或一条记录,则此操作有效,因为我可以停留在同一控制器和操作中。但是,如果找到多条记录,我将呈现另一个显示选择对话框的模板。列表中的每条记录都是指向原始页面的链接,但以记录id作为参数


当我点击这个链接时,我丢失了表单数据。在此处通过重定向保留表单数据的最佳方式是什么(或有条件地显示选择对话框而不重定向)?

您可以单击链接提交表单!您可以在jquery中创建它

$('a.mylink').live('click', function(){
  $('#yourform').submit();
  return false;
});

您可以通过Id作为隐藏输入。

有两种方法。一个简单且易于实现,第二个允许机器人抓取您的搜索结果,但需要更多的时间和外部存储

使用会话对象 Symfony的
会话
对象有一个所谓的存储随机数据的地方。基本上,它是相同的会话参数,但清楚地表明它可以随时删除

更新的指出flashbag只能检索一次。因此,我建议您改用
Session
对象。它作为
session
服务存储在容器中,或者作为
app.session
存储在twig中。会话将在您第一次在其中写入内容时自动启动

如何实施:

  • 用户提交表单
  • 执行实际搜索,同时将搜索参数保存到会话
  • 返回搜索结果后,您将检查此会话并从中检索搜索集

    使用存储 其主要思想是,每一组独特的搜索参数都代表了自己的搜索页面和搜索结果,例如。
    /search?hash=ASIDJA12SLDS5KSK2

    这是什么?它是如何工作的?非常简单:您将每个唯一的搜索参数集存储在db中,并为这组参数存储唯一的哈希。哈希函数不要求是可逆的,但它应该是常量:每组搜索参数应该只有一个常量哈希。否则,您将有两个不同的页面,具有相同的结果,爬行机器人可以将其识别为重复内容

    逻辑如下:

  • 用户提交搜索表单
  • 您可以散列搜索参数并将用户重定向到
    /search?散列=*散列*
  • 您可以根据存储中的哈希值检索搜索参数并执行实际搜索
  • 如果用户导航回搜索结果,他将再次登录到
    /search?hash=*hash*
    。如果您正确执行步骤2和步骤3,您甚至不需要处理此情况


    您可以选择使用可逆哈希算法(例如base64)。在这种情况下,您不需要外部存储,但请确保不会出现过大的url

    我使用jquery 1.10,并且.live()从1.7开始就被弃用,并在1.9中被删除。但是,即使成功了,我也无法做到这一点,因为点击提交表单只会让我回到选择页面。+1:你提到了这一点,但值得明确指出的是,flash消息只保留了一个请求,然后就被删除了。因此,如果用户出于某种原因点击
    F5
    cmd+r
    以重新加载结果页,现有闪存数据将被清除,并且该值将不再可用。谢谢。最新答案