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