2011-02-24 11 views
6

मैं दो अलग-अलग संदर्भों में एक फॉर्म क्लास का उपयोग कर रहा हूं: दोनों एक नया रिकॉर्ड बनाने के लिए और उस रिकॉर्ड को संपादित करने के लिए भी। मैंने यह जांचने के लिए एक पोस्ट-सत्यापनकर्ता स्थापित किया है कि यूआरएल फ़ील्ड अद्वितीय है।sfValidatorDoctrineUnique एक अद्यतन/संपादन संदर्भ में

$this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
    new sfValidatorDoctrineUnique(array('model' => 'Page', 'column' => array('url')), array('invalid' => 'This URL already exists.')) 
))); 

जब मैं एक नया रिकॉर्ड बना रहा हूं तो सत्यापनकर्ता बहुत अच्छा काम करता है। हालांकि, मौजूदा रिकॉर्ड को संपादित करते समय, यह एक त्रुटि फेंकता है क्योंकि यह स्वयं को डुप्लिकेट के रूप में पहचानता है। दूसरे शब्दों में, यदि मैं रिकॉर्ड संपादित करता हूं लेकिन यूआरएल में कोई बदलाव नहीं करता है, तो यह एक डुप्लिकेट त्रुटि फेंकता है।

यह एक आम मुद्दा होना चाहिए, इसलिए मैं सोच रहा हूं कि इस से निपटने का सिम्फनी तरीका क्या होगा? मूल रूप से मैं इसे सहेजते समय स्वयं को अनदेखा करना चाहता हूं (कोई डुप्लिकेट मौजूद नहीं है) लेकिन फिर भी यह सुनिश्चित करने के लिए पोस्ट-वैलिडेटर चलाएं कि कोई वास्तविक डुप्लिकेट मौजूद न हो।

+0

टॉम, मुझे समाधान आप पाया बताएं, के रूप में मैं एक ही हो रहा है मुसीबत। धन्यवाद। – tipu

+1

मेरा समाधान मिला: sfValidatorDoctrineUnique के लिए पहला पैरामीटर होना चाहिए 'प्राथमिक_की' और मान तालिका की प्राथमिक कुंजी होना चाहिए। तो आपको यह सुनिश्चित करने की ज़रूरत है कि आपके पास अपने फॉर्म में कोई मान है जिसका नाम उस प्राथमिक कुंजी से मेल खाता है। इसलिए यदि आप एक मॉडल पेज संपादित कर रहे हैं जिसका आईडी i 3 है, तो आपको <इनपुट प्रकार = "छुपा" नाम = "आईडी" मान = "3"> की आवश्यकता है। आखिर में मैंने प्राथमिक रूप से प्राथमिक_की कॉलम को भी मेरे फॉर्म में रखा, इसलिए $ this-> सेट वैलिडेटर ('आईडी', नया एसएफ वैलिडेटरस्ट्रिंग (सरणी ('आवश्यक' => सत्य))। सब कुछ, 3 फाइलों में बदलाव नौकरी हो गई। – tipu

उत्तर

6

अद्यतन स्थिति वास्तव में sfValidatorDoctrineUnique द्वारा संभाली जाती है।

अपने मामले में यदि दिए गए यूआरएल के साथ ऑब्जेक्ट पहले से मौजूद है तो सत्यापनकर्ता जांच करेगा कि आप एक अपडेट ऑपरेशन कर रहे हैं या नहीं। चेक sfValidatorDoctrineUnique :: isUpdate() विधि के साथ बनाया गया है।

आपकी प्राथमिक कुंजी सबमिट किए गए मानों में होने की आवश्यकता है।

डिफ़ॉल्ट रूप से प्राथमिक कुंजी आत्मनिरीक्षण है। आप इसे * primary_key * विकल्प को वैधकर्ता को पास कर सकते हैं।

+0

धन्यवाद, ठीक वैसे ही लगता है जो मैं ढूंढ रहा हूं। क्या आप इसका उपयोग करने का एक त्वरित उदाहरण प्रदान कर पाएंगे? अच्छी तरह से प्रलेखित नहीं है, ऐसा लगता है। – Tom

+0

.... कोई चिंता नहीं, पता लगाया। शुरुआत में सोचा कि मुझे उस विधि को कॉल करने की आवश्यकता होगी। आपकी सहायता के लिए धन्यवाद. – Tom

+1

हाय क्यूबा, ​​ क्या आप कृपया बता सकते हैं कि sfValidatorDoctrineUnique :: isUpdate() या sfValidatorDoctrineUnique का उदाहरण प्राथमिक_की विकल्प –

4

अन्य उत्तर में बताया गया है, यह निम्न में से सुनिश्चित करने के लिए महत्वपूर्ण है:

  • अद्यतन वस्तु के लिए पी मूल्य प्रस्तुत प्रपत्र मूल्यों में मौजूद होना चाहिए।
  • sfValidatorDoctrineUnique सत्यापनकर्ता को सभी फ़ॉर्म के साथ सबमिट किए गए मानों से अवगत होना चाहिए।

आदेश यह पूरा करने के लिए, आप निम्न चरणों का पालन करना होगा:

class MyModelForm extends BaseMyModelForm 
{ 
    public function configure() 
    { 
    if(! $this->isNew()) 
    { 
     $this->widgetSchema['id'] = new sfWidgetFormInputHidden(); 
     $this->validatorSchema['id'] = new sfValidatorNumber(array(
      'required' => true 
     , 'min'  => 1 
    )); 
    } 

    ... 
    } 

    ... 
} 
    :

    1. एक छिपा इनपुट कि होता है (आमतौर पर) अपने वस्तु के लिए पी मूल्य जोड़े

    2. ध्यान दें कि यदि आप अपडेट कर रहे हैं तो यह अतिरिक्त इनपुट केवल जोड़ा जाना चाहिए।
       
  • ले जाएँ sfValidatorDoctrineUnique बाद सत्यापन चरण के लिए:

    class MyModelForm extends BaseMyModelForm 
    { 
        public function configure() 
        { 
        $this->widgetSchema['unique_column'] = new sfWidgetFormInputText(); 
        $this->validatorSchema['unique_column'] = new sfValidatorPass(); 
    
        ... 
    
        $this->mergePostValidator(new sfValidatorDoctrineUnique(array(
         'required' => true 
         , 'model' => 'MyModel' 
         , 'column' => 'unique_column' 
        ))); 
        } 
    
        ... 
    } 
    
    • आप $this->mergePostValidator() का उपयोग करने के बाद मान्यता चरण के लिए सत्यापनकर्ता जोड़ने की आवश्यकता होगी ताकि सभी सबमिट किए गए मान सत्यापनकर्ता को प्रदान किए जाते हैं।

    • ध्यान दें कि आपको अभी भी अद्वितीय कॉलम विजेट के लिए एक वैधकर्ता की आपूर्ति करने की आवश्यकता है, अन्यथा जब आप फ़ॉर्म सबमिट करते हैं तो आपको "अप्रत्याशित अतिरिक्त फॉर्म फ़ील्ड" त्रुटि मिल जाएगी।

  • सुनिश्चित करें कि आप वस्तु से गुजर रहे हैं अपने फार्म के निर्माता के लिए अद्यतन किया जा रहा:

    $this->form = new MyModelForm($this->getRoute()->getObject());