验证和存储复杂多页表单的最佳方法是什么


What is the best approach for validating and storing complex multipage forms?

我正在开发一个非常糟糕的代码库,该代码库是围绕Zend框架(PHP)松形成的,因此不能使用ORM,也不能使用任何其他框架。我尝试使用Zend_Form但我发现文档太稀疏了(我已经开发了带有Zend_Form的小表单,但没有这么大的东西)。

我需要创建一个长表单(6 页长)。用户将能够随心所欲地在每个步骤之间切换,而无需进行任何验证,直到他们尝试提交表单(在我看来不是一个好主意,但这就是规范所说的)。

在该过程结束时,将验证表单,然后将数据拆分为数据库中的多个不同表。哦,只是为了让事情变得有趣:这种形式有三个版本,都在字段上略有改动,没什么大不了的。它们都将数据存储在同一个表中。

那么,最好的方法是什么呢?我应该如何构建它,如果你必须构建这样一个表单,你会怎么做?我正在用PHP编写它,但也想听到其他语言程序员的回应。另外,如果有任何用于构建此类表单的库或工具,我也想听听。

从未使用

ZF 执行此操作,从未仅在提交最后一步时才进行验证,从未使用过用户可以根据需要从一个步骤跳到另一个步骤的多步骤表单(我的意思是从第 1 步跳到第 4 步,例如)。

我做的是一个 5 步形式(在第 3 步中可能有更多的 4 个子步骤)。用户可以一次一步地执行这些步骤,也可以一次返回一个步骤。每个步骤都经过提交和验证 - 直到它有效,用户无法跳转到下一步,但他仍然可以返回 - 插入的值存储在会话中。我创建了一个模型(包含其他子类的结构化类),因此在每个步骤提交并有效后,数据将设置为存储在会话中的此模型中。

如果你需要一个非常大的表单,用户可以根据需要跳过步骤,我会考虑两种方法:

  1. 仅创建一个表单,其中步骤直观地划分为一个选项卡 - 每个选项卡将仅包含相关字段,只有最后一个选项卡将包含提交按钮。其他选项卡将包含一个"下一步"按钮,该按钮只会打开下一个选项卡。字段数量可能存在问题 - 您只能通过 POST 发送有限数量的字段,甚至可以通过 GET 发送更有限数量的字段(对不起,不知道数字)。然后在调用提交后进行验证,然后您可以填写数据库表...
  2. 为每个步骤创建一个表单。创建将存储数据的模型。每个步骤将提交并仅将数据存储到该模型中(最后一步除外 - 这也将调用插入数据的验证) - 而模型将保存在会话中。验证失败时,您将用户重定向到第一个无效步骤,在哪些步骤显示一条消息,数据无效(也直观地使该步骤无效)。如果验证正常,则获取模型并填充数据库表...

无法告诉您这两种方式有多困难,因为我没有使用采埃孚做这样的事情......希望永远不必如此。

我也会考虑与客户交谈并解释说,仅在最后一步进行验证有点愚蠢且用户友好......

我将把它分成几个部分:

表单处理

你在这里有两个主要选择(没有强烈的感觉):

  1. 在一个页面中创建整个表单,并使用JavaScript(或jQuery等库)在表单部分之间移动;或者您也可以在此处进行一些客户端验证。

  2. 每页创建一个表单,让 PHP 处理结转,要么使用会话,要么使用隐藏的输入字段(我个人更喜欢会话)将所有内容保留在表单中。

处理细微的变化可以通过简单地传递第一页中的版本来完成,并通过采用策略模式相应地更改您的表单。

最终提交

为了验证,你可以使用PHP的filter扩展(顺便说一句,默认情况下提供);它非常不错且可扩展。

如果验证失败,最好收集所有错误并向用户显示(可能带有超链接以跳转到各自的部分),而不是只显示第一个错误;在每个部分中,为了便于使用,您可能会再次提及错误(用户讨厌来回跳转)。

变体方面,将整个表单存储在数据库中与显示表单本身没有太大区别。在此处再次使用策略模式。

希望这涵盖了大部分内容,如果您认为我可以改进,请告诉我。

由于无法使用ORM或框架,您可以查看序列化和将对象存储为会话对象。

创建一个"Form"类,其中包含特定于表单的一些属性,并在每次表单提交后设置这些值。