Hvis jeg følger dig rigtigt:
- Brugeren skal angive start-/slutdatoer for søgeforespørgsler genereret fra en formular
- Du skal validere disse datoer, så du f.eks.:
- slutdato efter startdato
- slutdato ikke århundreder væk fra startdato
- Du ønsker, at valideringsfejl skal vises inline i formularen (selvom dette ikke er en lagring)
Da du ønsker at validere disse datoer, vil de være sværere at få fat i, når de er gemt væk inde i dit betingelser. Jeg foreslår, at du prøver at videregive disse separat og derefter behandle dem senere:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Du skulle forhåbentlig være i stand til at håndtere alt andet 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;
}
Jeg har ikke prøvet at bruge Model::invalidate()
under en søgeoperation, så det virker måske ikke engang. Ideen er, at hvis formularen er oprettet ved hjælp af FormHelper
disse meddelelser skulle komme tilbage ved siden af formularfelterne.
Hvis det ikke sker, skal du muligvis udføre denne validering i controlleren og bruge Session::setFlash()
. hvis ja, kan du også slippe af med beforeFind
og indsæt BETWEEN
tilstand array sammen med dine andre betingelser.