2015-03-31 13 views
5

मैं अपने मॉडल में इस सत्यापन नियम का उपयोग करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं कर रहा है।वाईआई 2: शर्त पर सुरक्षित सत्यापनकर्ता

मेरा मतलब है कि यह हमेशा अन्य विकल्प चुनने पर भी सुरक्षित रहता है।

[['dhanwantri_bill_number'], 'safe', 
    'when' => function($model) { 
     return $model->bill_type =='d';     
    }, 
    'whenClient' => "function (attribute, value) { 
         return $('#opdtestbill-bill_type').val() == 'd'; 
        }" 
], 

क्या मैं कुछ गलत कर रहा हूं? इसे प्राप्त करने के लिए कोई वैकल्पिक समाधान है।

धन्यवाद।

bill_type के लिए नियम है की तरह

[['bill_type'], 'string', 'max' => 20], 
[['bill_type','test_name','date'], 'required'], 

संपादित सुरक्षित प्रति विशेषता दस्तावेज़ के रूप में जनता के गुण

$ जब - प्रतिदेय - एक PHP प्रतिदेय जिसका वापसी मान निर्धारित करता है कि क्या यह सत्यापनकर्ता चाहिए लागू होना। Yii \ सत्यापनकर्ताओं \ सत्यापनकर्ता

$ whenClient - स्ट्रिंग - एक JavaScript फ़ंक्शन का नाम जिसका वापसी मान निर्धारित करता है इस सत्यापनकर्ता ग्राहक पक्ष पर लागू किया जाना चाहिए या नहीं। Yii \ सत्यापनकर्ताओं \ सत्यापनकर्ता

+0

क्या आपके पास इस विशेषता के लिए कोई अन्य नियम हैं? – topher

+0

क्या आप वास्तव में 'सुरक्षित' सत्यापनकर्ता का उपयोग करना चाहते हैं? [डॉक्टर] (http://www.yiiframework.com/doc-2.0/yii-validators-safevalidator.html) कहते हैं कि _SafeValidator एक डमी सत्यापनकर्ता के रूप में कार्य करता है जिसका मुख्य उद्देश्य गुणों को भारी असाइनमेंट के लिए सुरक्षित रखने के लिए चिह्नित करना है ._ तो यदि बिल_टाइप 'डी' है तो आप dhanwantri_bill_number के असाइनमेंट को अस्वीकार करना चाहते हैं? – robsch

+0

@robsch - नहीं, यह बिल्कुल विपरीत है - यदि मैं 'dhanwantri_bill_number' बिल_टाइप 'डी' है और अन्य मामलों में अस्वीकार करता हूं तो मैं असाइनमेंट की अनुमति देना चाहता हूं। – Pawan

उत्तर

3

'सुरक्षित' सत्यापनकर्ता के रूप में सिर्फ एक विशेषता बताता है बड़े पैमाने पर काम द्वारा निर्धारित किया जा सकता है कि, दृष्टिकोण उचित नहीं है। यह सिर्फ इतना कहता है कि जब आप load() विधि का उपयोग करते हैं तो विशेषता का मूल्य प्राप्त हो सकता है। और यदि 'सुरक्षित' के रूप में चिह्नित नहीं किया गया है तो यह मान के साथ मूल्य निर्धारित करने से नहीं रोकता है $model->dhanwantri_bill_number = 'asdf'। तो यह एक उचित समाधान नहीं है।

अधिक सटीक: 'सुरक्षित' विशेषता का कोई प्रभाव नहीं पड़ता है जब $model->validate() (जिसे आमतौर पर $model->save() कहा जाता है) कहा जाता है। इसका उपयोग केवल तभी किया जाता है जब $model->load() कहा जाता है। यदि आप source code of the SafeValidatior कक्षा में देखते हैं तो आप देखते हैं कि इस सत्यापनकर्ता के साथ कुछ भी नहीं होता है। वैधकर्ता कुछ भी नहीं करता है। यह सिर्फ एक मार्कर है (आप इसकी तुलना करना चाहते हैं उदा। RequiredValidator)। और load() के साथ 'कब' अभिव्यक्ति का उपयोग नहीं किया जाता है। तो आप कह सकते हैं 'सुरक्षित' '0' के साथ काम नहीं करता है। जब नियम का मूल्यांकन किया जाता है तो सुरक्षित सत्यापनकर्ता का उपयोग किया जा सकता है लेकिन इसके validateAttribute() खाली है इसलिए उस समय में कुछ भी नहीं होता है।

आपके कोड में whenClient के अलावा यह समझ में नहीं आता है। यहाँ क्या होना चाहिए?

मुझे लगता है कि इसे महसूस करने के कई तरीके हैं। एक विचार नियंत्रक को लोड() द्वारा गुणों को सेट करने की अनुमति देना होगा, बल्कि उन्हें स्पष्ट रूप से सेट करना होगा और $model->dhanwantri_bill_number सेट किया जाना चाहिए या नहीं। या आप लोड() का उपयोग कर सकते हैं और फिर $model->bill_type सेट के अनुसार लोड होने के बाद विशेषता को वापस कर सकते हैं।

या आप अपने मॉडल में dhanwantri_bill_number के लिए एक सेटर विधि लागू कर सकते हैं और यदि विशेषता सेट हो या नहीं तो वहां चुनें। शायद परिदृश्य निर्भर है।

+0

जैसा सही है लेकिन दस्तावेज़' सुरक्षित सत्यापनकर्ता 'के साथ कहता है ये सार्वजनिक गुण 'कॉल करने योग्य' के रूप में उपलब्ध हैं - मैंने अपने प्रश्न में गुण जोड़े हैं। – Pawan

+0

तो 'सुरक्षित' 'कब' के साथ काम नहीं करता है, तो मुझे लगता है कि दस्तावेज़ों में जो उल्लेख किया गया है वह सही नहीं है? जैसा कि दस्तावेज़ में स्पष्ट रूप से उल्लेख किया गया है कि 'कब' 'सुरक्षित' – Pawan

+0

@Pawan हां, 'कब' के साथ उपलब्ध है। लेकिन सुरक्षित सत्यापनकर्ता का प्रभाव केवल लोड() पर होता है। और लोड पर मॉडल सिर्फ यह दिखता है कि कौन से गुण सत्यापन नियमों का हिस्सा हैं (सभी परिदृश्य विशेषताओं (वर्तमान परिदृश्य के) बिना किसी '!' उपसर्ग के)। यह उस चरण में 'कब' अभिव्यक्ति का मूल्यांकन नहीं करता है। ऐसा तब होता है जब मॉडल की वैध() विधि कहा जाता है। और यह देर से पहले से ही है। आईएमओ दस्तावेज़ में सुरक्षित वैलिडेटर वर्ग के साथ कमी है। – robsch

1

Yii2 डॉक से:

डिफ़ॉल्ट रूप से, एक सक्रिय विशेषता सुरक्षित माना जाता है और बड़े पैमाने पर सौंपा जा सकता है।यदि किसी विशेषता को बड़े पैमाने पर असाइन नहीं किया जाना चाहिए (इस प्रकार असुरक्षित माना जाता है), तो विस्मयादिबोधक वर्ण (उदा। '! रैंक') के साथ विशेषता को उपसर्ग करें।

अपनी समस्या को संभालने के लिए परिदृश्यों का उपयोग करने पर विचार करें। http://www.yiiframework.com/doc-2.0/guide-structure-models.html#scenarios

संबंधित मुद्दे