映射没有索引的动态复选框数组

时间:2015-02-05 13:31:53

标签: php jquery html dom

这个问题进一步建立在这里提出的问题:How to map dynamic array of input fields

我有一组动态的行,每个行都有自己的输入字段。这些行可以动态添加到DOM中,因此我必须使用没有索引的输入数组(例如fieldname []而不是fieldname [1]等。)

当我在这些行中使用复选框时会出现问题。由于未选中复选框时未提交复选框,因此我认为无法知道哪个提交的复选框属于哪个行值。

我的表格示例:

<form>
<div class="row">
     <input type="text" name="product[]">
     <input type="text" name="qty[]"> 
     <input type="checkbox" name="projectline[]"> 
</div>
<div class="row">
    <input type="text" name="product[]">
    <input type="text" name="qty[]">
    <input type="checkbox" name="projectline[]"> 
</div>
<div class="row">
     <input type="text" name="product[]">
     <input type="text" name="qty[]">
     <input type="checkbox" name="projectline[]"> 
</div>
</form>

我在这里找到了类似问题的答案:php array of checkboxes,但答案显然只适用于带索引的数组。

这里最好的方法是什么?

编辑:

我还检查服务器端错误的表单,如果错误则将其重定向,所以我需要能够重建&#39;表单基于提交的值。

2 个答案:

答案 0 :(得分:0)

我见过的一个技巧是在每个复选框之前放置一个隐藏字段,提交相同字段的值为0.这样,如果选中复选框,它将使用复选框值覆盖0值,但如果你不这样做,你将获得一个未经检查的0而不是数据中的任何内容。

保持运行的索引总数的评论的答案也可以起作用,但是根据DOM的修改方式和时间,它会有点复杂。

答案 1 :(得分:0)

我最终为每个行分配了一个索引号,每次添加一行时都会生成一个新的随机ID。我使用jQuery进行克隆功能和事件绑定。

以下是我的完整解决方案。

这是我原来的表格:

<form>
<div class="row">
 <input type="text" name="product[0]">
 <input type="text" name="qty[0]"> 
 <input type="checkbox" name="projectline[0]"> 
</div>
</form>

我有一个模板行,用于制作克隆:

<div id="templaterow">
 <input type="text" name="product[%%index%%]">
 <input type="text" name="qty[%%index%%]">
 <input type="checkbox" name="projectline[%%index%%]"> 
</div>

克隆行的按钮:

<button id="addrow" value="add new row"/>

一个绑定到按钮的函数:

$('#addrow').on('click',function()
{
    //template row is cloned and given the right attributes:
    var clone = $('#templaterow').clone(true, true);
    $('.row').last().after(clone);
    clone.addClass('row').removeAttr('id');

    // the %%index%% placeholder is replaced by a random index number between 100 and 9999999
    clone.html(function (index, html) {
        var rndIndex = Math.floor((Math.random() * 9999999) + 100);
        return html.replace(new RegExp('%%index%%','g'),rndIndex);
    });
});