Om jag följer dig rätt:
- Användaren måste ange start-/slutdatum för sökfrågor som genereras från ett formulär
- Du måste validera dessa datum så att till exempel:
- slutdatum efter startdatum
- slutdatum inte århundraden från startdatumet
- Du vill att valideringsfel ska visas inline i formuläret (även om detta inte är en lagring)
Eftersom du vill validera dessa datum blir de svårare att få tag på när de är undangömt i din villkorsuppsättning. Jag föreslår att du försöker skicka in dessa separat och sedan ta itu med dem senare:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Du bör förhoppningsvis kunna hantera allt annat i beforeFind
filter:
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;
}
Jag har inte testat att använda Model::invalidate()
under en sökoperation, så det kanske inte ens fungerar. Tanken är att om formuläret skapas med FormHelper
dessa meddelanden bör komma tillbaka bredvid formulärfälten.
Om det misslyckas kan du behöva utföra denna validering i styrenheten och använda Session::setFlash()
. i så fall kan du också bli av med beforeFind
och sätt BETWEEN
condition array tillsammans med dina andra villkor.