【问题标题】:Allowing users to add fields to a form during run time允许用户在运行时向表单添加字段
【发布时间】:2011-10-10 05:18:39
【问题描述】:

我正在修改作为 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 javascript forms


    【解决方案1】:

    所有表单元素都将在请求中提交并可供 PHP 使用。所以你只需要使用在表单中分配的元素名称来引用元素。

    对于 2 个地址的国家/地区,您希望为这两个地址命名为“addr_1_country”、“addr_2_country”或“addr_country[]”等元素,以使值在数组中可用。如果您使用前者,您可以遍历名称“addr_$i_country”,直到发现它们未设置(或让 JQuery 更新也提交的计数值,例如告诉您循环多长时间的“addr_count”)。

    无论哪种方式,您只需要知道名称即可。但是,如果您只能指定“地址”和/或子字段的名称您无法自行分配,那么您可能会遇到问题。也许您的“->addField()”足够聪明,可以为您命名。否则更新“表单”以自动命名或接受“名称”参数。

    【讨论】:

      【解决方案2】:

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

      我假设您有一定数量的新字段,您可以只为它们创建 getter 和 setter,然后在 php 端提交时循环 $_REQUEST 并为正确的字段调用 setter。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-05
        • 1970-01-01
        • 2019-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多