【问题标题】:Massive dynamic form in PHP: The best approach?PHP 中的海量动态表单:最好的方法?
【发布时间】:2009-10-07 06:42:12
【问题描述】:

这个问题可能比 SO 的平均问题要长一些,所以我会尽量缩短:

我正在设计一个用户需要填写和提交的动态表单。这个表格很庞大,有超过 500 个可能的问题。显示给用户的问题取决于先前答案中给出的答案(例如;只有当用户选中“仍在学校”复选框时,才会显示与学校相关的问题页面。)

这个表格有很多要求:

  • 多个页面,可以根据给出的答案“打开或关闭”。
  • 当用户返回并更改特定答案时,将关闭的已填充组需要清空其问题的答案。
  • 有些问题是根据之前给出的答案预先填写的。
  • 需要在每次新页面请求时将表单保存到数据库中,以便用户可以随意暂停并继续填写表单。

解决这个问题的最佳方法似乎是 OO 方法;定义一个接受多个选项(标题、要使用的输入类型、可能的答案等)的类,并相应地构建 HTML。

但是,这种方法的主要问题是,由于问题可以“借用”先前问题的信息,因此仅为要在页面上显示的问题创建一个实例是不够的。事实上,唯一可靠的方法是在每次用户加载新页面时实例化所有可能的问题。

这种方法很可能会扼杀 PHP 的性能;对我来说,这似乎不是正确的 OO 解决方案。

这个问题有更好的解决方案吗?

本质上,我需要一种快速且轻量级的方法来创建包含 500 到 1000 个记录(类实例?)的多维数组,其中大约 10 个将在任何给定时间显示在页面上。强>

我希望将表单存储为 XML 文档,因此在这方面可以很好地工作的任何方法都是首选。

【问题讨论】:

  • 当您说将表单存储为 xml 时,您是指它的结果还是表单结构本身? :S
  • 只是结构;答案将存储在常规数据库中。
  • OO 不是答案。不要以为 OO 可以解决任何问题。
  • 小心假设性能是一个问题。如果表单的流量不高,那么它可能不是问题。话虽如此,您几乎可以肯定不需要每次都加载所有问题。

标签: php oop forms


【解决方案1】:

我将描述一个使用数据库作为存储机制的解决方案,你可以使用任何可行的方法,但这会更容易描述。

开始我会建立一个表格,其中包含调查的所有“页面”。这仅用于对问题进行分组,并定义显示的任何要求

第二次建立一个表格来存储表单中的每个问题。此表应包含有关问题是什么、类型、答案(如果预定义)等的基本信息。以及指定预定义数据(如果是动态的)可能来自何处的任何信息。

第三次构建一个/多个表来保存您的用户数据。

现在您已经处理好所有数据,构建了一个网页,该网页将为表单加载所有用户数据。使用用户数据 + 会话数据来确定需要显示数据库中的“页面”。使用该信息提取正在显示的“页面”的所有问题,并将它们构建为 HTML 表单以显示给用户。您的表单应该提交回自身,可以有多个按钮来控制上一个、下一个功能。如果您的页面在加载时已被提交,您需要存储任何 POSTED 值,然后再将您的用户数据拉出。

这就是我从头开始解决这个问题的方法。您可以将其中的许多部分分解为各种对象,以帮助封装您的数据和功能。但你对我的问题听起来像是你迷失了从哪里开始,所以希望这能帮助你巩固事情。

【讨论】:

  • 虽然您的回答主要描述了我目前正在运行的“工作”原型,但我会将其设置为可接受的答案,因为您对我迷路的评论是正确的;)我仍然有一些棘手的问题需要解决,但其中大多数都值得提出一个新的——更好的表述——问题。
  • 如果您正在寻找面向对象表单的良好示例,SocialAddict 将您指向 ZendForm 是正确的。他们在制作表单 OO 方面做得很好。
【解决方案2】:

如果您能够灵活地使用可以使用的框架,那么通过使用 Zend 框架之类的东西,您可以简化表单的创建和验证的处理。

Zend Forms 是 zend 表单控件内置的一些功能的示例。这使得它变得非常容易,并且获得一些使用 MVC 样式框架的经验并不是一件坏事。

如果您出于某种原因无法使用框架,我建议您编写一个自定义类来处理表单持久性,以便您可以在多个“视图”或“页面”之间传递数据

.NET 使用它的多视图控件非常方便:)

【讨论】:

  • 是否可以在 PHP 中保存对象(类实例)?我正在处理的主要问题是每个请求必须创建多达 1000 个类实例。如果可以以某种方式缓存它(表单结构不会改变,只有答案,因此启用/禁用组会)。 Zend 是否为该问题提供任何解决方案?
  • 为什么需要 1000 个类实例?你创建实例是为了什么?
  • 这些课程的重点是收集所有给定的答案,以及显示每个组的“要求”;有很多数据要比较,肯定会对解析时间产生影响。但是,如果我在睡了一夜之后自己找不到答案,我会单独问这个问题;)
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 2015-11-28
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-08
  • 2015-08-18
  • 2011-10-04
相关资源
最近更新 更多