Se estou te seguindo corretamente:
- O usuário deve especificar as datas de início/término das consultas de busca geradas a partir de um formulário
- Você precisa validar essas datas para que, por exemplo:
- data de término após a data de início
- data de término não há séculos da data de início
- Você deseja que os erros de validação apareçam embutidos no formulário (mesmo que isso não seja um salvamento)
Como você deseja validar essas datas, elas serão mais difíceis de pegar quando estiverem escondidas dentro do seu array de condições. Sugiro tentar passá-los separadamente e depois lidar com eles mais tarde:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Você deve ser capaz de lidar com todo o resto no
beforeFind
filtro: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;
}
Eu não tentei usar
Model::invalidate()
durante uma operação de busca, então isso pode nem funcionar. A ideia é que se o formulário for criado usando FormHelper
essas mensagens devem retornar ao lado dos campos do formulário. Caso contrário, você pode precisar realizar essa validação no controlador e usar
Session::setFlash()
. em caso afirmativo, você também pode se livrar do beforeFind
e coloque o BETWEEN
array de condições com suas outras condições.