Если я правильно следую за вами:
- Пользователь должен указать даты начала / окончания для запросов на поиск, сгенерированных из формы
- Вам необходимо проверить эти даты, чтобы, например:
- дата окончания после даты начала
- дата окончания не через столетия от даты начала
- Вы хотите, чтобы ошибки проверки появлялись внутри формы (даже если это не сохранение)
Поскольку вы хотите проверить эти даты, их будет сложнее получить, когда они спрятаны в вашем массиве условий. Я предлагаю попробовать передать их по отдельности, а затем разобраться с ними позже:
$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
с другими вашими условиями.