English 中文(简体)
验证和储存复杂的多页表格的最佳办法是什么?
原标题:What is the best approach for validating and storing complex multipage forms?

我正在开发一个非常糟糕的代码基,即Zend Frame框架(PHP)周围形成的“它们”),这样ORMs就不能使用,任何其他框架也不能使用。我试图使用Zend_Form,但发现文件太少(我与Zend_Form开发了小表格,但没有如此大)。

我需要创建长的表格( 6页长 ) 。 用户在试图提交表格之前, 可以在每一步之间转换, 完全没有验证( 在我看来这不是个好主意,

进程结束时, 表格将被验证, 然后数据将分解成数据库中的若干不同表格。 哦, 只是为了取笑事情: 这个表格有三个版本, 全部在字段上稍有改动, 没有什么重要内容 。 它们都将数据存储在同一表格中 。

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

最佳回答

从未使用 ZF 完成此操作, 也从未在提交最后一步时以验证方式完成此格式, 也从未使用多步格式, 用户可以随心所欲地从一步跳到一步( 我的意思是从第一步跳到第四步, 例如, ) 。

我所做的是5步表(第4步中可能有更多3个子步骤)。用户可以一步一步地跟踪步骤,也可以一步地返回一步。每个步骤都是提交和验证的,直到有效用户无法跳到下一个步骤,但他仍然可以返回——在会话中储存了所插入的值。我创建了一个模型(结构级,包含其他子类),这样每一步都提交并有效,数据就会被设置到这个在会话中存储的模型中。

如果你需要一个非常大的表格 用户可以随心所欲地跳跃一步步, 我会考虑两种方式:

  1. Create just one form with steps visually divided into a tabs - each tab will contain only related fields and only the last tab will contain the submit button. Other tabs will contain a "next" button that will only open the next tab. There could be a possible problem with the number of fields - You can send only limited amount of fields through POST and even more limited amount of fields through GET (sorry, don t know the numbers). Then after submit is invoked a validation takes place and then You can just fill the DB tables...
  2. Create a form for each step. Create a model that will store the data. Each step will submit and only store the data into that model (except the last step - this will also invoke validation of inserted data) - while model will be saved within session. When validation fails You will redirect user to the first invalid step, display a message at what steps the data is invalid (also visually make that steps invalid). If the validation is OK, take the model and fill the DB tables...

无法告诉你两条路会有多困难,因为我没有用ZF做这种事...

我也会考虑与客户交谈, 并解释只有最后一步才确认为愚蠢, 用户「强」/「强」/「强」方便...

问题回答

我把它分成几个部分:

< 强度 > 窗体处理

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

  1. 在一页中创建整个窗体, 并使用 JavaScript (或 JavaScript 等库) 在窗体区域之间移动; 您可以选择您也可以在这里做一些客户端验证 。

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

处理微小的变异,只需在第一页将版本转录到第一页,然后通过战略模式对形式作出相应的改变。

<强度>最后提交书

用于验证,您可以使用 PHP s filter 扩展( 默认 btw 驱动); 它非常体面且可扩展 。

如果验证失败, 最好收集所有错误并将其显示给用户( 可能带有超链接跳转到各自的区域), 而不是仅仅显示第一个错误; 在每一节, 您可以再次提及错误, 以便于使用( 用户不愿跳回跳出) 。

在您的数据库中存储整个窗体的变异与显示窗体本身没有多大区别。 在此再次使用策略模式 。

希望这能覆盖大部分 如果你认为我能改进 请告诉我

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

创建一个“ 格式” 类, 包含与您窗体相关的某些属性, 并在每份表格提交后设置这些值 。





相关问题
what is wrong with this mysql code

$db_user="root"; $db_host="localhost"; $db_password="root"; $db_name = "fayer"; $conn = mysqli_connect($db_host,$db_user,$db_password,$db_name) or die ("couldn t connect to server"); // perform query ...

Users asking for denormalized database

I am in the early stages of developing a database-driven system and the largest part of the system revolves around an inheritance type of relationship. There is a parent entity with about 10 columns ...

Easiest way to deal with sample data in Java web apps?

I m writing a Java web app in my free time to learn more about development. I m using the Stripes framework and eventually intend to use hibernate and MySQL For the moment, whilst creating the pages ...

join across databases with nhibernate

I am trying to join two tables that reside in two different databases. Every time, I try to join I get the following error: An association from the table xxx refers to an unmapped class. If the ...

How can I know if such value exists in database? (ADO.NET)

For example, I have a table, and there is a column named Tags . I want to know if value programming exists in this column. How can I do this in ADO.NET? I did this: OleDbCommand cmd = new ...

Convert date to string upon saving a doctrine record

I m trying to migrate one of my PHP projects to Doctrine. I ve never used it before so there are a few things I don t understand. In my current code, I have a class similar to this: class ...

热门标签