如何在Codeigniter中验证复选框表单并重新填充已选中

时间:2011-11-20 00:14:36

标签: forms codeigniter validation

很明显,我有两个问题。

  1. 当我提交一个复选框表格,它是一个数组值和非cheched表单时,它不会显示验证错误,例如“此字段是必需的”。当我检查其中一个时,它显示错误。通常它应该显示我,即使我没有检查表格上的任何内容,只需按提交。

  2. 当我提交为已选中时,如何将复选框重新填充为已选中。像set_value一样思考。在set_value中,它填充以前的数据。如果我已提交,我希望自动检查。

  3. 我的控制器

    function preferences() {
        $user = $this->ion_auth->user()->row();
        $data['first_name'] = $user->first_name;
        $data['last_name'] = $user->last_name;
        $data['user_id'] = $user->id;
        $data['address'] = $this->main_model->office_zip_match($user->zipcode);
    
        $this->form_validation->set_rules('days[]', 'Days', 'required');
        $this->form_validation->set_rules('contact[]', 'Contact', 'required');
    
        if ($this->form_validation->run() == true) {
            echo print_r($this->input->post());
        } else {
            $this->load->view('auth/preferences', $data);
        }
    }
    

    我的观点:

    <div>Days to Deliver</div>
    <?php echo form_open('signup/preferences'); ?>
    <input type="checkbox" name="days[]" value="monday" id="days" /> Monday<br />
    <input type="checkbox" name="days[]" value="tuesday" id="days" /> Tuesday<br />
    <input type="checkbox" name="days[]" value="wednesday" id="days" /> Wednesday<br />
    <input type="checkbox" name="days[]" value="thursday" id="days" /> Thursday<br />
    <input type="checkbox" name="days[]" value="friday" id="days" /> Friday<br />
    <div>How would you like us to contact you? (When package arrives / for all other issues</div>
    <input type="checkbox" name="contact[]" value="email" id="contact" /> Email<br />
    <input type="checkbox" name="contact[]" value="text" id="contact" /> Text<br />
    <input type="checkbox" name="contact[]" value="cell" id="contact" /> Cell<br />
    <div><input type="submit" value="Send" /></div>
    <?php echo form_close(); ?>
    <?php echo validation_errors(); ?>
    

4 个答案:

答案 0 :(得分:1)

问题在于,按规范,浏览器不应为未选中的复选框发送值。根据定义,复选框是可选字段。如果未经检查,该值应该是多少?空值? 0? HTML没有使用复选框的内置处理程序。

但是,有一些解决方法。我喜欢使用javascript来启用隐藏字段,其中包含我想要的“未选中”值。例如(使用jQuery):

<input type="checkbox" name="foo" value="1" />
<script type="text/javascript">
$(function() {
    $('input[name="foo"]').change(function() {
        var $t = $(this);
        if ( !$t.attr('checked'))
        {
            $t.after('<input type="hidden" name="foo" value="0" />');
        }
        else
        {
            $t.next().remove();
        }
    });
});
</script>

这不是一个CI问题,因为它是一个“html表单界面”问题。

答案 1 :(得分:1)

首先;使用自定义callback验证您的复选框,您可以执行任何想要验证内容的内容。

其次;使用if设置 checked =“checked”

$ my_option_values 是复选框选项的哈希数组。

<input type="checkbox" name="my_option[]" value="blah" 
<?php ( in_array('blah', $_POST['my_option']) || in_array('blah', $my_option_values) ) ? print 'checked="checked"' : FALSE; ?> />

如果需要,请将其设为函数并将其放在帮助文件中。

答案 2 :(得分:0)

当您使用表单助手时,您可以使用以下方式。

<?php foreach (array('monday', 'tuesday', 'wednesday', 'thursday', 'friday') AS $day) : ?>
<?php echo form_checkbox('days[]', $day, in_array($day, (array)$this->input->post('days'))) . ucfirst($day) ?><br />
<?php endforeach ?>

<?php foreach (array('email', 'text', 'cell') AS $contact) : ?>
<?php echo form_checkbox('contact[]', $contact, in_array($contact, (array)$this->input->post('contact'))) . ucfirst($contact) ?><br />
<?php endforeach ?>

答案 3 :(得分:0)

您可以使用:

<input type="checkbox" name="mailing_address" value="0" <?php echo set_checkbox('mailing_address', '0'); ?> />

在Controller中,您可以查看它:

var_dump($this->input->post('mailing_address'));