私があなたを正しくフォローしている場合:
- ユーザーは、フォームから生成された検索クエリの開始日/終了日を指定する必要があります
- 次のように、これらの日付を検証する必要があります。
- 開始日後の終了日
- 開始日から数世紀離れていない終了日
- 検証エラーをフォーム内にインラインで表示する必要があります(これは保存ではありませんが)
これらの日付を検証したいので、条件配列内に隠れていると、それらを取得するのが難しくなります。これらを個別に渡して、後で処理することをお勧めします:
$this->Model->find('all', array(
'conditions' => array(/* normal conditions here */),
'dateRange' => array(
'start' => /* start_date value */,
'end' => /* end_date value */,
),
));
うまくいけば、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;
}
Model::invalidate()
を使用したことはありません 検索操作中なので、これも機能しない可能性があります。フォームがFormHelper
を使用して作成されている場合の考え方 これらのメッセージは、フォームフィールドの横に戻るはずです。
それができない場合は、コントローラーでこの検証を実行し、Session::setFlash()
を使用する必要があります。 。その場合は、beforeFind
を削除することもできます BETWEEN
を配置します 条件配列を他の条件と組み合わせます。