在动态添加和删除字段后重新编号表单输入数组


Renumbering form input array after dynamically adding and removing fields

我正在创建一个WordPress小部件,在小部件后端,我赋予了添加和删除输入字段块的能力。我有能力添加和删除大部分工作。我的问题是,当我试图重新编号字段名称,使他们$_POST作为一个格式良好的数组,从来没有重复的索引。我所尝试的一切都只会引起不同的问题。我目前正在工作的代码是有问题,我不能钉下来。有时,当我添加一个字段时,计数器似乎是成倍的。当我删除一个块并重新计算和编号字段时字段永远不会回到0,甚至1。感觉好像方块被计数了不止一次,或者有些方块被移走了还在计数。

我试着看看源代码,看看是否有更多的块被添加,然后我想,但我猜块我添加这种方式不显示在源代码中,直到小部件已保存。

这是用于和、删除和重新编号的Javascript。

jQuery(document).ready(function() {
    /*--start toplist_widget--*/
    function renumber_blocks() {
        jQuery(".eyenodtoplistitem li").each(function(index) {
            jQuery(this).find("input").each(function() {
               this.name = this.name.replace(/eyenod_toplist'['d+']/, "eyenod_toplist[" + index + "]");   
            });
            jQuery(".eyenodtoplistitem li input[type=hidden]").val(index);
        });
    }
    tl_count = 0;
    jQuery('.toplist-add').unbind('click').bind('click', function(e) {
        var appendhtml = '<li>' + 
                             '<div style="height:20px; background:#EAEAEA;"></div>' + 
                             '<input type="hidden" name="eyenod_toplist[' + tl_count + '][id]" value="' + tl_count + '" />' + 
                             '<label for="eyenod_toplist_imgurl">Image URL:</label><input class="widefat" type="text" name="eyenod_toplist[' + tl_count + '][imgurl]" value="" /><br />' + 
                             '<label for="eyenod_toplist_bonus">Bonus:</label><input class="widefat" type="text" name="eyenod_toplist[' + tl_count + '][bonus]" value="" /><br />' + 
                             '<label for="eyenod_toplist_link">Visit URL:</label><input class="widefat" type="text" name="eyenod_toplist[' + tl_count + '][link]" value="" /><br />' + 
                             '<a class="toplist-remove" href="javascript:void(0);">Delete</a>' + 
                         '</li>';
        jQuery('.eyenodtoplistitem').append(appendhtml);
        renumber_blocks();
        e.preventDefault();
    });
    jQuery(".eyenodtoplistitem").on("click", ".toplist-remove", function (e) {
        jQuery(this).closest("li").remove();
        renumber_blocks();
        e.preventDefault();
    });     
    /*--end toplist_widget--*/
});

这是用于将小部件添加到系统中的表单函数。

public function form( $instance ) {
    if (isset($instance['title'])) {
        $title = $instance['title'];
    } else {
        $title = __('Top List', 'eyenod');
    }
    $instance_eyenod_toplist = array();
    if(isset($instance['eyenod_toplist'])) {
        $instance_eyenod_toplist = unserialize($instance['eyenod_toplist']);
    }
    // Widget admin form
    ?>
    <p>
    <label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'eyenod' ); ?></label> 
    <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
    </p>
    <div class="toplist-field-container">
                <ol class="eyenodtoplistitem" style="padding: 10px 0px;">
        <?php if(!empty($instance_eyenod_toplist)) { ?>
            <?php foreach($instance_eyenod_toplist AS $eyenod_toplist) { ?>
                <li>
                    <div class="handle" style="height:20px; background:#EAEAEA;"></div>
                    <input type="hidden" name="eyenod_toplist[<?php echo $eyenod_toplist['id']; ?>][id]" value="<?php echo $eyenod_toplist['id']; ?>" />
                    <label for="eyenod_toplist_imgurl">Image URL:</label><input class="widefat" type="text" name="eyenod_toplist[<?php echo $eyenod_toplist['id']; ?>][imgurl]" value="<?php echo $eyenod_toplist['imgurl']; ?>" /><br />
                    <label for="eyenod_toplist_bonus">Bonus:</label><input class="widefat" type="text" name="eyenod_toplist[<?php echo $eyenod_toplist['id']; ?>][bonus]" value="<?php echo $eyenod_toplist['bonus']; ?>" /><br />
                    <label for="eyenod_toplist_link">Visit URL:</label><input class="widefat" type="text" name="eyenod_toplist[<?php echo $eyenod_toplist['id']; ?>][link]" value="<?php echo $eyenod_toplist['link']; ?>" /><br />
                    <a class="toplist-remove" href="">[Delete]</a>
                </li>
            <?php } ?>
        <?php } ?>
                </ol>
    </div>
    <div style="padding: 10px 0px;">
        <a class="toplist-add" href="">[Add]</a>
    </div>
<?php 
}

OK,我在测试时放入了一些警告代码,以查看正在循环的HTML,似乎我的代码正在循环不存在的列表项。我不知道为什么会这样。我想再次指出,这一切都是在我的WordPress安装的wp-admin/widgets.php页面上完成的。我可能错了,但这可能很重要。

提前感谢您的帮助。

好的,我已经找到了问题所在。以前我不知道Wordpress在页面左侧的选择区域中存储了一个小部件表单的副本。这是一个没有编号ID的默认版本,但它确实共享您在代码中使用的类等。这就是问题所在,因为我是根据列表的类循环遍历列表项。所以我添加了Wordpress用来给每个小部件一个唯一ID的代码,并内联了我的javascript,这样我就可以使用那个ID作为选择器。这也指出了一些我以前没有注意到的其他问题。然而,我能够解决这些新问题,现在有了工作代码。

对于任何需要知道的人来说,这是让我走上正确轨道的代码。

$this->get_field_id();