有时我们需要将表格分成几个部分(页面),分别处理,然后将它们组合成一个结果。
本文介绍了实现这一目标的方法和设计模式。
注意:
将一个表格分割成多个步骤的问题非常复杂,尤其是如果你想把它做好。在我的一生中,我遇到了许多方法,我将在此讨论。有些方法看起来很吸引人,但很天真,只在特定情况下有效。对于每一种方法,我都会描述它在什么时候有意义,哪些方法没有意义。
通常情况下,目标是在第一页的第一个表单中获取基本数据,对其进行验证,然后将其保存在 "某个地方 "并显示下一页。
当用户到达最后一页时,需要提交整个表格并处理输入。
在每个步骤中,重要的是要始终仔细验证所有的数据,并允许用户随意跳回页面,以便他们在遇到错误时可以纠正回来的数据。此外,如果要根据已经获得的数据有条件地呈现表格,这也是一个非常苛刻的过程。
我们可以自己用纯HTML实现各个表单,然后在PHP中处理,或者使用现成的解决方案,如Nette表单。
生活中的例子:
很多时候,新手程序员给我发电子邮件,问一些看似简单的问题,而这些问题都有现成的解决方案。例如,特别是关于PHP中的表单处理。
我总是建议完全跳过手工处理,而使用现成的解决方案。在现实中,要正确地实现,例如,验证输入的电子邮件和2个字段内的2个密码是否匹配,而我们要根据用户的数据重定向到预先填写的表格,并在出现错误时提供错误信息,这是非常复杂的。
因为人们不知道他们不知道他们不知道,所以他们不愿意投入1个小时的时间来学习一个现成的解决方案来解决99.99%的问题,而是喜欢选择自己的解决方案,他们花了几十个小时来调试,仍然存在表单不工作、抛出错误、有安全漏洞、不能保护输入的数据的情况。
所以这一步的目标是在不同的URL上实现几个页面,这些页面将包含空白表格。
我建议独立实现每个表单(原子),并在不同的应用层处理状态传递。原因是每个表单在实践中都会以不同的方式处理数据验证,以不同的方式编写其输出,以不同的方式处理错误,而且我们很可能想随着时间的推移进行扩展或改变,所以我们不需要知道整个过程的背景,也不需要改变几十个网站来这样做。
在处理第一个表单时,我们希望首先验证收到的数据,如果数据正确,则将用户重定向到第二步。将重定向作为HTTP重定向处理是一个好主意,因为很容易发生数据无效的情况,在这种情况下,我们要将用户返回到第一个表单,而不是下一步。
我们基本上可以用4种方式存储状态。
不建议:
推荐:
上述解决方案中没有一个是完美的,也没有一个是唯一正确的。我自己在研究多步骤的解决方案时,会结合多种方法。例如,通常情况下,我把购物车作为一个数据库表来解决,我把已经收集到的数据分配给它,并把它绑定到一个用户(如果他已经登录)或一个会话(如果他没有登录,我们还不认识对方)。
Jan Barášek Více o autorovi
Autor článku pracuje jako seniorní vývojář a software architekt v Praze. Navrhuje a spravuje velké webové aplikace, které znáte a používáte. Od roku 2009 nabral bohaté zkušenosti, které tímto webem předává dál.
Rád vám pomůžu:
Články píše Jan Barášek © 2009-2024 | Kontakt | Mapa webu
Status | Aktualizováno: ... | zh