2011-11-20 32 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'));