2011-11-20 100 views
2

明显地,我有两个问题。如何验证Codeigniter中的复选框并重新填充已选中

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

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

我控制器

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(); ?> 
+0

我解决了问题,助手和一些调整,但我不明白为什么笨不有一个永久和稳定的解决方案。 – SNaRe

回答

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; ?> /> 

如果你愿意,把它作为一个函数,并把它放在一个帮助文件中。

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表单接口”问题。

+0

我以同样的方式解决了这个问题,但我从来没有遇到原生PHP和html表单的问题。我只用了Codeigniter。 – SNaRe

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 ?> 
0

您可以使用:

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

在控制器,你可以检查一下:

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