Jeśli prawidłowo Cię śledzę:
- Użytkownik musi określić daty rozpoczęcia/zakończenia wyszukiwania zapytań generowanych z formularza
- Musisz potwierdzić te daty, aby na przykład:
- data zakończenia po dacie rozpoczęcia
- data końcowa nie odbiegająca o wieki od daty rozpoczęcia
- Chcesz, aby błędy walidacji pojawiały się w tekście w formularzu (nawet jeśli nie jest to zapis)
Ponieważ chcesz zweryfikować te daty, będą one trudniejsze do uchwycenia, gdy zostaną schowane w tablicy warunków. Proponuję spróbować przekazać je osobno, a następnie zająć się nimi później:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Miejmy nadzieję, że powinieneś być w stanie obsłużyć wszystko inne w 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;
}
Nie próbowałem używać Model::invalidate()
podczas operacji wyszukiwania, więc może to nawet nie zadziałać. Chodzi o to, że jeśli formularz jest tworzony przy użyciu FormHelper
te wiadomości powinny wrócić obok pól formularza.
Jeśli to się nie powiedzie, być może będziesz musiał przeprowadzić tę walidację w kontrolerze i użyć Session::setFlash()
. jeśli tak, możesz również pozbyć się beforeFind
i umieść BETWEEN
tablica warunków z innymi warunkami.