复选框阵列验证Codeigniter

时间:2015-09-29 22:07:11

标签: codeigniter

在我的表单上,每行都有提交按钮,您需要先检查复选框,然后才能将其删除,否则应该通过错误。

问题:我的复选框是in_array,但是如果我没有选中该框,然后按提交,则不会通过codeigniter form_validation错误。我使用了$this->form_validation->set_rules('selected[]', 'Selected', 'required');但错误没有显示出来。

使form_validation错误起作用的最佳解决方案是什么?

查看

<?php echo form_open('admin/design/layout/delete'); ?>
<?php echo validation_errors('<div class="alert alert-danger">', '</div>'); ?>
<div class="table-responsive">
    <table class="table table-striped table-bordered table-hover">
        <thead>
            <tr>
                <td style="width: 1px;" class="text-center">
                    <input type="checkbox" onclick="$('input[name*=\'selected\']').prop('checked', this.checked);" />
                </td>
                <td>Layout Name</td>
                <td class="text-right">Action</td>
            </tr>   
        </thead>
        <tbody>
            <?php if ($layouts) { ?>
                <?php foreach ($layouts as $layout) { ?>
                    <tr>
                        <td class="text-center"><?php if (in_array($layout['layout_id'], $selected)) { ?>
                                <input type="checkbox" name="selected[]" value="<?php echo $layout['layout_id']; ?>" checked="checked" />
                            <?php } else { ?>
                                <input type="checkbox" name="selected[]" value="<?php echo $layout['layout_id']; ?>" />
                            <?php } ?>
                        </td>
                        <td><?php echo $layout['name']; ?></td>
                        <td class="text-right">
                            <button type="submit" class="btn btn-danger">Delete</button>
                            <a href="<?php echo $layout['edit']; ?>" class="btn btn-primary">Edit</a>
                        </td>
                    </tr>
                <?php } ?>
            <?php } else { ?>

            <?php } ?>
        </tbody>
    </table>
</div>

</div>
<?php echo form_close(); ?>

控制器功能

public function delete() {

    $this->load->library('form_validation');

    $this->form_validation->set_rules('selected[]', 'Selected', 'required');

    if ($this->form_validation->run() == FALSE) {
        echo "Error";
        $this->get_list();
    } else {
        $selected_post = $this->input->post('selected');
        if (isset($selected_post)) {
            foreach ($selected_post as $layout_id) {
            }
            echo "Deleted  $layout_id";
            $this->get_list();
        }           
    }
}

1 个答案:

答案 0 :(得分:1)

不会对每个字段进行验证。规则中的selected[]选择器意味着,当您提交表单时,它应该至少是一个选定的项目。现在您已经提交了按钮,这些按钮可以独立提交表单,无论它们在dom中的哪个位置,以及选择了哪些复选框。 目前它是一样的,因为你最后会有一个提交按钮。

我会添加一些javascript,并设置如果未选中该复选框,则可以禁用该字段:

<script>
    $(function() {
        $('input:checkbox').on('change', function() {
            if($(this).is(':checked')) {
                $(this).closest('tr').find('button:submit').prop('disabled', false);
            }
            else {
                $(this).closest('tr').find('button:submit').prop('disabled', true);
            }
        })
    })
</script>

并在提交按钮中添加disabled

<button type="submit" class="btn btn-danger" disabled>Delete</button>

这不是服务器端验证,但您可以实现以防止按下下一个未选中的按钮复选框。