Ако ви следвам правилно:
- Потребителят трябва да посочи начални/крайни дати за заявки за търсене, генерирани от формуляр
- Трябва да потвърдите тези дати, така че например:
- крайна дата след начална дата
- крайна дата не е на векове от началната дата
- Искате грешки при валидиране да се появяват вградени във формуляра (въпреки че това не е запис)
Тъй като искате да потвърдите тези дати, те ще бъдат по-трудни за хващане, когато са прибрани във вашия масив от условия. Предлагам да опитате да ги предадете отделно и след това да се справите с тях по-късно:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Надяваме се, че можете да се справите с всичко останало в beforeFind
филтър:
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;
}
Не съм опитвал да използвам Model::invalidate()
по време на операция за намиране, така че това може дори да не работи. Идеята е, че ако формулярът е създаден с помощта на FormHelper
тези съобщения трябва да се върнат до полетата на формуляра.
Ако не успеете, може да се наложи да извършите тази проверка в контролера и да използвате Session::setFlash()
. ако е така, можете също да се отървете от beforeFind
и поставете BETWEEN
масив от условия с другите ви условия.