2012-03-23 11 views
6

मैं एक password फॉर्म फील्ड (नहीं मैप किया गया पासवर्ड को User), एक परिवर्तन पासवर्ड के रूप में प्रयोग की जाने वाली दो अन्य (मैप किया गया) क्षेत्रों, first और last के साथ है।Symfony2 में फ्लाई पर वैधकर्ता कैसे जोड़ें?

मुझे फ्लाई पर वैधकर्ता जोड़ना होगा: यदि के लिए मान खाली है तो कोई सत्यापन होना चाहिए। अन्यथा एक नया MinLength और MaxLength मान्यताओं को जोड़ा जाना चाहिए।

यहाँ मैं अब तक क्या किया है है: दोहराया password क्षेत्र बनाने के लिए, एक CallbackValidator और return जोड़ने $form->getData()null है।

फिर, मैं न्यूनतम और अधिकतम लंबाई $ फ़ील्ड के लिए वैधकर्ता कैसे जोड़ सकता हूं?

$builder = $this->createFormBuilder($user); 

    $field = $builder->create('new_password', 'repeated', array(
      'type'   => 'password', 
      'first_name' => 'Password', 
      'second_name' => 'Confirm password', 
      'required'  => false, 
      'property_path' => false // Not mapped to the entity password 
     )); 

    // Add a callback validator the the password field 
    $field->addValidator(new Form\CallbackValidator(function($form) { 
     $data = $form->getData(); 

     if(is_null($data)) return; // Field is blank 

     // Here password is provided and match confirm, check min = 3 max = 10 

    })); 

    // Add fields to the form 
    $form = $builder 
     ->add('first', 'text', array('required' => false)) // Mapped 
     ->add('last', 'text', array('required' => false)) // Mapped 
     ->add($field)          // Not mapped 
     ->getForm(); 

उत्तर

9

ओह अच्छा, एक समाधान अपने आप में कुछ प्रयोगों के बाद पाया।

मैं इस सवाल एक के रूप में कुछ दिनों के एक बेहतर समाधान पोस्ट कर सकते हैं के लिए अनुत्तरित, जो वास्तव में हो सकता है वास्तव में, :) का स्वागत करते हैं

विशेष रूप से मैं new FormError हिस्सा redundat पाया छोड़ने के लिए जा रहा हूँ, पता नहीं है कि फॉर्म में त्रुटि जोड़ने का एक बेहतर तरीका है या नहीं। और ईमानदारी से, पता नहीं क्यों new Form\CallbackValidator काम करता है जबकि new CallbackValidator नहीं होगा।

तो, इस तरह के use बयान जोड़ना भूल नहीं है:

use Symfony\Component\Form as Form, // Mendatory 
    Symfony\Component\Form\FormInterface, 
    Symfony\Component\Validator\Constraints\MinLength, 
    Symfony\Component\Validator\Constraints\MinLengthValidator; 

और कॉलबैक है:

$validation = function(FormInterface $form) { 

    // If $data is null then the field was blank, do nothing more 
    if(is_null($data = $form->getData())) return; 

    // Create a new MinLengthValidator 
    $validator = new MinLengthValidator(); 

    // If $data is invalid against the MinLength constraint add the error 
    if(!$validator->isValid($data, new MinLength(array('limit' => 3)))) : 

     $template = $validator->getMessageTemplate(); // Default error msg 
     $parameters = $validator->getMessageParameters(); // Default parameters 

     // Add the error to the form (to the field "password") 
     $form->addError(new Form\FormError($template, $parameters)); 

    endif; 

}; 

ठीक है, और इस हिस्से मैं नहीं समझ सकता (क्यों है

$builder->get('password')->addValidator(new Form\CallbackValidator($validation)); 
+0

बस जोड़ें: Symfony \ घटक \ फार्म \ CallbackValidator का उपयोग करें; फॉर्म उपसर्ग ड्रॉप करने के लिए। PHP नेमस्पेस अच्छी तरह से काम करते हैं लेकिन वे जावा जैसे उन्मुख "पैकेज" नहीं हैं। उपयोग की जाने वाली प्रत्येक कक्षा के लिए केवल एक उपयोग कथन है। – Cerad

+3

दुर्भाग्य से, मुझे प्राप्त होता है: 'अपरिभाषित विधि सिम्फनी \ घटक \ फॉर्म \ फॉर्मबिल्डर :: addValidator' पर कॉल करें जब मैं '$ builder-> get ('password') -> addValidator (...)' – Athlan

5

: मैं Form साथ उपसर्ग के लिए) के लिए मजबूर कर रहा हूँ, लेकिन यह ठीक है सिम्फनी 2.3 के बाद सेको हटा दिया गया और पूरी तरह हटा दिया गया।

आप ऐसा कर सकते हैं POST_SUBMIT घटना सुनकर

$builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) { 
    $data = $event->getData(); 
    $form = $event->getForm(); 

    if (null === $data) { 
     return; 
    } 
    if ("Your logic here") { 
     $form->get('new_password')->addError(new FormError()); 
    } 
}); 
+0

पर उत्तर नहीं देता मूल quesion। ऐसा लगता है कि यह एक दूसरे के जवाब पर एक टिप्पणी के लिए एक टिप्पणी होना चाहिए। – DavidPostill

+0

वह करता है, क्योंकि मैंने कुछ परियोजनाओं को symfony2.5 संस्करण में माइग्रेट कर दिया है, एडवालिएटर अब का उपयोग नहीं कर रहा है, इसलिए $ builder-> addEventListener (FormEvents :: POST_BIND, फ़ंक्शन ($ ईवेंट) $ फ़ील्ड का अनस्टेड-> addValidator do नौकरी – ghaliano

+0

मूल प्रश्न symfony2 ** ** ** या 2 के लिए नहीं था।5 – DavidPostill

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