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

时间:2012-05-28 12:57:02

标签: php database forms

我正在开发基于Zend Framework(PHP)的松散形成的非常糟糕的代码库,因此无法使用ORM,也无法使用任何其他框架。我曾尝试使用Zend_Form,但我发现文档太稀疏了(我用Zend_Form开发了一些小形式但没有这么大的东西)。

我需要创建一个长形式(6页长)。用户可以根据需要在每个步骤之间切换,直到他们尝试提交表单(在我看来不是一个好主意,但这是规范所说的)时,可以完全不进行验证。

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

那么,这样做的最佳方法是什么?我应该如何构建它,如果你必须构建这样一个表单你会怎么做?我用PHP编写它,但也希望听到其他语言程序员的回复。此外,如果有任何图书馆或工具来构建这样的表格,我也希望听到这些。

3 个答案:

答案 0 :(得分:1)

从未使用ZF完成此操作,仅在提交最后一步时从未使用验证完成此类表单,从未完成多步骤表单,用户可以根据需要逐步跳转(我的意思是从第1步跳到第4步,例如)。

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

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

  1. 只创建一个表单,其中步骤可视地划分为一个选项卡 - 每个选项卡仅包含相关字段,只有最后一个选项卡将包含提交按钮。其他选项卡将包含“下一步”按钮,该按钮仅打开下一个选项卡。字段数可能存在问题 - 您可以通过POST发送有限数量的字段,通过GET发送更多有限的字段(抱歉,不知道数字)。然后在调用submit之后进行验证,然后您可以填充数据库表...
  2. 为每个步骤创建一个表单。创建一个存储数据的模型。每个步骤都将提交并仅将数据存储到该模型中(最后一步除外 - 这也将调用插入数据的验证) - 而模型将保存在会话中。验证失败时您将用户重定向到第一个无效步骤,显示数据无效的步骤消息(也可以直观地说明这些步骤无效)。如果验证没问题,请取出模型并填写数据库表......
  3. 不能告诉你两种方式都有多难,因为我没有使用ZF做这样的事情......希望永远不会有。

    我还会考虑与客户交谈,并解释只在最后一步验证是有点愚蠢的用户联合国友好...

答案 1 :(得分:0)

我会在几个部分将其分开:

表单处理

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

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

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

  3. 只需传递第一页中的版本并通过采用策略模式相应地更改表单,即可处理轻微的变化。

    最终提交

    对于验证,您可以使用PHP的filter扩展名(默认btw附带);它非常体面和可扩展。

    如果验证失败,最好收集所有错误并将其显示给用户(可能有超链接跳转到各自的部分)而不是仅显示第一个错误;在每个部分你可能会再次提到错误以便于使用(用户不喜欢来回跳转)。

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

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

答案 2 :(得分:0)

由于无法使用ORM或框架而受到限制,因此您可以查看序列化并将对象存储为会话对象。

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