如果我正确地理解了你:
- 用户必须指定从表单生成的查找查询的开始/结束日期
- You need to validate these dates so that, for example:
- 结束日期晚于开始日期
- 结束日期距开始日期不远几个世纪
- 您希望验证错误在表单中内联显示(即使这不是保存)
由于您想要验证这些日期,因此当它们隐藏在条件数组中时将很难获取它们。我建议尝试单独传递这些,然后稍后处理它们:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
希望您能够处理其中的其他所有事情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;
}
我没有尝试过使用Model::invalidate()
在查找操作期间,所以这可能不起作用。这个想法是,如果表单是使用创建的FormHelper
这些消息应该返回到表单字段旁边。
如果失败,您可能需要在控制器中执行此验证并使用Session::setFlash()
。如果是这样,您还可以摆脱beforeFind
并把BETWEEN
条件数组与您的其他条件。