1

我正在开发一个非常糟糕的代码库,该代码库围绕 Zend 框架(PHP)松散地形成,因此不能使用 ORM,也不能使用任何其他框架。我曾尝试使用 Zend_Form,但发现文档太少(我使用 Zend_Form 开发了小型表单,但没有这种大小)。

我需要创建一个长表单(6 页长)。用户将能够根据需要在每个步骤之间切换,而无需验证,直到他们尝试提交表单(我认为这不是一个好主意,但这就是规范所说的)。

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

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

4

3 回答 3

1

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

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

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

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

不能告诉你两种方式会有多困难,因为我没有使用 ZF 做这样的事情......希望永远不会。

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

于 2012-05-28T13:17:56.533 回答
0

我将它分成几个部分:

表单处理

您在这里有两个主要选择(一种或另一种没有强烈的感觉):

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

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

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

最终提交

对于验证,您可以使用 PHP 的filter扩展(顺便说一句,默认提供);它相当不错且可扩展。

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

就变化而言,将整个表单存储在数据库中与显示表单本身并没有太大区别。在这里再次使用策略模式。

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

于 2012-05-28T13:16:08.763 回答
0

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

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

于 2012-05-28T13:18:42.680 回答