2011-11-07 8 views
7
में एक फार्म के क्षेत्र के लिए एक त्रुटि के सहयोग से खो रहा हूँ

मेरे मान्यता लग रहा हैमैं Symfony2

Acme\UserBundle\Entity\User: 
    constraints: 
     - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:username, message: "Username already in use" } 
     - \Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: { fields:email, message: "Email address already in use" } 
    properties: 
     username: 
      - NotBlank: ~ 
      - MinLength: { limit: 2, message: "Your username must have at least {{ limit }} characters." } 
     email: 
      - Email: 
       message: The email "{{ value }}" is not a valid email. 
       checkMX: true 

की तरह मेरे नियंत्रक की तरह:

$form = $this->createForm(new RegistrationType()); 
$form->bindRequest($request); 
if ($form->isValid()) { 
    //... save to db 
}else{ 
    $errors = $form->getErrors(); 
    //... pass the errors back as json 
} 

मैं एक उपयोगकर्ता पंजीकरण नियंत्रक का निर्माण करने की कोशिश कर रहा हूँ यह AJAX अनुरोध के माध्यम से जमा किया गया है। हालांकि, जब सत्यापन में त्रुटियों ट्रिगर कर रहे हैं, $error चर लगता है: समस्या

[2011-11-07 19:19:44] app.INFO: array (
    0 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Email address already in use', 
    'messageParameters' => 
    array (
    ), 
)), 
    1 => 
    Symfony\Component\Form\FormError::__set_state(array(
    'messageTemplate' => 'Your username must have at least {{ limit }} characters.', 
    'messageParameters' => 
    array (
     '{{ value }}' => '1', 
     '{{ limit }}' => 2, 
    ), 
)), 
) [] [] 

मुझे नहीं पता कि जो क्षेत्र है कि त्रुटि से मेल खाती है है। क्या उस डेटा को खोजने का कोई तरीका है ताकि जब मैं जेसन प्रतिक्रिया भेजूं, तो मैं त्रुटि संदेश को संबंधित फ़ील्ड से जोड़ सकता हूं।

उत्तर

6

मुझे लगता है कि आप उदाहरण के लिए व्यक्तिगत रूप से प्रत्येक क्षेत्र को क्वेरी कर सकते हैं:

$errors['username'] = $form->get('username')->getErrors(); 
$errors['email'] = $form->get('email')->getErrors(); 

आप हालांकि चीजों को स्वचालित करने में सक्षम हो सकता है:

$form->get('username')->getErrors()

तो तुम इस तरह एक सरणी का निर्माण कर सकता है :

$fields = $form->getChildren(); 
foreach ($fields as $field) { 
    $errors[$field->getName()] = $field->getErrors(); 
} 

मुझे लगता है कि getName फ़ंक्शन को फ़ील्ड नाम वापस करना चाहिए जब फ़ॉर्म के बच्चों पर स्वयं को बुलाया जाता है। हालांकि किसी और के पास एक और अधिक कुशल तरीका हो सकता है ...

+0

'का उपयोग करते हुए' '$ फार्म> getErrors()' '' रिटर्न त्रुटियां, हालांकि '' '$ form-> प्राप्त करें ('उपयोगकर्ता नाम') -> getErrors()' '' एक ही डेटा सबमिट होने के बावजूद कोई त्रुटि नहीं देता है। ऐसा लगता है कि त्रुटियों को सामान्य रूप से प्रत्येक फ़ील्ड के बजाय सामान्य रूप से जोड़ा जाता है। – ed209

+0

क्या आपने कहीं भी त्रुटि_बबलिंग सक्षम की है? – Kasheen

+0

हां, उदाहरण के लिए '' '$ builder-> जोड़ें ('उपयोगकर्ता नाम', 'टेक्स्ट', सरणी ('error_bubbling' => सत्य));' ' – ed209

3

मुझे लगता है कि स्वीकृत उत्तर पहले ही पुराना है, अब getChildren() विधि नहीं है।

$errors = []; 
foreach ($form->all() as $field) { 
    if ($field->getErrors()->count() > 0) { 
     $fieldName = $field->getName(); 
     $errors[$fieldName] = []; 
     foreach ($field->getErrors() as $error) { 
      $errors[$fieldName][] = $error->getMessage(); 
     } 
    } 
} 

आखिरकार, अगर आप जो आप पूर्ण इनपुट फ़ील्ड नाम देना होगा उत्पन्न FormView से प्रपत्र फ़ील्ड्स का उपयोग करना चाहता था:

$errors = []; 
foreach ($form->createView()->children as $field) { 
    if ($field->vars['errors']->count() > 0) { 
     $fieldName = $field->vars['full_name']; 
     $errors[$fieldName] = []; 
     foreach ($field->vars['errors'] as $error) { 
      $errors[$fieldName][] = $error->getMessage(); 
     } 
    } 
}