允许用户在运行时向表单添加字段


Allowing users to add fields to a form during run time

我正在修改一个表单组件,它是web应用程序的一部分,以支持用户在运行时添加和删除额外的表单字段。

表单中的数据在提交表单时被设置为一个php对象:

<?php
   class users {
     public function setName($name){
         (...)
     }
     public function getName(){
         (...)
     }
     public function setSomeAttribute($name){
         (...)
     }
     public function getSomeAttribute(){
         (...)
     }
   }

表单生成如下:

$form = new Form();
$form->addField('Text', 'Name', (... some other parameters...))
->addField('Address', 'SomeAttribute', (... some other parameters...));

生成一个视图,其中包含代表每个字段的对象树(一些"字段",如地址,可以包含子字段,如文本输入)。

如果我们知道对象属性的名称,那么表单组件就可以很容易地使用getter和setter将表单字段的结果绑定到相应的对象属性。

我现在面临的问题是:我需要允许用户在运行时添加字段。这可以使用Jquery工作,也可以为没有javascript的用户提供支持。

假设我们有一个用户可以编辑他的个人资料并添加多个送货地址的页面。他会有一个按钮,上面写着"添加地址"。单击此按钮将执行以下操作:

  • 对于启用javascript的用户,用户将立即看到一个新的"地址字段",由几个下拉框和添加的文本字段组成。
  • 对于没有启用javascript的用户,页面将刷新,新的"地址字段"由几个下拉框和文本字段组成。

让PHP知道这些新字段存在并且我们需要从中获取发布的数据的最好方法是什么?

所有表单元素都将在请求中提交并可供PHP使用。因此,您只需要使用元素在表单中分配的任何名称来引用元素。

对于2个地址,您希望将元素命名为"addr_1_country","addr_2_country"或"addr_country[]",以使值在数组中可用。如果你使用前者,你可以循环"addr_$i_country"的名字,直到你发现他们未设置(或者让JQuery更新一个计数值,也被提交,像"addr_count"告诉你循环多长时间)。

无论哪种方式,你只需要知道名字。但如果你只能指定"地址"和/或子字段的名称,你不能给自己分配,那么你可能会有问题。也许你的"->addField()"足够聪明,可以为你命名它们。否则更新"表单"自动命名或接受"name"参数

无论哪种方式,提交时的表单都将在$_REQUEST(即$_GET和$_POST)中填充包含所有表单字段及其必要值的数组。你可以有一个setter函数,它接受这个数组,找到新的内容,并动态地设置它们。

我假设你有一个SET数量的新字段,你可以只是预先为他们做getter和setter,并循环通过$_REQUEST提交在php端,并调用适当的字段setter。

foreach ($_REQUEST[] as $field){ // IF STATEMENT TO DETERMINE WHAT FIELD THIS IS BASED ON FIELD NAME }