循环遍历一系列复选框并插入值

时间:2013-04-25 21:25:21

标签: php jquery arrays foreach checkbox

第一次发帖,希望一切顺利:)

已经有一段时间了,但基本上我正在做这样的事情:http://drupal.org/project/fancycheckboxes

我需要为我正在循环的每个复选框设置一个yes / no的值,现在它可以工作,但是当我更改一个时,它会改变所有值。

我的foreach循环:

  <?php $object = new stdClass(); $i = 0; ?>
<?php foreach( $filters as $key => $value ) {
    ?>
    <tr>
        <td><label for="show_filter">Show <?php echo $object->$key = $value['filter']; ?> Filter</label></td>        
        <td><input type="checkbox" class="show_filter" <?php //if ( $row['active_filter'] === 'yes' ) { ?>checked="checked"<?php //} ?> name="dp_show_filter" value="<?php echo $object->$key = $value['active_filter']; ?>"/><?php echo $object->$key = $value['active_filter']; ?></td>
        <td><a class="button-primary" href="?page=profolio_theme&del=<?php echo $row['id'];?>">Delete</a></td>
    </tr>
    <?php
    $i++;
}

和我的jQuery:

jQuery(document).ready(function(e) {
    var $ = jQuery.noConflict();

        $i = 0;
        customCheckbox = $('.dp_wrap input[type="checkbox"]');
        showFilter = $('.dp_wrap input[name="dp_show_filter"]');
        values = [];

            return customCheckbox.each(function() {

                // the element
                var el = this;

                // Hide checkbox
                $(this).hide();

                // Replace element
                var rep = $('<a href="#"><span></span></a>').addClass('dp-checkbox').insertAfter(this);

                // default state
                if( $(showFilter).val() === 'yes'){
                        $(showFilter).prop('checked', true);
                        $(rep).removeClass('off').addClass('on');
                    } else {
                        $(showFilter).prop('checked', false);
                        $(rep).removeClass('on').addClass('off');
                    }
                if($(this).is(':checked') ) {
                    $(rep).addClass('on');
                } else {
                    $(rep).addClass('off');
                }

                // Click event
                $(rep).click(function(e) {

                    e.preventDefault();

                    if( $(el).is(':checked') ) {

                        values.push($(showFilter).val('no'), ++$i);

                        $(el).prop('checked', false);
                        $(rep).removeClass('on').addClass('off');
                    } else {

                        values.push($(showFilter).val('yes'), ++$i);

                        $(el).prop('checked', true);
                        $(rep).removeClass('off').addClass('on');
                    }
                });
            });
});

当前我的值是以是/否发布到数据库。

非常感谢任何帮助,我希望我的第一篇文章是可以接受的。

2 个答案:

答案 0 :(得分:0)

它正在更改所有值,因为它看起来好像为页面上创建的每个checkbox指定了相同的名称。

您可以将PHP代码更改为更像这样的内容:

<?php $object = new stdClass(); $i = 0; ?>
<?php foreach( $filters as $key => $value ) {
?>
<tr>
    <td><label for="show_filter">Show <?php echo $object->$key = $value['filter']; ?> Filter</label></td>        
    <td><input type="checkbox" class="show_filter" <?php //if ( $row['active_filter'] === 'yes' ) { ?>checked="checked"<?php //} ?> name="dp_show_filter_<?php echo $row['id'] ?>" value="<?php echo $object->$key = $value['active_filter']; ?>"/><?php echo $object->$key = $value['active_filter']; ?></td>
    <td><a class="button-primary" href="?page=profolio_theme&del=<?php echo $row['id'];?>">Delete</a></td>
</tr>
<?php
$i++;
}

然后将default state更改为此,并从中删除if语句:

// default state
if( $(this).val() === 'yes'){
    $(this).prop('checked', true);
    $(rep).removeClass('off').addClass('on');
} else {
    $(this).prop('checked', false);
    $(rep).removeClass('on').addClass('off');
}

我很确定这会解决您描述的问题。没有更完整的代码示例,很难说清楚。

答案 1 :(得分:0)

您使用customCheckbox遍历each数组,但在循环中,您可以访问$(showFilter),这是一个全局数组。

您的意思是$(showFilter[i])吗?

each回调接收i(循环中的索引)作为参数:

return customCheckbox.each(function(i) {
    ...

    if( $(showFilter[i]).val() === 'yes'){ ...