Jika saya mengikuti Anda dengan benar:
- Pengguna harus menentukan tanggal mulai/berakhir untuk menemukan kueri yang dihasilkan dari formulir
- Anda perlu memvalidasi tanggal ini, misalnya:
- tanggal akhir setelah tanggal mulai
- tanggal akhir tidak beberapa abad lagi dari tanggal mulai
- Anda ingin kesalahan validasi muncul sebaris dalam formulir (meskipun ini bukan penyimpanan)
Karena Anda ingin memvalidasi tanggal-tanggal ini, tanggal-tanggal tersebut akan lebih sulit diperoleh ketika disimpan di dalam larik kondisi Anda. Saya sarankan untuk mencoba menyampaikan ini secara terpisah dan kemudian menanganinya nanti:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Semoga Anda dapat menangani semua hal lain di beforeFind
filter:
public function beforeFind() {
// perform query validation
if ($queryData['dateRange']['end'] < $queryData['dateRange']['start']) {
$this->invalidate(
/* end_date field name */,
"End date must be after start date"
);
return false;
}
/* repeat for other validation */
// add between condition to query
$queryData['conditions'][] = array(
'Model.dateField BETWEEN ? AND ?' => array(
$queryData['dateRange']['start'],
$queryData['dateRange']['end'],
),
);
unset($queryData['dateRange']);
// proceed with find
return true;
}
Saya belum mencoba menggunakan Model::invalidate()
selama operasi pencarian, jadi ini mungkin tidak berhasil. Idenya adalah jika formulir dibuat menggunakan FormHelper
pesan-pesan ini akan muncul kembali di sebelah kolom formulir.
Jika gagal, Anda mungkin perlu melakukan validasi ini di pengontrol dan menggunakan Session::setFlash()
. jika demikian, Anda juga dapat menyingkirkan beforeFind
dan letakkan BETWEEN
array kondisi dengan kondisi Anda yang lain.