Si je vous suit correctement:
- L'utilisateur doit spécifier dates de début/fin pour trouver des requêtes générées à partir d'un formulaire
- Vous devez valider ces dates afin que, par exemple:
- date de fin après la date de début
date de fin
- pas des siècles loin de la date de début
- Vous voulez des erreurs de validation apparaissent en ligne dans le formulaire (même si ce n'est pas sauver)
Puisque vous voulez valider ces dates auxquelles ils seront plus difficiles à attraper quand ils sont nichés dans votre tableau de conditions. Je vous conseille d'essayer de les transmettre séparément et traiter ensuite avec eux plus tard:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
Vous devriez nous l'espérons être en mesure de gérer tout le reste dans le filtre beforeFind
:
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;
}
Je ne l'ai pas essayé d'utiliser Model::invalidate()
pendant une opération de recherche, donc cela pourrait même ne pas fonctionner. L'idée est que si le formulaire est créé en utilisant FormHelper
ces messages devraient le faire revenir à côté des champs de formulaire.
A défaut, vous devrez peut-être effectuer cette validation dans le contrôleur et utiliser Session::setFlash()
. Si c'est le cas, vous pouvez également vous débarrasser du beforeFind
et mettre le tableau d'état BETWEEN
avec vos autres conditions.