2012-07-07 15 views
13

मेरी सिद्धांत इकाई है, जो मेरी फार्म के लिए data_class है में मैं एक फ़ाइल संपत्ति इस तरह परिभाषित किया गया है:गैर खाली फ़ाइल इनपुट क्षेत्र

/** 
    * Image. 
    * 
    * @Assert\NotBlank 
    * @Assert\File 
    * @Assert\Image(minWidth="138", minHeight="96") 
    */ 
    protected $file; 

इसके अलावा, ->add('file', 'file') के साथ प्रकार के रूप में यह जोड़ा ...

निर्माण इकाई सही काम करती है, लेकिन समस्या तब होती है जब मैं इस इकाई को अद्यतन करने के लिए फॉर्म का उपयोग करता हूं। यह फ़ाइल को फिर से पूछता है, क्योंकि इसमें @Assert \ NotBlank है। चूंकि मेरे पास इस फॉर्म में अन्य फ़ील्ड हैं, इसलिए मैं प्रत्येक अपडेट पर छवि को फिर से अपलोड नहीं करना चाहता हूं।

जब मैं @Assert \ NotBlank को हटाता हूं, सदाबहार ठीक काम करता है, लेकिन मैं चाहता हूं कि यह फ़ाइल फ़ील्ड अनिवार्य हो।

कोई विचार?

उत्तर

7

आप इस स्थिति से बाहर दो तरीके हैं और दोनों Callback प्रमाणकों पर भरोसा करते हैं: (Symfony callback)

या तो आप इकाई जो कायम नहीं किया जाएगा और सत्यापनकर्ता जो आपरेशन प्रयास किया गया था बता देंगे करने के लिए boolean नामित isUpdate जोड़ें। इस विधि को उपरोक्त लिंक में पूरी तरह वर्णित किया गया है।

इससे निपटने का एक और तरीका है कॉलबैक सत्यापनकर्ता को सीधे अपने फॉर्म प्रकार में जोड़ना। फिर, कुछ isUpdate ध्वज की जरूरत जाएगा लेकिन उसके बाद फार्म प्रकार के भीतर इस समय (निर्माता के माध्यम से इसे पारित):

if ($this->isUpdate == false){ 
    $builder->addValidator(new CallbackValidator(function(FormInterface $form){ 
     if ($form['image_file']->getData() == NULL){ 
      $form->addError(new FormError('You need to specify image file.'));     
     } 
    })); 
} 

हो सकता है कि वहाँ वांछित मान्यता प्राप्त करने के लिए सरल तरीका है, लेकिन मैं वापस इन दोनों कुछ महीनों पर आया था।

आशा इस मदद करता है ...

+1

धन्यवाद, जिसने मुझे विचार दिए, निश्चित रूप से :) मुझे समझ में नहीं आता कि आपको किसी अन्य की आवश्यकता क्यों है, बूलियन अपडेट करें, और यह मान कैसे सेट किया जाता है? मैंने चेक किया 'अगर (शून्य! == $ यह-> getId()) '। आप मेरी जिस्ट https://gist.github.com/3066507 देख सकते हैं। यह सिम्फनी 2.0 में भी फैंसीर था जब आप सत्यापनकर्ता https://gist.github.com/3066488 के संदर्भ में पास कर सकते हैं। एक बार फिर धन्यवाद। – umpirsky

+0

ओह, अच्छा बिंदु। इकाई आईडी को शून्य के साथ तुलना करके आप निश्चित रूप से कह सकते हैं कि ऑपरेशन "एड" या "अपडेट" है या नहीं। और दूसरी जिंद मुझे लगता है कि एकदम सही समाधान है :) –

+0

हाँ, बहुत बुरा उन्होंने ExecutionContext को बंद कर दिया और कक्षा के बाहर से संपत्ति पथ सेट करना संभव नहीं है https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

तुम भी उस के लिए मान्यता समूह का उपयोग कर सकते हैं। एक सत्यापन समूह (शायद डिफ़ॉल्ट एक) अद्यतन के लिए और दूसरा के लिए होगा।

+0

स्वीकार्य उत्तर होना चाहिए IMO – Shady

+0

मुझे पता है कि यह वास्तव में पुराना है लेकिन क्या आप थोड़ा विस्तार कर सकते हैं? मैं इसके बारे में प्रलेखन को समझने के लिए संघर्ष कर रहा हूं, यह वास्तव में नोब-फ्रेंडली नहीं है। यदि आप इसे v3-compliant बना सकते हैं तो यह वास्तव में अच्छा होगा –