Pokud vás sleduji správně:
- Uživatel musí zadat počáteční/koncové datum pro vyhledávací dotazy generované z formuláře
- Je třeba ověřit tato data, aby například:
- datum ukončení po datu zahájení
- datum ukončení není století vzdálené od data zahájení
- Chcete, aby se chyby ověření zobrazovaly přímo ve formuláři (i když se nejedná o uložení)
Vzhledem k tomu, že chcete tato data ověřit, bude těžší je chytit, když jsou schovaná v poli vašich podmínek. Navrhuji pokusit se je předat samostatně a pak se s nimi vypořádat později:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Doufejme, že byste měli být schopni zvládnout vše ostatní v beforeFind
filtr:
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;
}
Nezkoušel jsem použít Model::invalidate()
během operace hledání, takže to ani nemusí fungovat. Myšlenka je taková, že pokud je formulář vytvořen pomocí FormHelper
tyto zprávy by se měly vrátit zpět k polím formuláře.
Pokud se tak nestane, možná budete muset provést toto ověření v ovladači a použít Session::setFlash()
. pokud ano, můžete se také zbavit beforeFind
a vložte BETWEEN
podmínky pole s vašimi dalšími podmínkami.