如何处理包含重复字段的动态表单数据?

时间:2015-10-23 作者:CA_

我正在尝试为列表站点创建一个具有可复制部分的表单。它应该是这样工作的:

从一个列表表单开始,填写表单,单击“添加另一个”,会出现另一组重复的表单字段(通过jQuery)我正在用jQuery复制DOM元素,类似于this demo by Tristan Denyer.

我正在使用这个基本的概念验证测试代码来查看如何使用顺序ID或非顺序ID循环DOM元素。注意:我知道没有安全性或验证,只是尝试让这个循环工作

This is with a sequential ID:

<form action="" id="testForm" method="POST">


<input type="text" id="testField_1" name="testField_1">
<input type="text" id="testField_2" name="testField_2">
<button type="submit">Submit!</button>


</form>


<?php 

   $testArray = array( $_POST[\'testField_1\'], $_POST[\'testField_2\'] );

    foreach( $testArray as $value ) {

    $post_information = array(
    \'post_title\' =>  $value,
    \'post_status\'=>\'draft\',
    \'post_type\' => \'apu\' );

wp_insert_post( $post_information );


    }
Results: 它是有效的,创建了两个帖子,每个帖子都有一个在表单中完成的帖子标题,但是,如果我有10个重复的部分,每个部分都有自己的一组大约20个元字段,那么testArray将很快成为一个巨大的数组,只需伴随序列ID。我觉得foreach循环不需要序列ID,所以我只需要创建一组输入的数组,然后在每组之间循环。

Here\'s my attempt without sequenced IDs

        <form action="" id="testForm" method="POST">


    <input type="text" id="testField" name="testField">
    <input type="text" id="testField" name="testField">
    <button type="submit">Submit!</button>


    </form>


    <?php 

       $testArray = array( $_POST[\'testField\'] );

        foreach( $testArray as $value ) {

        $post_information = array(
        \'post_title\' =>  $value,
        \'post_status\'=>\'draft\',
        \'post_type\' => \'apu\' );

    wp_insert_post( $post_information );


        }
Results: 这只会创建一篇帖子,帖子的标题始终是第二个字段的数据。未创建第一篇帖子。

如果没有一个充满各种可能的ID的数组,我如何创建每个字段集的帖子

1 个回复
最合适的回答,由SO网友:Aric Watson 整理而成

在第二个场景中,您将获得唯一的第二个标题,因为您需要为每个字段指定唯一的字段名,否则其中一个将覆盖$_POST.

解决此问题的一种方法是使用一个名为maybe的隐藏字段max_id 其中存储了在表单上使用的最高id号,因此它从1开始,每次加载另一组表单字段时,jquery都会递增。

然后,您的php读取该字段,并执行基本的for循环,从1开始到max_id 已提交并从中读取表单数据$_POST. 它看起来像这样:

$max = $_POST[\'max_id\'];

for ($i=1; $i <= $max; $i++) { 
    $field_key = \'testfield_\' . $i;
    // process the form data here...
    // you can add suffix to $field_key if you\'re working with more than just a title field
    // i.e. $some_field = $_POST[$field_key . \'_some_field\']
    // which would correspond to $_POST[\'testfield_1_some_field\'], $_POST[\'testfield_2_some_field\'], etc
}

Second scenario

如注释中所述,您需要允许使用非连续的表单字段ID。在这种情况下,我会使用不同的方法。设置一个隐藏字段并使用它存储表单字段ID(只需数字即可),并在添加/删除新字段集时通过jQuery适当地更新此字段。例如,当表单由PHP提交和处理时,您可能会得到如下结果:<input type="hidden" name="field_ids" value="1,2,3,5,7" />

然后,您的PHP需要获取这个隐藏字段的值,并适当地循环遍历字段:

$field_ids = explode(\',\', $_POST[\'field_ids\']);
foreach ($field_ids as $id) { 
    $field_key = \'testfield_\' . $i;
    // use the fieldkey to access values in $_POST as need be.
}

相关推荐

提交后重力表单-GFFormsModel::UPDATE_LEAD_FIELD_VALUE?

我在研究重力形态。此代码处理以下几个问题:add_action(\'gform_after_submission_14\', \'post_contract_update\', 10, 2); function post_contract_update($entry, $form) { $form =\'3\'; $lead = $entry[\'4\']; $statusvalue_update = \'Under Contract\';