【问题标题】:Symfony 2: Keep form data across redirectSymfony 2:跨重定向保留表单数据
【发布时间】:2013-11-29 13:15:07
【问题描述】:

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

如果没有找到或找到一条记录,这会起作用,因为我可以留在同一个控制器和操作中。但是,如果找到多个记录,我会渲染一个显示选择对话框的不同模板。列表中的每条记录都是返回原始页面的链接,但以记录 ID 作为参数。

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

【问题讨论】:

    标签: php forms symfony


    【解决方案1】:

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

    使用会话对象

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

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

    如何实现:

    1. 用户提交表单
    2. 您执行实际搜索并同时将搜索参数保存到会话

    返回搜索结果后,您检查此会话并从那里检索您的搜索集。

    使用存储

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

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

    逻辑如下:

    1. 用户提交搜索表单
    2. 你散列搜索参数并将用户重定向到/search?hash=*hash*
    3. 您根据哈希从存储中检索搜索参数并执行实际搜索

    如果用户导航回搜索结果,他将再次登陆/search?hash=*hash*。如果您正确执行步骤 2 和 3,您甚至不需要处理这种情况。

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

    【讨论】:

    • +1:您提到了这一点,但值得注意的是,Flash 消息会针对恰好一个请求进行持久化,然后将其删除。因此,如果用户出于某种原因点击F5cmd+r 重新加载结果页面,则会清除现有的闪存数据,并且该值将不再可用。
    • 谢谢。更新答案
    【解决方案2】:

    您可以点击链接提交表单!你可以在jquery中制作它

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

    您可以将您的 ID 作为隐藏输入。

    【讨论】:

    • 我使用 jquery 1.10 并且 .live() 自 1.7 以来已被弃用,并在 1.9 中被删除。但即使它有效,我也无法这样做,因为点击提交表单只会让我回到选择页面。
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2015-02-05
    • 2020-11-08
    相关资源
    最近更新 更多