Pada salah satu sistem yang sedang saya bangunkan, user perlu memasukkan tarikh mula dan juga tarikh tamat. Jadi, saya perlu memastikan tarikh mula yang dimasukkan oleh user mestilah lebih kecil atau sama dengan tarikh tamat.
Oleh itu, saya perlu menggunakan callback di dalam form validation tersebut. Ia ada diterangkan di sini
http://ellislab.com/codeigniter/user-guide/libraries/form_validation.html#callbacks.
Di dalam controller saya, saya telah menetapkan kedua-dua field iaitu tarikh mula dan tarikh tamat adalah wajib diisi oleh user. Ia kelihatan seperti ini:
$this->form_validation->set_rules('tarikh_mula', 'Tarikh Mula', 'required');
$this->form_validation->set_rules('tarikh_tamat', 'Tarikh Tamat', 'required');
Untuk membuat semakan seperti yang dinyatakan tadi, saya akan memasukkan satu lagi syarat atau rules ke dalam set_rules bagi tarikh tamat di mana saya namakannya dengan callback_tarikh_check.
$this->form_validation->set_rules('tarikh_tamat', 'Tarikh Tamat', 'required|callback_tarikh_check');
Kemudian, tambahkan satu function di dalam controller tersebut dengan nama tarikh_check (tanpa callback). Di dalam function tersebut saya letakkan kod seperti berikut:
function tarikh_check()
{
list($day, $month, $year) = explode('/', $this->input->post('tarikh_mula'));
if(checkdate($month, $day, $year)):
$tarikh_mula = strtotime($year.'-'.$month.'-'.$day); //yyymmdd
else:
$tarikh_mula = strtotime(date('Y-m-d'));
endif;
list($day, $month, $year) = explode('/', $this->input->post('tarikh_tamat'));
if(checkdate($month, $day, $year)):
$tarikh_tamat = strtotime($year.'-'.$month.'-'.$day); //yyymmdd
else:
$tarikh_tamat = strtotime(date('Y-m-d'));
endif;
if($tarikh_tamat >= $tarikh_mula):
return TRUE;
else:
$this->form_validation->set_message('tarikh_check', 'Tarikh Tamat mesti sama atau lebih besar daripada Tarikh Mula.');
return FALSE;
endif;
}
Saya akan terangkan secara ringkas setiap baris kod di atas...
list($day, $month, $year) = explode('/', $this->input->post('tarikh_mula'));
Oleh kerana input tarikh yang user masukkan adalah dalam format dd/mm/yyyy, maka saya perlu pecahkan ia ke dalam bentuk list supaya mudah saya ubah kepada format lain.
if(checkdate($month, $day, $year)):
Kemudian saya semak sekali lagi sama ada tarikh yang diberikan oleh user itu mengikut format yang betul atau tidak. Jik tidak, maka saya setkan semula tarikh tersebut ke tarikh hari ini. Ini terpulang kepada anda..
$tarikh_mula = strtotime($year.'-'.$month.'-'.$day);
Di sini, saya tukarkan tarikh tersebut ke dalam format time dengan menggunakan fungsi php iaitu strtotime().
Perkara yang sama juga dilakukan bagi tarikh tamat.
if($tarikh_tamat >= $tarikh_mula):
Akhir sekali barulah saya semak dan pastikan tarikh tamat mestilah lebih besar atau sama dengan tarikh mula.
$this->form_validation->set_message('tarikh_check', 'Tarikh Tamat mesti sama atau lebih besar daripada Tarikh Mula.');
Jika tidak, saya setkan mesej ralat supaya user betulkan tarikh tersebut.
Ok, hasilnya adalah seperti dalam gambar di bawah...

Selamat mencuba.