Si te estoy siguiendo correctamente:
- El usuario debe especificar fechas de inicio/finalización para encontrar las consultas generadas a partir de una forma
- Es necesario validar estas fechas de manera que, por ejemplo:
- fecha de finalización después de la fecha de inicio
- fecha de finalización no siglos de distancia de la fecha de inicio
- desea que los errores de validación aparecen en línea dentro de la forma (a pesar de que esto no es una salvación)
Desde desea validar estas fechas van a ser más difíciles de agarrar cuando se encuentran escondidos dentro de su gama condiciones. Sugiero tratando de pasar éstos por separado y luego tratar con ellos más adelante:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Si todo funciona correctamente será capaz de manejar todo lo demás en el 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;
}
no he intentado usar Model::invalidate()
durante una operación de búsqueda, por lo que esto podría no funcionar. La idea es que si el formulario se crea usando FormHelper
, estos mensajes deben volver al lado de los campos del formulario.
Si falla, es posible que deba realizar esta validación en el controlador y usar Session::setFlash()
. Si es así, también puede deshacerse del beforeFind
y poner el conjunto de condiciones BETWEEN
con sus otras condiciones.