Nếu tôi sau bạn một cách chính xác:
- Người dùng phải chỉ định bắt đầu/ngày kết thúc để tìm các truy vấn được tạo ra từ một hình thức
- Bạn cần phải xác nhận những ngày này sao cho, ví dụ:
- ngày kết thúc sau ngày bắt đầu
- ngày kết thúc không nhiều thế kỷ xa ngày bắt đầu
- Bạn muốn các lỗi xác thực xuất hiện bên trong biểu mẫu (mặc dù đây không phải là sự lưu)
Vì bạn muốn xác thực những ngày này, chúng sẽ khó lấy khi chúng được giấu trong mảng điều kiện của bạn. Tôi đề nghị cố gắng để vượt qua những ở riêng biệt và sau đó đối phó với chúng sau:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Bạn hy vọng sẽ có thể xử lý mọi thứ khác trong beforeFind
lọc:
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;
}
tôi đã không cố gắng sử dụng Model::invalidate()
trong một hoạt động tìm kiếm, vì vậy điều này có thể thậm chí không hoạt động. Ý tưởng là nếu biểu mẫu được tạo bằng cách sử dụng FormHelper
, những thông báo này sẽ làm cho nó trở lại bên cạnh các trường biểu mẫu.
Nếu không, bạn có thể cần thực hiện xác thực này trong bộ điều khiển và sử dụng Session::setFlash()
. nếu có, bạn cũng có thể loại bỏ beforeFind
và đặt mảng điều kiện BETWEEN
với các điều kiện khác của bạn.