在Symfony 2应用程序中,我正在尝试使用搜索框和一些其他过滤器(选择小部件)实现一个表单。搜索框在数据库中查找记录,然后显示有关该记录的详细信息。过滤器用于显示或隐藏某些类型的详细信息。
如果找不到或找到一条记录,则可以正常工作,因为我可以保持在同一个控制器和操作中。但是,如果找到多个记录,我将呈现一个显示选择对话框的不同模板。列表中的每条记录都是返回原始页面的链接,但记录ID为参数。
当我点击该链接时,我会丢失表单数据。在此处保留表单数据的最佳方法是什么(或有条件地显示没有重定向的选择对话框)?
答案 0 :(得分:3)
有两种方法。一个简单易行,第二个允许机器人抓取您的搜索结果,但需要更多时间消费,需要外部存储。
Symfony的Session
对象具有所谓的flashbag,您可以在其中存储随机数据。基本上它是相同的会话参数,但清楚地表明它可以在任何时候被删除。 德尔>
更新 @Darragh指出flashbag只能检索一次。所以我建议您使用Session
对象。它存储为容器中的session
服务或树枝中的app.session
。会话在您第一次写东西时自动启动。
如何实施:
返回搜索结果后,您可以检查此会话并从那里检索您的搜索集。
主要思想是每组独特的搜索参数代表自己的搜索页面,例如结果,例如
/search?hash=ASIDJA12SLDS5KSK2
。
这是什么以及如何运作?非常简单:在db中存储每组唯一的搜索参数以及这组参数的唯一哈希值。散列函数不需要是可逆的,但它应该是常量的:每组搜索参数应该只有一个常量散列。否则,您将拥有2个不同的页面,其结果与抓取机器人可识别为重复内容的结果相同。
逻辑如下:
/search?hash=*hash*
如果用户导航回搜索结果,他将再次降落到/search?hash=*hash*
。如果你正确地执行了第2步和第3步,你甚至不需要处理这种情况。
您可以选择使用可逆散列算法(例如base64)。在这种情况下,您不需要外部存储,但请确保您不会得到太大的网址
答案 1 :(得分:1)
您可以点击链接提交表格!你可以在jquery中创建它
$('a.mylink').live('click', function(){
$('#yourform').submit();
return false;
});
你可以将你作为隐藏的输入过去。