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

时间:2013-11-29 13:15:08

标签: php forms symfony

在Symfony 2应用程序中,我正在尝试使用搜索框和一些其他过滤器(选择小部件)实现一个表单。搜索框在数据库中查找记录,然后显示有关该记录的详细信息。过滤器用于显示或隐藏某些类型的详细信息。

如果找不到或找到一条记录,则可以正常工作,因为我可以保持在同一个控制器和操作中。但是,如果找到多个记录,我将呈现一个显示选择对话框的不同模板。列表中的每条记录都是返回原始页面的链接,但记录ID为参数。

当我点击该链接时,我会丢失表单数据。在此处保留表单数据的最佳方法是什么(或有条件地显示没有重定向的选择对话框)?

2 个答案:

答案 0 :(得分:3)

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

使用会话对象

Symfony的Session对象具有所谓的flashbag,您可以在其中存储随机数据。基本上它是相同的会话参数,但清楚地表明它可以在任何时候被删除。

更新 @Darragh指出flashbag只能检索一次。所以我建议您使用Session对象。它存储为容器中的session服务或树枝中的app.session。会话在您第一次写东西时自动启动。

如何实施:

  1. 用户提交表单
  2. 您执行实际搜索并同时将搜索参数保存到会话
  3. 返回搜索结果后,您可以检查此会话并从那里检索您的搜索集。

    使用存储

    主要思想是每组独特的搜索参数代表自己的搜索页面,例如结果,例如 /search?hash=ASIDJA12SLDS5KSK2

    这是什么以及如何运作?非常简单:在db中存储每组唯一的搜索参数以及这组参数的唯一哈希值。散列函数不需要是可逆的,但它应该是常量的:每组搜索参数应该只有一个常量散列。否则,您将拥有2个不同的页面,其结果与抓取机器人可识别为重复内容的结果相同。

    逻辑如下:

    1. 用户提交搜索表单
    2. 您哈希搜索参数并将用户重定向到/search?hash=*hash*
    3. 您根据存储中的哈希检索搜索参数并执行实际搜索
    4. 如果用户导航回搜索结果,他将再次降落到/search?hash=*hash*。如果你正确地执行了第2步和第3步,你甚至不需要处理这种情况。

      您可以选择使用可逆散列算法(例如base64)。在这种情况下,您不需要外部存储,但请确保您不会得到太大的网址

答案 1 :(得分:1)

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

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

你可以将你作为隐藏的输入过去。