Se ti seguo correttamente:
- L'utente deve specificare le date di inizio/fine per le query di ricerca generate da un modulo
- Devi convalidare queste date in modo che, ad esempio:
- data di fine dopo la data di inizio
- data di fine non lontana secoli dalla data di inizio
- Vuoi che gli errori di convalida appaiano in linea all'interno del modulo (anche se questo non è un salvataggio)
Dal momento che vuoi convalidare queste date, saranno più difficili da afferrare quando sono nascoste all'interno dell'array delle condizioni. Suggerisco di provare a passarli separatamente e poi affrontarli in un secondo momento:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Si spera che dovresti essere in grado di gestire tutto il resto in 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;
}
Non ho provato a usare Model::invalidate()
durante un'operazione di ricerca, quindi potrebbe anche non funzionare. L'idea è che se il modulo viene creato utilizzando FormHelper
questi messaggi dovrebbero tornare accanto ai campi del modulo.
In caso contrario, potrebbe essere necessario eseguire questa convalida nel controller e utilizzare Session::setFlash()
. in tal caso, puoi anche sbarazzarti di beforeFind
e inserisci BETWEEN
array di condizioni con le altre condizioni.