अगर मैं आपका सही तरीके से अनुसरण कर रहा हूँ:
- प्रयोक्ता को प्रपत्र से उत्पन्न प्रश्नों को खोजने के लिए प्रारंभ/समाप्ति तिथियां निर्दिष्ट करनी होंगी
- आपको इन तिथियों को सत्यापित करने की आवश्यकता है ताकि, उदाहरण के लिए:
- आरंभ तिथि के बाद समाप्ति तिथि
- समाप्ति तिथि प्रारंभ तिथि से सदियों दूर नहीं है
- आप चाहते हैं कि सत्यापन त्रुटियां फ़ॉर्म के भीतर इनलाइन दिखाई दें (भले ही यह एक सेव न हो)
चूंकि आप इन तिथियों को मान्य करना चाहते हैं, इसलिए जब वे आपकी शर्तों के सरणी के अंदर टिक जाएंगे तो उन्हें पकड़ना मुश्किल होगा। मेरा सुझाव है कि इन्हें अलग से पास करने की कोशिश करें और फिर बाद में इनसे निपटें:
$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
डालें आपकी अन्य शर्तों के साथ कंडीशन ऐरे।